Faça você mesmo – 101

Algumas vezes as pessoas me perguntam como eu fiz para registrar meu domínio, onde hospedo o site, como fiz para criar o blog, se é difícil de manter, quanto custa, etc., etc., etc.

Vou dar início a um conjunto de posts para te ajudar desde como registrar um domínio (para chamar de seu), a criação de uma infraestrutura dedicada para hospedar um site wordpress com o mínimo de manutenção necessária, emails e mais algumas coisas que eu achar que sejam legais para dar aquela incrementada.

Para que fique bem,,, mas bem,,, claro: Em algum certo momento haverão custos que SÃO DE SUA INTEIRA RESPOSABILIDADE, não existe filantropia para alguns serviços (se eu achar algum de graça que faça a mesma coisa coloco o link)

Essa página deve funcionar como um índice para esse conteúdo.

Faça você mesmo – Registrando um Domínio

SQL na Caixinha

Que o SQL pode rodar em container já não é novidade tem um tempinho.

A facilidade que isso nos trás para testar recursos, novidades, configurações, bugs, etc. ajudou demais.

Só o trabalho de subir um SO, configurar todo o SO, atualizações do SO, baixar a instalação do SQL, todo o processo de instalação, atualização, configuração já cansa só de lembrar.

Tá certo que com a vantagem na nuvem podemos subir qualquer configuração a qualquer momento, só dependendo do limite do cartão de crédito, mas com o Docker, da pra fazer basicamente a mesma coisa sem precisar de uma conta em alguma nuvem, sem ter que ficar instalando um monte de binário com um monte de biblioteca, não se preocupando se está no patch certo do SO, etc.

Basicamente com duas linhas de comando você consegue “rodar” qualquer SQL Server do 17 até o 22 em qualquer cumulative update que houve nesse meio tempo.

Para começar, instale o Docker Desktop (https://www.docker.com/get-started/);

Após alguns restarts e atualizações você deve ter ele pronto no seu PC.

Agora, no Terminal, PowerShell, CMD digite o comando abaixo:

docker pull mcr.microsoft.com/mssql/server

Espere ele carregar algumas configurações

Em seguida vem a mágica com esse segundo comando:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=yourStrong(!)Password" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2022-latest

E pronto, basicamente só isso e você vai ter um SQL Server Developer Edition 2022 rodando no seu PC

Claro que tem seus detalhes, nessa configuração simples tudo o que acontece no docker fica dentro do docker, se você apagar o container todas as bases que você criou, registros, etc. serão apagadas, o backup também conta.

Por padrão ele não integra com autenticação windows.

Se você procurar nos serviços ele não aparece listado.

Basicamente para conectar é seu hostname e a porta 1433 com usuário SA e a senha digitada ali em cima.

Caso precise da lista de todas as releases que você pode subir com o Docker a lista encontra-se aqui (https://hub.docker.com/_/microsoft-mssql-server).

AWS – Redshift – Carregar dados S3

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:

https://docs.aws.amazon.com/pt_br/redshift/latest/dg/t_loading-tables-from-s3.html

para monitorar essa importação você pode usar o

https://docs.aws.amazon.com/redshift/latest/dg/r_STV_LOAD_STATE.html

AWS – Redshift – Lock e Block

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;

e para dar um kill no processo

select pg_terminate_backend(PID);

o resultado deve vir como “1”

No link abaixo tem mais informações:

https://aws.amazon.com/pt/premiumsupport/knowledge-center/prevent-locks-blocking-queries-redshift/

RFC 8482

Com as opções de serviço de nuvem “bombando” freneticamente para quase tudo que temos em TI, e outros serviços, fica fácil de escolher um serviço qualquer e simplesmente clicar em START e começar a usar.

Como bons profissionais, sabemos que por trás desse “START” roda uma imensidão de coisas para fazer esse simples deploy começar a funcionar, mas um recurso que é extremamente utilizado, ainda mais hoje, acaba ficando de lado porque é tão simples que alguns esquecem, o serviço de resolução de nomes, também conhecido como DNS.

Provavelmente 99% do que você usa tanto na internet quanto “em casa” é resolvido por nome, esse blog por exemplo, você chegou aqui pelo endereço de nome, não da pra acessá-lo por IP, seu serviço de email, um site qualquer, aquele endereço no listener do SQL, etc.

Mesmo sendo uma requisição simples em UDP na porta 53, essa requisição gera um trafego de internet, para cada vez que alguém consulta algum endereço, toda uma mágica tem que acontecer, basicamente é assim:

  • A requisição da aplicação é encaminhada para para o SO
  • Essa solicitação passa para o mini-driver de rede e procura no cache para saber se tem alguma coisa em cache para adiantar o serviço, caso não tenha ele…
  • pega a lista dos endereços de DNS cadastrados na interface
  • requisita ao DNS cadastrado a resolução de nome para o endereço solicitado
  • se os servidores cadastrados tiverem em cache o endereço ele devolve a ao requisitante caso não,,,
  • Vão para os ROOT´s cadastrados para iniciar a consulta pública,
  • tudo começa no “.” depois o sufixo que pode ser “com”, “net”, “br”, “ca”, etc…
  • Depois localiza o nome intermediário do domínio, que é o nome em si, e resolve o DNS master e slave
  • conecta no DNS master e slave e resolve o SOA
  • pergunta sobre o RR do endereço em questão e aí a resposta pode variar para um A, MX, AAA, TXT, CNAME, etc.
  • volta com o resultado para o servidor de DNS lá cadastrado na interface, faz o cache pelo TTL, e devolve a resolução do nome para a interface solicitante com o TTL do registro

Basicamente, porque é um pouco mais complexo que isso, esse é o processo feito para cada vez que é requisitada uma resolução de nome, tudo isso em UDP e o mais rápido possível.

E o que a RFC 8482 tem a ver com isso?

Por padrão, quando é feita uma consulta de DNS esse método é direto, um RR para um domínio e apenas isso, mas existe um método de consulta que é o ANY que significa basicamente um traga todas as informações disponíveis do domínio requisitado.

Essas “todas as informações” são compostas de:

  • Nomes do servidores DNS
  • serial
  • refresh da zona
  • retry
  • expiração
  • TTL da zona
  • email do responsável
  • nome do servidor de resposta primário
  • MX
  • text
  • e o IP de resposta para o root

Certo, mas qual o problema?

O volume trafegado é maior, o tempo de conexão com o DNS é maior e o volume de requisições pode afetar o desempenho na experiência, para dar time out de requisição de DNS o serviço pode demorar até 2 segundos para resolver o endereço, imagina isso para uma aplicação onde do total do tempo gasto 2 segundos foram apenas para resolver nome, onde ela vai ter que tentar novamente por houve time-out.

Existe um método de ataque que é o de amplificação de DNS, onde uma onda de requisição ANY sobrecarrega o serviço causando um DDoS e sem DNS sem aplicação.

Na ponta do lápis estamos falando em uma requisição direta requisitar alguma coisa em torno de 44 bytes, enquanto uma requisição ANY (pode variar) mas para uma média dica em 890 bytes.

Não parece muita coisa certo? agora imagina isso para um servidor de DNS respondendo para não apenas suas requisições mas para todos os domínios cadastrados nele, mais replicar para um secundário, mais atualizações vindas de aplicações.

Como evitar requisições ANY?

Basicamente, adicione um RR no DNS do tipo HINFO com alguma informação.

Ex. HINFO RFC8482

quem faz isso?

WikiPedia, CloudFront

AWS – EC2 com SQL

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.

Ocupação de disco fantasma

Quem nunca foi acionado ou recebeu um alerta de falta de espaço em disco e não fazia ideia de onde estava a ocupação do disco?

Existem várias formas de ocupar espaço no disco e dar dor de cabeça para o administrador Windows, nesse post vou comentar da que, no meu ponto de vista, é a mais chata o diretório do “System Volume Information”.

Quem é esse tal de “System Volume Information”?

  • Esse diretório contém informações sobre a indexação do disco
  • Informação de Quota NTFS
  • Dados do sistema de ponto de restauração e backup usando Windows Server Backup
  • Dados para backup usando algumas ferramentas de backup
  • Se você usa “Shadow copy” cada nova versão de VSS snapshot salva dados nesse diretório
  • etc.

Você não deveria se preocupar com os dados desse diretório, onde a ferramenta que está gerando os dados e versionamentos de arquivos nesse diretório deveriam limpar os dados e tocar a vida, mas como trabalhamos com TI e não necessariamente as ferramentas fazem o que deveriam fazer, vamos fazer o trabalho de identificar e limpar essa estrutura.

De uma forma visual, para saber se você está com problemas com esse diretório, recomento usar uma ferramenta como o “TreeFile Size”, “WizTree”, “DiskUsage”, etc.

Pelo “Windows Explorer” originalmente esse diretório não é exibido, você precisa alterar as configurações de exibição para mostrar arquivo e diretórios ocultos do sistema.

Quando tentar acessar vai receber erro de acesso negado mesmo você sendo o administrador do sistema.

Agora que você já sabe quem é esse diretório, já sabe que ele existe, já viu onde ele está, para calcular o espaço ocupado por ele você vai abrir o prompt de comando em modo administrador e vai digitar:

vssadmin list shadowstorage

Se tiver alguma coisa configurada com o ” System Volume Information” ele deve apresentar um resultado parecido com:

Legal, agora temos informações de quanto o espaço máximo pode ser alocado para os recursos e o quanto está realmente alocado.

Se o valor estiver com configuração “UNBOUNDED” quer dizer que o céu é o limite, ou o espaço total do disco, o que acabar primeiro…

Para exemplificar, vamos colocar o limite para a letra C: em 2GB

vssadmin resize shadowstorage /on=c: /for=c: /maxsize=2GB

Ele vai escrever que redimensionou o espaço para o serviço de shadow copy.

Você pode trocar o /maxsize=XGB para porcentagem também, ai fica /maxsize=10%

Se você cria backups de “system state” o windows também cria essa estrutura na letra C:, para apagar eles você pode rodar:

wbadmin delete systemstatebackup -keepversions:0

Isso deve ser o suficiente para limpar esses diretórios das suas unidades, agora entender por que eles estão sendo alimentados para evitar que isso ocorra novamente? corre atrás do pessoal de backup…

AWS – Redshift – Tráfego de dados

Imagine o seguinte cenário:

  • 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:

https://github.com/bigleka

AWS – Redshift – Usuário para leituras

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:

https://github.com/bigleka