A algum tempo atrás fiz um trabalho que teoricamente parecia simples, extrair dados de um banco transacional e mandar para um Redshift para análilse.
Claro que após bater cabeça alguns minutos entendi que imporar dados diretamente para o Redshift iria ser no mínimo conturbado e instável.
Fazendo uma análise das opções vi que a AWS disponibilizou um método muito parecido com o do SQL Server para importar arquivos diretamente para dentro do banco mas claro ao invés de fazer isso através de um servidor, é possível fazer isso através do S3.
A forma mais simples é basicamente:
copy tabela_destino
from 'S3://bucket/arquivo'
iam_role 'arn:aws:iam::01234567890:role/MinhaRegraDoRedshift'
Se o arquivo for muito grande e foi dividido ele tem que terminar com um numeral incremental 1 2 3 4 …
Se o arquivo for compactado, o comando de COPY tem que ser incrementado com GZIP.
Para mais informações tem esse link da AWS abaixo:
Por incrível que pareça o Redshift sofre com problemas de Lock e Block da mesma forma que um banco transacional qualquer.
Como qualquer post sobre nuvem, até o momento dessa publicação, o Redshift não tem uma interface que monitora Lock e Block, ela monitora conexões ativas, querys em execução mas não lock e block.
A query para monitorar o Redshift é a seguinte:
select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a
left join (select pid,relation,granted from pg_locks group by 1,2,3) b
on a.relation=b.relation and a.granted='f' and b.granted='t'
left join (select * from stv_tbl_perm where slice=0) c
on a.relation=c.id
left join pg_class d on a.relation=d.oid
where a.relation is not null;
Caso você contrate uma AMI com SQL e precise da mídia de instalação do SQL para qualquer atividade, na unidade C:\ existe um diretório chamado “SQLServerSetup” com os binários para a instalação do SQL Server.
Isso ajuda caso precise trocar o Collation da instância, adicionar feature, reinstalar usando uma instância, adicionar uma instância, etc..
A instalação padrão vem na instância default, collation SQL_Latin1_General_CP1_CI_AS, tempdb nas configurações NNF, sem IFI, basicamente uma instalação NNF.
Aí vem outra pergunta, por que pegar uma imagem da AWS com SQL? por que não usar um RDS?
Bom, a resposta disso é mais com você do que comigo, porque tudo vai depender da necessidade.
AMI – EC2 com SQL Instalado
As imagens da AWS com SQL instalado vem em diversos sabores, você escolhe o tamanho da máquina e o tipo de licenciamento STD ou ENT, eles tem developer mas se optar por esse developer você vai pagar um custo pela licença de uma aplicação que pode ser baixada gratuitamente, e ai o preço desse licenciamento do STD ou ENT vai depender do tamanho da máquina que você escolher, a vantagem fica justamente na questão de licenciamento, quem recolhe e paga para a Microsoft é a AWS, você é apenas uma empresa que está usando uma imagem já pré-instalada, então sem stress quando a licenciamento;
Toda a administração do ambiente e com você, eles só deixam o SQL instalado e o resto é o trabalho de casa, desde restaurar o banco até todas as rotinas de manutenção.
RDS
Basicamente o SQL como serviço
você não loga na máquina, não tem nenhum acesso a estrutura onde o SQL está instalado
você não é SA nem faz parte da role de Sysadmin
você é owner dos seus bancos
todas as rotinas de manutenção do SO e algumas do SQL são geridas pela AWS.
é uma administração meio a meio
Vou tratar da comparação entre uma AMI e um RDS em outro post.
Você usa o Redshift como DW ou DL para seus relatório e cargas de dados;
Vê uma possibilidade de facilitar sua vida e dar liberdade para o próprio cliente acessar esses dados e gerar relatórios da forma que ele achar mais legal com a ferramenta que ele quiser, etc.;
Mas lembra que a AWS cobra pela saída de dados;
Procura no portal da AWS e descobre que eles não tem uma monitoração específica de quem está saindo com dados, mas eles acertam a cobrança… incrível…
Mas você não quer abandonar a ideia e quer ganhar alguma grana com isso..
O que vou mostrar não é a solução perfeita, ela carece de algumas melhorias mas já é um norte para ajudar nessa ideia…
O Redshift é um PostgreSQL modificado, então muita query em tabelas de sistema do PG funciona direitinho no Redshift…
Para esse cenário, você pode criar um pacote de integration services e rodar a query abaixo contra o Redshift:
select
TRIM(q.DATABASE) AS DB,
TRIM(u.usename) as usename,
sum(bytes)/1024 as kbytes,
sum(packets) as packets,
date(b.starttime) as data
from
stl_bcast b
join stl_query q ON
b.query = q.query
AND b.userid = q.userid
join pg_user u
on u.usesysid = q.userid
where
packets>0
and b.starttime >= dateadd(day, -7, current_Date)
and datediff(seconds, b.starttime, b.endtime)>0
--and u.usename like 'usr%'
--and querytxt not like 'fetch%'
group by TRIM(q.DATABASE)
,u.usename
,date(b.starttime)
Essa query vai trazer a informação do volume em kb trafegado pela query executada.
Com isso, você consegue montar um report incremental e ratear o custo da saída de dados da AWS.
É 100%?, não,,, mas pelo menos já é alguma coisa já que a AWS não provê dados granularizados de quem consome a saída de dados.
novos códigos serão criados também em outro repositório:
O Redshift tem umas vantagens bem interessantes, baixo custo, RDS, baixa necessidade de manutenção.
No fundo ele é um PostgreSQL modificado para prover volume de dados e não ficar trabalhando como OLTP, ele é ótimo como estrutura para DW.
Imagine o seguinte cenário, você vende uma solução mas precisa prover um acesso do seu cliente para que ele consiga acessar uma parte dos dados diretamente na sua estrutura de banco, para ele “ter a liberdade” de cruzar esses dados, montar estruturas de relatórios, etc. da forma que ele achar mais interessante, ou até mesmo exportar esses dados para uma estrutura dele e usar da forma que achar melhor.
Certo, temos várias formas de fazer isso, todas tem seus prós e contras, mas nesse caso vou usar como exemplo justamente o título do post, vamos colocar os dados no Redshift.
Então, você tem alguma forma de extração de dados incrementais (SSIS, Pentaho, Informática, estagiário, etc.) que leva os dados do seu OLTP para o Redshift e isso funciona bem.
Agora você precisa criar a estrutura de permissões para liberar o acesso do seu cliente para essa estrutura de dados.
Uma coisa muito importante : Todos os usuários do Redshift são exclusivos do banco de dados e não da instância, Então caso o cliente tenha mais de um banco ou você queira dar permissão para mais de um banco, siga o processo quantas vezes for necessário.
— Normalmente quando os objetos são criados no Redshift ele ficam armazenados no schema public. — Isso não é um problema, o problema começa quando é criado um schema para armazenar um outro conjunto de objetos — para um setor da empresa, ou um outro departamento… — Quando isso acontece, o usuário owner da carga dos objetos tem acesso a essa estrutura de dados sem problema, mas novos usuários, — ou usuários permissonalizados não tem a permissão para os objetos ou para novos objetos nesse schema. — O script abaixo tente a sanar um cenário em que você quer liberar o acesso de select para os objetos e novo objetos em um schema pulic — ou personalizado sem ter que ficar dando grant toda a vez que novos objetos são criados. — Outra opção de uso é caso você tenha um Redshift na sua empresa e venda como serviço ele como datalake para algum cliente. — dessa forma você consegue liberar um usuário para que o cliente acesse a estrutura de dados e consiga baixar os dados.
-- Normalmente quando os objetos são criados no Redshift ele ficam armazenados no schema public.
-- Isso não é um problema, o problema começa quando é criado um schema para armazenar um outro conjunto de objetos
-- para um setor da empresa, ou um outro departamento...
-- Quando isso acontece, o usuário owner da carga dos objetos tem acesso a essa estrutura de dados sem problema, mas novos usuários,
-- ou usuários permissonalizados não tem a permissão para os objetos ou para novos objetos nesse schema.
-- O script abaixo tente a sanar um cenário em que você quer liberar o acesso de select para os objetos e novo objetos em um schema pulic
-- ou personalizado sem ter que ficar dando grant toda a vez que novos objetos são criados.
-- Outra opção de uso é caso você tenha um Redshift na sua empresa e venda como serviço ele como datalake para algum cliente.
-- dessa forma você consegue liberar um usuário para que o cliente acesse a estrutura de dados e consiga baixar os dados.
-- criar um usuário
create user <username> with password ‘<password>’;
-- cria um grupo para receber as permissões
create group data_viewers;
-- adiciona o usuário ao grupo
alter group data_viewers add user <username>;
-- nesse caso remove a opção de criar objetos para os usuários do grupo
revoke create on schema public from group data_viewers;
-- atribui acesso no schema public ao grupo
grant usage on schema public to group data_viewers;
-- atribui select em todas as tabelas do schema public para o grupo
grant select on all tables in schema public to group data_viewers;
-- atribui acesso a futuros objetos do schema public para o grupo
alter default privileges in schema public grant select on tables to group data_viewers
novos códigos serão criados também em outro repositório:
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.