SQL Magazine 13665676577592
SQL Magazine 13665676577592
Sumrio
[ Luciano Moreira ]
Feedback
eu
edio
ta
[ Rodrigo Salvo ]
sobre e
s
EXPEDIENTE
Editor
Rodrigo Oliveira Spnola ([email protected])
Subeditor
Eduardo Oliveira Spnola
Consultor Tcnico
Diogo Souza ([email protected])
Jornalista Responsvel
Kaline Dolabella - JP24185
Capa e Diagramao
Romulo Araujo
Distribuio
FC Comercial e Distribuidora S.A
Rua Teodoro da Silva, 907
Graja - RJ - 206563-900
Atendimento ao leitor
A DevMedia possui uma Central de Atendimento on-line, onde voc
pode tirar suas dvidas sobre servios, enviar crticas e sugestes e
falar com um de nossos atendentes. Atravs da nossa central tambm
possvel alterar dados cadastrais, consultar o status de assinaturas
e conferir a data de envio de suas revistas. Acesse www.devmedia.
com.br/central, ou se preferir entre em contato conosco atravs do
telefone 21 3382-5038.
Publicidade
[email protected] 21 3382-5038
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia,
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com
detalhes sobre preos e formatos de anncios.
Os projetos de software que utilizam a plataforma de desenvolvimento Java geralmente so compostos por diferentes componentes
externos, como bibliotecas, frameworks ou qualquer outro tipo de
dependncia. Deste modo, os processos de build se encarregam
tambm de checar se as dependncias esto corretas e atualizadas para que o processo no falhe. A propsito, um build que
falha, ou seja, no consegue realizar as tarefas necessrias para
ser classificado como um sucesso, representa uma importante
informao.
A definio de falha ou sucesso de um build especificada
por uma srie de diretrizes condicionais criadas pela equipe de
desenvolvimento e varia muito para cada projeto. Por exemplo,
comum encontrar regras do tipo: se o cdigo fonte no passar
em determinado nmero X de testes, o processo de build falha. O
modelo deste artigo considera apenas o resultado do build e tambm quais testes so associados a ele, sem detalhar o tipo de teste
(testes unitrios, testes de interface, testes de integrao, etc.).
Outro aspecto importante que deve ser considerado a quantidade de cdigo fonte novo ou modificado em relao ao ltimo
build. comum que este dado seja indicado pelos commits (o
cdigo fonte novo ou modificado enviado para um sistema de
controle de verso) realizados pelos desenvolvedores desde o
ltimo build. Tambm um dado importante a identificao dos
desenvolvedores que produziram os commits.
A realizao de um build automtico normalmente associada
a algum tipo de objetivo alcanado no projeto ou a uma etapa do
processo de desenvolvimento. Por exemplo, comum a gerao
de um build quando um Sprint finalizado, pois ao final deste
ciclo curto tradicional em processos de desenvolvimento gil,
geralmente necessrio distribuir ou disponibilizar o software
para os usurios finais.
Por fim, como todo software pronto ou em desenvolvimento
possui bugs, muito importante apresentar esta informao
sempre que uma nova verso do software produzida. Fornecer
as informaes de bugs junto com o processo de build til para
ajudar a acompanhar a evoluo da qualidade do software de
forma quantitativa e qualitativa, auxiliando assim a tomada de
decises que podem impactar o projeto.
Diversas outras informaes relacionadas ao processo de build
automtico podem ser inseridas como, por exemplo, resultado de
ferramentas de checagem esttica de cdigo (PMD, CheckStyle e
FindBugs), relatrio da documentao tcnica gerada, lista de requisitos e user stories atendidas pelo build, problemas encontrados
no projeto e at diagramas e documentos gerais. Contudo, para no
tornar o modelo demasiadamente complexo, este artigo contempla
apenas as informaes relacionadas ao cenrio descrito nos pargrafos anteriores. Fica como recomendao ao leitor customizar o
modelo de acordo com os dados relacionados ao seu processo de
build automtico, de modo a facilitar a visualizao, explorao
e descoberta de fatos relevantes a partir dos dados.
Novamente, o foco do artigo apenas no modelo de dados e no
em como realizar o processo de ETL que obtm as informaes de
diferentes fontes de dados (arquivos texto, cdigo fonte, resultado
Um processo de build automtico finalizado com sucesso normalmente gera uma nova verso do software. Este versionamento
associado com o tipo da verso (Debug, Release) e com o
tipo da edio (Trial, Free e Enterprise). As informaes de
verso e edio do software so relacionadas ao tipo do build e
tambm ao resultado, porm, neste artigo uma dimenso separada
chamada Versao armazenar os dados de tipo da verso e da edio. O motivo que tanto a edio quanto a verso normalmente
so representadas pelo nmero da verso quando o processo
de build finalizado e, desta forma, as pesquisas relacionadas
ao software final podem ser feitas consultando uma dimenso
especfica.
11
Figura 10. Tabela fato FT_BUILD sem os relacionamentos com as tabelas de dimenso
Note que a tabela fato FT_BUILD contm diversas colunas e relacionamentos. A primeira coluna importante chama-se ID_BUILD
e representa um valor numrico sequencial que o identificador
nico da tabela com a propriedade de chave primria. Em seguida
temos as colunas ID_TIPO_BUILD, ID_RESULTADO, ID_VERSAO,
ID_SPRINT, ID_PLATAFORMA e ID_DATA, que so chaves estrangeiras para as chaves primrias das tabelas DM_TIPO_BUILD,
DM_RESULTADO, DM_VERSAO, DM_SPRINT, DM_PLATAFORMA e DM_DATA, respectivamente.
Figura 11. Tabela fato FT_BUILD e seus relacionamentos com as demais tabelas de dimenso do modelo
a quantidade de linhas de cdigo cobertas
por testes no projeto.
As medidas geradas a partir da tabela
fato deste modelo de dados so descritas
a seguir. importante destacar que estas
medidas podem ser customizadas e combinadas para montar diferentes cubos de
dados que mostrem facetas especficas
do negcio dependendo do que se desejar
visualizar. Vejamos as medidas geradas:
TotalLinhasDeCodigo (coluna TOTAL_
LOC) indicar a quantidade total de linhas
de cdigo do projeto no momento do build.
Quando se agregar esta medida de acordo
com os filtros de dimenso, a ferramenta
deve somar os valores desta medida;
TempoGasto (coluna TOTAL_TEMPO)
indicar o tempo total utilizado para fazer
o build. Esta medida pode ser convertida
para horas, minutos e segundos para facilitar sua visualizao. Quando se agregar
esta medida, a ferramenta deve somar os
valores desta medida;
MdiaTempoGasto (coluna TOTAL_
TEMPO) indica em horas, minutos e
segundos o tempo mdio necessrio para
fazer o build. Quando se agregar esta
medida de acordo com os filtros de dimenso, a ferramenta deve fazer a mdia dos
valores desta medida;
TotalBugs (coluna TOTAL_QTD_BUGS)
indicar a quantidade total de bugs no
projeto no momento do build. Quando se
agregar esta medida, a ferramenta deve
somar os valores desta medida;
BugsCorrigidos (coluna QTD_BUGS_
CORRIGIDOS) indicar a quantidade de
bugs corrigidos desde o ltimo build.
Quando se agregar esta medida, a ferramenta deve somar os valores desta
medida;
TotalCommits (coluna TOTAL_QTD_
COMITS) indicar a quantidade total
de commits realizados desde o ltimo
build. Quando se agregar esta medida, a
ferramenta deve somar os valores desta
medida;
TotalPacotesJava (coluna TOTAL_QTD_
PACOTES) indicar a quantidade total de
pacotes analisados durante o build. Quando se agregar esta medida, a ferramenta
deve somar os valores desta medida;
TotalArquivosCodigoFonte (coluna
TOTAL_ QTD_ARQUIVOS) indicar a
13
Autor
Mauro Pichiliani
[email protected] / @pichiliani
bacharel em Cincia da Computao, mestre e doutorando
pelo ITA (Instituto Tecnolgico de Aeronutica) e MCP, MCDBA
e MCTS. Trabalha h mais de 10 anos utilizando diversos bancos de dados
SQL e NoSQL. colunista de SQL Server do web site iMasters (http://www.
imasters.com.br) e mantenedor do DatabaseCast (@databasecast), o podcast brasileiro
sobre banco de dados.
Links:
Ferramenta de build Maven
https://maven.apache.org/
Ferramenta de build Gradle
http://gradle.org/
Framework para testes em Java JUnit
http://junit.org/
Ferramenta PMD para gerao de mtricas de cdigo
https://pmd.github.io/
Ferramenta CheckStyle para verificao de estilo de codificao
http://checkstyle.sourceforge.net/
Ferramenta FindBugs para identificao automtica de bugs
http://findbugs.sourceforge.net/
Ferramenta Bugzilla para controle de bugs
https://www.bugzilla.org/
15
Manipulao de
arquivos de dados e log
no SQL Server
Aprenda neste artigo como dimensionar e alocar
os arquivos de dados e de log transaction
s arquivos de dados do SQL Server so compostos por dois tipos: de dados e de log transaction.
Nos arquivos de dados geralmente so armazenados objetos do banco como tabelas, procedures,
triggers e ndices, assim como registros de clientes. J
nos arquivos de log so registradas todas as alteraes
ocorridas no banco para que ele possa ser recuperado
em caso de desastres do tipo perda de disco, falha em
um dos arquivos de dados, etc. Os arquivos de dados e
de log so divididos da seguinte maneira:
Arquivos de dados primrio, com a extenso .mdf;
Arquivos de dados secundrios, com a extenso .ndf;
Arquivos de log, com a extenso .ldf.
Esses arquivos possuem suas particularidades e funes dentro do banco de dados e a perda de um desses
arquivos pode significar a perda de parte das informaes contidas no banco de dados, ou mesmo a perda de
todo o banco. No caso da perda de um dos arquivos, o
procedimento mais indicado a restaurao do banco de
dados, mas voc deve ter o cuidado de executar rotinas
de backup periodicamente.
Os arquivos .mdf so os primeiros a serem criados
quando voc executa o comando CREATE DATABASE.
O arquivo mdf sempre far parte do filegroup primary.
Dentro dele estaro armazenadas informaes sobre
tabelas, views, tabelas de sistema e metadados. Alm disso, podem ser localizados procedures, ndices, registos
e usurios. Para o armazenamento de tabelas e ndices
de usurios, no entanto, recomendamos trabalhar com
arquivos de dados secundrios.
Os arquivos .ndf armazenam dados secundrios,
opcionais no banco de dados. Eles podem ser montados
tanto durante o planejamento do banco de dados ou posteriormente, aps a concluso do banco. A principal funo destes arquivos
aumentar a capacidade de armazenamento da base e manter uma
rea separada dos arquivos *.mdf, onde sero gravadas tabelas de
sistema e metadados. Como j mencionado, aconselhado utilizar
arquivos secundrios para armazenar dados dos usurios.
Caso voc no tenha o hbito de trabalhar com estes arquivos
e acha que a melhor forma armazenar os dados com arquivos
primrios, sugerimos que voc pense a respeito e trabalhe com
arquivos secundrios. Desta forma, voc pode aumentar a capacidades de armazenamento da base e ao mesmo tempo melhor
organizar os objetos e registros especficos de usurios.
O terceiro conjunto so os arquivos de Log Transaction, que
possuem a extenso .ldf. Este tipo de arquivo responsvel pela
recuperao do banco de dados em caso de falhas, sendo utilizado
em operaes de log shipping, possibilitando a recuperao da
base em caso de desastres (falha fsica de discos ou estrutura de
arquivos). Os arquivos de log armazenam todas as mudanas
realizadas no banco, permitindo a recuperao de instrues
quando estas no surtem o efeito esperado pelo programador.
atravs dos arquivos de log que o SQL Server mantm a integridade dos dados.
Abordaremos neste artigo de que forma voc pode alocar os
arquivos de dados e log transaction, assim como saber a diferena
entre eles. Arquivos de dados tm por objetivo o armazenamento
de registros, objetos (procedures, ndices, views) e a estrutura de
tabelas, tanto de clientes quanto do sistema do SQL Server. J os
arquivos de Log Transaction tm por objetivo armazenar todas
as mudanas que so realizadas no banco (Insert, Update, Delete).
Abordaremos aqui os tipos de volume de disco mais adequados
ao tipo de arquivos que se est manipulando. Para os arquivos de
dados, recomenda-se dar preferncia a unidades onde a leitura
tenha uma tima performance, enquanto para arquivos de log,
recomenda-se o uso de unidades onde a gravao tenha melhor
performance. Apesar das diferenas, ambos os arquivos necessitam de unidades de disco com redundncia a falhas.
RAID 5: o RAID 5 combina o desempenho necessrio e a redundncia a falhas, viabilizando excelente desempenho para a
escrita e bom desempenho para a leitura. No entanto, caso uma
das unidades falhe, o desempenho leitura ficar prejudicado,
causando gargalos em instrues select, por exemplo. Mesmo
assim, convm utilizar esse tipo de RAID para armazenar tanto
arquivos de dados quanto arquivos de log;
RAID 0+1 ou 10: o RAID 0+1 ou RAID 10 junta a velocidade do
RAID 0 (striping) com a redundncia a falhas do RAID 1 (mirror).
Neste tipo de partio as leituras ganham um timo desempenho
e atualmente a melhor opo para armazenamento de arquivos
para banco de dados, independentemente de este ser o SQL Server,
o Oracle ou o MySQL. Este tipo de RAID necessita de no mnimo
quatro discos. Ademais, a Microsoft recomenda fortemente que
os arquivos do banco, principalmente os arquivos de log, sejam
alocados nesta partio.
17
ou pela porcentagem. Neste exemplo estamos realizando as configuraes referentes ao arquivo SQL_Teste_02, como podemos
ver no ttulo da janela.
Vamos explicar agora as opes desta janela. Posteriormente mostraremos como aplicar estas opes e como voc pode
configur-las para obter benefcios na administrao do banco
de dados. Vejamos as opes:
Enable Autogrowth: ao habilitar esta opo, poderemos definir,
em MB ou porcentagem, de quanto em quanto os arquivos de
dados devem crescer quando alcanar seu limite;
In_Percent: se por acaso o arquivo possuir 500MB, ele ir crescer
10% sobre tamanho de 500MB. Desta forma, ele ir crescer mais 50MB,
supondo que o valor de In_Percent esteja configurado para 10%;
GO
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
In_Megabytes: o arquivo ir crescer mediante o valor informado na opo In_Megabytes. Por exemplo, quando um arquivo de
500MB alcanar o espao total, o mesmo ir crescer mais 100MB,
se In_Megabytes receber o valor 100;
Maximum File Size: local onde definido o limite de crescimento de um arquivo de dados. Nesta opo podemos limitar o
crescimento do arquivo ou podemos deixar o mesmo crescer at
a capacidade mxima do disco rgido;
- Limited to (MB): limita o tamanho mximo de um arquivo
de dados. Desta forma voc evita que um arquivo de dados
ocupe todo o espao de um disco e comprometa outros bancos
que possuam arquivos de dados nesta unidade;
- Unlimited: com esta opo ativa voc est liberando o
crescimento do arquivo de dados. Assim, enquanto houver
espao na unidade de onde se encontra o arquivo, o mesmo ir
crescer. Essa prtica no recomendada para a configurao
de arquivos de dados.
19
Autor
Robson Moraes
[email protected]
Experincia de 19 anos na rea de informtica tendo passado
por reas como analise de suporte gerente de configuraes de
sistemas administrador de conta e a quatro anos como administrador
de banco de dados focado em SQL Server mas tendo experincia com
Oracle e MySQL.
21
Dominando os ndices
columnstore
Melhore o desempenho de suas consultas no SQL
Server
estruturas de ndices j existentes no SQL Server (ndices clusterizados e no clusterizados). Estas opes continuam sendo importantes para o planejamento de um banco de dados que garanta
integridade e bom desempenho em suas consultas.
Os ndices colunares devem ser introduzidos nas arquiteturas
atuais de bancos de dados que utilizam o SQL Server como incremento s estruturas e padres de projeto j existentes. Portanto,
antes de comear a implementar este novo recurso, como em qualquer outro tipo de trabalho, necessria uma anlise detalhada
sobre os possveis ganhos de sua aplicao.
Vale ressaltar ainda que os ndices devem ser visualizados
como parte de uma estratgia para melhorar o desempenho das
aplicaes. Sendo assim, quando se deseja tratar o problema
otimizao de ambientes de banco de dados, deve-se levar em
considerao tambm atividades como resizing e melhoria de
processos.
23
As estatsticas de I/O e de tempo do SQL Server foram habilitadas para efetuar os testes de desempenho do ndice columnstore
(linhas 14 a 18 da Listagem 2).
Para efetuar o teste foi construda a consulta da Listagem 3.
Nesta consulta foram utilizadas algumas funes de agregao:
a soma de UnitPrice, a mdia de UnitPrice e a soma de TaxAmt. Por
fim, os dados foram agrupados por SalesTerritoryCountry.
25
Figura 5. Comparativo das estatsticas de execuo antes e depois da criao do columnstore index
Autor
Weslley Moura
[email protected]
Graduado em sistemas de informao pela FIAP, possui especializao em Business Intelligence pela mesma instituio e
est concluindo seu mestrado em engenharia de software pelo IPT. Atualmente ocupa seu tempo com projetos de analytics e desenvolvimento
de software nas empresas Rede, Pepsoft Sistemas e FITO.
Autor
Emerson Silva
[email protected]
Graduado em cincia da computao pelo Centro Universitrio
Adventista de So Paulo. Atualmente ocupa o seu tempo com
projetos de BI e infraestrutura em uma multinacional americana.
27
O Database Mail
O Database Mail uma soluo para envio de mensagens do
mecanismo de banco de dados do SQL Server. Por padro, o recurso vem desativado e possvel ativ-lo por meio do assistente
de configurao. Sua configurao simples, baseada apenas em
um perfil associado a uma conta SMTP.
H configuraes adicionais de parmetros do sistema em que
se restringe o tipo de arquivo (extenso) anexado nas mensagens
ou o seu tamanho, por exemplo.
O script T-SQL
Nesta alternativa de monitoramento, a
lgica da anlise realizada de forma automtica est no script T-SQL. Portanto, para
que a verificao seja consistente, necessrio ter em mente o que ser analisado e
como ser apresentada a informao.
A partir do SQL Server 2005, informaes
relacionadas sade da instncia e seus
objetos so encontradas nas DMVs e DMFs
(vises e funes de gerenciamento dinmico). Atravs das DMVs/DMFs podemos
coletar e cruzar dados importantes da
utilizao do ambiente. Com esses dados
coletados possvel determinar dentro da
lgica do script T-SQL um threshold (margem/limite) que, aps ser ultrapassado ou
se estiver abaixo do esperado, o DBA deve
dar ateno.
possvel realizar anlises diversas
que podem ser formatadas em HTML e
enviadas por e-mail, como fragmentao
de ndices, query mais lentas ou utilizadas, waits, ocupao dos datafiles, entre
muitas outras.
No exemplo proposto nesse artigo, o
script T-SQL verifica o espao total, livre
e o percentual livre calculado para cada
unidade de disco que aloca arquivos dos
bancos de dados. Para facilitar a visualizao do que o script faz, o ideal dividi-lo
em partes. Por exemplo: a consulta das
informaes requeridas, o tratamento das
informaes dentro do HTML e o envio do
relatrio atravs da chamada da procedure
msdb.dbo.sp_send_dbmail.
O SQL Agent
O SQL Agent o servio responsvel por
executar jobs agendados. Os componentes
deste servio podem ser classificados em:
jobs, steps, schedules e alerts. Cada job
criado contm um ou mais steps e cada
step sua prpria instruo.
Cada step tambm poder ter um tipo
diferente de instruo como, por exemplo:
um script T-SQL, um script PowerShell
ou um pacote do Integration Services. Vai
depender de cada finalidade. Alm disso,
pode ser definido um usurio para executar cada step, um arquivo de log de sada
e o comportamento em caso de sucesso ou
falha na execuo.
Nos schedules temos os tipos: quando o
servio do SQL Agent for iniciado, quando
a CPU estiver ociosa, execuo recorrente
29
Finalmente, ocorre a chamada da procedure sp_send_dbmail, contida na msdb, cujos parmetros bsicos neste exemplo so: o nome
do perfil configurado no Database Mail (varivel @profile_name),
os destinatrios (varivel @recipients), o corpo (varivel @body)
que foi formatado dentro da @tableHTML, o assunto (varivel
@subject) que contm a funo @Servername para retornar o
nome do servidor no ttulo do e-mail e a definio do formato
HTML no corpo do e-mail (varivel @body_format).
A partir desse script podemos criar um procedimento armazenado (stored procedure), o que torna os parmetros mais prticos
de serem alterados. Na sequncia foi criada, dentro do banco de
sistema mster, a procedure sp_monitora_disco, em que temos
os seguintes parmetros: a varivel @to receber o e-mail do
destinatrio, a varivel @subject ser responsvel pelo assunto
da mensagem e a @PercentFree assumir o percentual livre do
disco. Note que agora teremos na montagem do HTML dentro da
varivel @tableHTML a @PercentFree e no valores fixos para
comparar com a coluna PercentFree. Veja nas Listagens 3 a 5 o
cdigo da procedure e como execut-la.
Listagem 3. Procedure sp_monitora_disco Parte 1.
USE [master]
GO
CREATE PROCEDURE [dbo].[sp_monitora_disco]
@to varchar(200),
@subject varchar(100),
@PercentFree int
AS
SET NOCOUNT ON
-- Cria a tabela temporria #Drives
IF EXISTS ( SELECT name
FROM tempdb.sys.tables
WHERE name LIKE #Drives% )
DROP TABLE #Drives
CREATE TABLE #Drives
(
Drive CHAR(3) PRIMARY KEY ,
FreeSpace INT NULL ,
TotalSize INT NULL ,
[PercentFree] AS ( CONVERT(FLOAT, FreeSpace) / TotalSize ) * 100
)
-- Insere as informaes na tabela temporria consultando a DMF
-- sys.dm_os_volume_stats (apenas dos discos que esto armazenando datafiles)
INSERT #Drives
( Drive ,
FreeSpace ,
TotalSize
)
SELECT DISTINCT
dovs.volume_mount_point ,
CONVERT(INT, dovs.available_bytes / 1048576.0) ,
CONVERT(INT, dovs.total_bytes / 1048576.0)
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) dovs
ORDER BY dovs.volume_mount_point ASC
-- Variveis para envio de e-mail
DECLARE @tableHTML NVARCHAR(MAX)
31
Outras anlises
33
- sys.dm_exec_query_plan;
- sys.dm_exec_sql_text;
- sys.dm_exec_query_stats.
Relacionadas a ndices:
- sys.dm_db_index_physical_stats;
- sys.dm_db_index_usage_stats.
Relacionadas ao sistema operacional:
- sys.dm_os_performance_counters;
- sys.dm_os_schedulers;
- sys.dm_os_nodes;
- sys.dm_os_waiting_tasks;
- sys.dm_os_wait_stats.
Relacionadas a I/O (Entrada e sada em disco):
- sys.dm_io_virtual_file_stats.
Autor
Jonatas dos Anjos
[email protected]
Profissional de TI h 10 anos, sendo quatro como DBA SQL
Server. Domnio e interesse em boas prticas de administrao,
monitoramento e recursos de alta disponibilidade do SQL Server. Graduado em Tecnologia de Banco de Dados pela FIAP e Microsoft Certified
Professional (MCP).
Links:
Database Mail
https://msdn.microsoft.com/pt-br/library/Hh245116(v=sql.110).aspx
DMF sys.dm_os_volume_stats
https://technet.microsoft.com/pt-br/library/hh223223(v=sql.105).aspx
Procedure sp_send_dbmail
https://msdn.microsoft.com/pt-br/library/ms190307(v=sql.110).aspx
Disk Space Monitoring: How To
http://sqlmag.com/blog/disk-space-monitoring-how
35
Paralelismo no
SQL Server
Entendendo como o SQL Server trabalha com
planos paralelos
Esse plano de execuo tem um custo total de 150.456 e como sada gerada pelo comando SET STATISTICS TIME ON, temos:
SQL Server Execution Times CPU time
= 4130 ms, elapsed time = 4139 ms. Isto
, o SQL Server executou toda a consulta
em pouco mais de quatro segundos, utilizando praticamente o mesmo tempo de
processamento (tempo efetivo de uso dos
ciclos da CPU) para executar os operadores
definidos no plano de execuo.
Ao executar a mesma consulta removendo a hint MAXDOP 1, damos liberdade
para que o SQL Server considere o paralelismo ao determinar qual ser o plano
de execuo para esta consulta. Como resultado da consulta da Listagem 2, temos
um plano com operadores que permitem
a execuo paralela, marcados por um
crculo laranja com duas setas, como pode
ser verificado na Figura 2.
Listagem 2. Consulta simples, com paralelismo.
USE AdventureWorks2012
GO
SET STATISTICS TIME ON;
SELECT COUNT(*) FROM dbo.bigTransactionHistory;
GO
ao SQL Server fazer a soma dos oito registros produzidos utilizando o operador
stream aggregate no paralelo (novamente
o compute scalar irrelevante). Esta diviso
de trabalho entre os operadores ilustrada
pela Figura 3, que mostra parte do fluxo
de dados manipulada pelos quatro primeiros operadores do plano de execuo
paralelo.
Esse plano de execuo tem um custo
total de 110.623, um custo menor que o
plano serial, e como sada gerada pelo comando SET STATISTICS TIME ON, temos:
SQL Server Execution Times CPU time =
8374 ms, elapsed time = 1445 ms. Isto , o
SQL Server executou toda a consulta em
menos de um segundo e meio, menos da
metade do tempo original. Porm, o tempo
de processamento foi maior, o dobro do
plano serial. Em outras palavras, gasta-se
mais recursos para executar a consulta em
menos tempo.
A partir da prxima seo vamos analisar em mais detalhes como o otimizador
de consultas do SQL Server considera a
37
dos scripts e notar que podem haver variaes no intervalo do predicado (clusula
WHERE) para reproduzir o exemplo em
diferentes mquinas.
Ao executar as duas primeiras consultas da Listagem 3 e capturar os planos
de execuo, vemos que o primeiro tem
um custo muito baixo (0,0206037), pois o
filtro somente retorna os pedidos feitos
para produtos com ID entre 1001 e 1010.
Deste modo, o SQL Server est longe de
considerar o paralelismo para esta consulta (veja a Figura 4). J o segundo plano
(veja a Figura 5) mostra que o custo da
consulta de exatamente 4,99998, isto ,
foi gerado um plano no limite de custo
para o SQL Server comear a considerar
planos paralelos.
Esse aumento significativo no custo se
deve quantidade de registros retornados
pelo operador de index seek. Na primeira
consulta o fluxo de dados entre o index
seek e o stream aggregate de 4235 registros, enquanto na segunda operao o
volume entre os operadores de 1.038.862
registros. Um aspecto interessante a ser
observado que o custo dos operadores se
mantm proporcional entre os dois planos,
pois independentemente da quantidade de
registros, cada operador ter que processar mais ou menos registros, mantendo a
proporo dentro do plano.
Ao executar a prxima consulta com
um conjunto de dados um pouco maior,
agora incluindo o ProductId de valor 2835
e fazendo com que o index scan retorne
1.039.935 registros, o SQL Server passa a
utilizar um plano de execuo paralelo.
Isso se deve ao fato de todos os possveis
planos de execuo no paralelos gerados
pelo SQL Server, at determinado momento do processo de otimizao, terem ficado
com um custo superior a 5 (configurao
do custo limite para o paralelismo), o que
fez com que o processo de otimizao
continuasse a procurar novos planos, s
que a partir de agora considerando o uso
de operadores paralelos.
No final do processo de otimizao, o
SQL Server gerou um plano paralelo com
custo de 3,7631 (vide Figura 6, editada para
facilitar a visualizao), um valor menor
do que o limite de 5, mesmo que mais
39
Fica evidente que muito mais simples conseguir ver o otimizador de consultas produzindo planos paralelos quando o volume
de dados aumenta, afinal o esforo computacional para executar
a consulta ser maior. Especificamente no nosso caso, os planos
passaram a ser paralelos para as consultas que manipularam um
pouco mais de 1 milho de registros, mas no correto pensar em
um nmero de registros a partir do qual o SQL Server sempre ir
trabalhar com paralelismo, pois essa quantidade varia de acordo
com o esquema das tabelas envolvidas, complexidade da consulta,
entre outros fatores.
Em nenhum momento foi citado qual a unidade do custo dos
planos de execuo, e o motivo para isso que no existe tal unidade. Muitos anos atrs o time de produto do SQL Server compilou
um modelo de custo e nessa poca o custo se dava em segundos,
porm, com o advento de recursos computacionais mais rpidos
(CPU, memria, I/O, etc.), uma execuo que no passado levava
um minuto, hoje pode levar segundos. Esse comportamento,
-- Consulta 02
SELECT ProductID, COUNT(TransactionID), SUM(Quantity), SUM(ActualCost)
FROM dbo.bigTransactionHistory
WHERE ProductID BETWEEN 1001 and 2835
GROUP BY ProductID
OPTION (MAXDOP 2)
GO
-- Consulta 03
SELECT ProductID, COUNT(TransactionID), SUM(Quantity), SUM(ActualCost)
FROM dbo.bigTransactionHistory
WHERE ProductID BETWEEN 1001 and 2835
GROUP BY ProductID
OPTION (MAXDOP 4)
GO
-- Consulta 04
SELECT ProductID, COUNT(TransactionID), SUM(Quantity), SUM(ActualCost)
FROM dbo.bigTransactionHistory
WHERE ProductID BETWEEN 1001 and 2835
GROUP BY ProductID
OPTION (MAXDOP 8)
GO
41
Autor
Luciano Moreira [Luti]
[email protected]
http://luticm.blogspot.com
Arquiteto de Dados na Sr. Nimbus. Especialista e MVP em
SQL Server, vem buscando nos ltimos anos desbravar o vasto universo
dos dados, explorando diferentes solues arquiteturais e engines de
bancos de dados. Divide seu tempo como profissional entre consultorias, treinamentos
e participao na comunidade tcnica, ajudando empresas a projetar solues, capacitar
equipes e resolver problemas que envolvem bancos de dados.
Saiba mais sobre ele: http://www.srnimbus.com.br/luciano-moreira/.
Links:
[1] The Free Lunch Is Over - A Fundamental Turn Toward Concurrency in
Software
http://www.gotw.ca/publications/concurrency-ddj.htm
[2] Microsoft Sample Databases
http://msftdbprodsamples.codeplex.com/
[3] Make Big AdventureWorks
http://sqlblog.com/blogs/adam_machanic/archive/2011/10/17/thinking-big-adventure.aspx
[4] Recomendaes e diretrizes para a opo de configurao de grau mximo
de paralelismo do SQL Server
https://support.microsoft.com/pt-br/kb/2806535
[5] A new platform layer in SQL Server 2005 to exploit new hardware capabilities
and their trends
http://blogs.msdn.com/b/slavao/archive/2005/07/20/441058.aspx
[6] Understanding Non-uniform Memory Access
https://technet.microsoft.com/en-us/library/ms178144(v=sql.105).aspx
43
Trabalhando com o
MemSQL
Conhea esta opo de banco de dados em
memria de alta performance
Caractersticas
Atualmente existem diversas solues nesse padro de banco de
dados. Muitas utilizam formas hbridas, outras somente memrias
RAM. Algumas trabalham com NoSQL, outras com dados relacionais. Quando falamos em banco de dados em memria surge
sempre a questo da durabilidade dos dados, uma das caractersticas do modelo ACID. Visto que o tipo de memria utilizado
voltil, como manter esses dados de forma permanente sem que
os mesmos sejam perdidos durante uma falha de sistema?
Atualmente muitos destes bancos de dados possuem solues
para esse tipo de problema como, por exemplo, estados de replicaes dos dados atravs de cluster e commits temporrios dos
dados em disco, fazendo com que funcionem totalmente em conformidade com as caractersticas do modelo ACID, que representa
as quatro propriedades (atomicidade, consistncia, isolamento e
durabilidade) necessrias para que uma transao ocorra:
Atomicidade: uma transao deve ser uma unidade atmica de
trabalho, ou todas as suas modificaes de dados so executadas
ou nenhuma delas executada;
Consistncia: quando concluda, uma transao deve deixar todos
os dados em um estado consistente. Em um banco de dados relacional, todas as regras devem ser aplicadas s modificaes da transao
para manter toda a integridade dos dados. Todas as estruturas de
dados internas tais como ndices em rvore B ou listas duplamente
encadeadas, devem estar corretas ao trmino da transao;
Isolamento: modificaes feitas por transaes simultneas
devem ser isoladas das modificaes feitas por qualquer outra
transao simultnea. Uma transao reconhece os dados no
estado em que estavam antes de outra transao simultnea
t-los modificado ou reconhece os dados depois que a segunda
transao tiver sido concluda, mas no reconhece um estado
intermedirio;
Durabilidade: depois que uma transao tiver sido concluda,
seus efeitos ficam permanentemente no sistema. As modificaes
persistem at mesmo no caso de uma queda do sistema.
Como j foi dito anteriormente, existem diversas solues de
bancos de dados em memria no mercado, muitas delas possuem
verses gratuitas. Aqui citamos algumas da nova gerao:
OrigoDB: desenvolvido em especial para aplicaes .NET, um
banco relacional compatvel com o modelo ACID. Possui tambm
uma interface REST, possibilitando ser utilizado por outras tecnologias alm do .NET;
VoltDB: banco relacional, escalvel, compatvel com o modelo
ACID, e que implementa o padro H-Store de gerenciamento de
dados. H-Store uma implementao em memria de uma nova
categoria de sistemas de gerenciamento de dados em paralelo,
otimizado para aplicaes transacionais (OLTP), conhecido como
NewSQL, funcionando de forma distribuda. Possui fcil integrao com o Hadoop;
MemSQL: banco relacional, compatvel com o modelo ACID,
escalvel e que possui fcil integrao com o Apache Spark e
Hadoop;
O MemSQL
O MemSQL um banco de dados em memria de alta performance que combina a capacidade escalvel dos sistemas distribudos
com as facilidades do SQL. Ele ficou conhecido por ser um banco
em memria transacional e altamente escalvel utilizado em
empresas como Comcast, Zynga e ShutterStock. A ltima verso
do banco, alm de outras melhorias e funcionalidades, possui
integrao com frameworks de processamento de Big Data como
o Apache Spark, HDFS, e o Amazon S3, sendo possvel realizar
anlises de dados em tempo-real.
Apache Spark uma engine para processamento de dados em
larga escala que se integra ao Hadoop. Atravs dele possvel
criar aplicaes em Java, Scala ou Python para processamento e
manipulao de dados.
Atravs do conector do MemSQL com o Spark, pode-se obter
uma alta vazo (do ingls, throughput) e executar visualizaes
em tempo real de dados armazenados no HDFS ou Amazon
S3. Integrando ambas as tecnologias, usurios podem carregar
dados entre o MemSQL e clusters Spark processando resultados
de anlises via SQL.
Alm da verso Enterprise com suporte, o MemSQL possui uma
verso "community" que permite sua utilizao de forma gratuita
sem limitaes. um banco relativamente fcil de configurar, manter e escalar, seja em uma mquina convencional ou na nuvem.
A nova verso inclui tambm recursos de inteligncia geospacial
em tempo real, possibilitando criar aplicativos com capacidade de
geolocalizao e realizar anlises instantneas das informaes
disponibilizadas.
Funcionamento do MemSQL
O MemSQL possui uma arquitetura de duas camadas. Essa
arquitetura pode ser distribuda por diversos ns que possuem
as mesmas funcionalidades e o que os diferencia o papel que
cada n configurado para executar.
Existe o conceito de ns agregadores (do ingls, aggregators nodes),
isto , ns responsveis por intermediar a comunicao entre aplicao e banco, fornecendo um nico ponto de acesso e agregando
o resultado das consultas. Os aggregators se comunicam com os ns
folha (do ingls, leaf nodes), responsveis por armazenar e processar os dados em si. A comunicao entre agregadores e ns folha
se d atravs de queries SQL, assim como mostra a Figura 1.
45
Estado
Descrio
Unknown
Nesse estado, um n folha no faz parte do cluster. Esse o estado antes de executar o comando ADD LEAF para inserir o n no cluster. Um n nesse
estado no aparecer quando o comando SHOW LEAVES for executado. O comando REMOVE LEAF coloca um n nesse estado.
Online
Estado default de um n no cluster. Nesse estado o n est ativo no sistema e est fornecendo dados ou em estado de leitura.
Offline
Um n se encontra nesse estado quando o Master Aggregator no consegue visualiz-lo. O Master Aggregator checa por cada um dos ns atravs
do comando SELECT. Mesmo depois de um n ir para o estado offline, o Master Agregador continua monitorando-o.
Detached
Um n offline entra nesse estado quando passa a responder novamente aos pings do agregador. Um n nesse estado pode voltar a ficar online se
executado o comando ATTACH LEAF. Esse comando tentar validar os dados contidos pelo n.
Descrio
Online
Replicating
Requisitos e instalao
O MemSQL roda nos sistemas operacionais Linux de 64-bits, ou seja, o MemSQL
no ir funcionar nos sistemas de 32-bits.
Recomenda-se utilizar pelo menos 8GB
de RAM para rod-lo, no entanto ele funcionar em mquinas com menos RAM,
apesar de no ser recomendado, pois a
capacidade de armazenamento do MemSQL limitada pela quantidade de memria RAM que a mquina possui. Dessa
forma, quanto mais RAM disponvel, maior
a quantidade de memria disponvel para
armazenamento. Outro ponto importante
em relao quantidade de processadores
que a mquina possui. O MemSQL requer
um mnimo de 4 ncleos (do ingls, cores)
para funcionar, conforme Figura 4.
A instalao bem simples, basta descompactar o tar.gz e rodar o install.sh. Toda
a configurao do cluster feita atravs
da interface do MemSQL conhecida como
MemSQL Ops:
Estudo de caso
Para demonstrar algumas das funcionalidades desse banco, vamos criar um mo-
47
Dados geoespaciais
Outro fato interessante de mencionarmos a criao da tabela
distribution_centre (Listagem 2), visto que nela vamos utilizar
informaes geoespaciais. A coluna "location" possui o tipo
GEOGRAPHYPOINT.
O MemSQL, na verso 4, possui suporte para diferentes funes
geoespaciais. Ele suporta trs tipos de dados: pontos (points),
caminhos (paths) e polgonos (polygons), conforme demonstrado
na Figura 7. O tipo POINT, por exemplo, simplesmente uma
coordenada de latitude/longitude. O MemSQL implementa um
subconjunto do WKT. O WKT (Well-known text) uma linguagem
para representao de objetos geogrficos, referncias espaciais e
transformaes entre objetos e referncias espaciais.
A tabela locality (Listagem 3) tambm possui um campo para
coordenadas geomtricas. O intuito aqui poder calcular, dada
uma determinada localidade de entrega
de um pedido, qual o centro de distribuio mais prximo que pode atender
quela localidade.
Depois de criadas todas as tabelas (a
Listagem 4 mostra a DDL das demais tabelas), podemos inserir os dados armazenados, por exemplo, em um arquivo csv,
utilizando o comando da Listagem 5.
Na tabela distribution_centre iremos
inserir trs centros de distribuio, assim como mostra a Listagem 6.
No nosso caso s precisamos saber
quais as coordenadas de cada centro
de distribuio, por isso utilizamos o
tipo point (GEOGRAPHYPOINT), que
consiste de um par latitude/longitude.
Note que no existe vrgula separando
as coordenadas.
Qua ndo uma tabela criada no
MemSQL, para acelerar a compilao
das queries, o MemSQL pr-compila
49
Quando uma query executada pela primeira vez, pode-se notar claramente uma
demora na execuo. Isso acontece porque
o MemSQL transforma as queries SQL em
cdigo C++ e o compila (SGBDs tradicionais
interpretam as queries SQL). A compilao
da query feita somente uma vez (o que gera
um pouco de demora na primeira execuo)
para cada padro de query. Uma vez que a
query est compilada, qualquer outra executada que for similar o suficiente, reutilizar
o mesmo plano de execuo. Por exemplo, se
tivermos uma query no formato select * from
customer where name=Fulano and status = 1,
o MemSQL no ir recompilar a query para
consultas parecidas. Ele substituir os parmetros para poder fazer binds de outros
valores sempre que o mesmo tipo de query
for chamado.
O MemSQL usa a compilao de queries
para otimizar a execuo da mesma. Sem
o overhead de interpretar a query dinamicamente, as queries podem ser executadas
de forma bem mais rpida, competindo
de igual para igual com outras solues
otimizadas como, por exemplo, solues
NoSQL.
Calculando distncias
MemSQL
http://www.memsql.com
Apache Spark
http://spark.apache.org/
51
Trabalhando com o
MySQL Cluster
Saiba como configurar o MySQL Cluster e conhea
o storage engine NDB
dezenas de milhares de transaes por segundo. Contudo, o MySQL Cluster no vai ser uma boa escolha para executar consultas
analticas (OLAP) e, por se tratar de um sistema distribudo, vai
adicionar maior complexidade na implantao e administrao.
Tipos de aplicaes
O MySQL Cluster nasceu para atender as necessidades de aplicaes de telecomunicaes, mas continua em constante evoluo
para lidar com cargas de trabalho mais genricas. Provavelmente,
o MySQL Cluster ser uma boa escolha se a carga de trabalho da
sua aplicao for semelhante aos casos da Tabela 1.
No geral, os requisitos comuns destas aplicaes so:
alta disponibilidade (99,999%), com failover automtico (abaixo
de 1s) e operaes de manuteno online;
distribuio geogrfica ativo-ativo;
alto volume de acessos e conexes (milhares), com escalabilidade
tanto em leituras quanto em escritas (milhes de TPS);
baixa latncia com pouca variao nos tempos de resposta
(milissegundos);
Tipos de Aplicao
Casos de Referncia
Ericsson, Alcatel Lucent, NEC, Nokia, Telenor, Italtel, B2, Cell C, Emblacom, ip.access,
M1, Register.it, CenturyLink
Games sociais
Hadoop Hops, Hadoop KTH, OpenMQ, FreeRADIUS, FreeSWITCH, Kamailio, OpenIMS, Sailfin, WSO2
NewSQL
O MySQL Cluster um sistema gerenciador de banco de dados
relacional que oferece ao mesmo tempo desempenho, escalabilidade de leituras e escritas, e flexibilidade nos mtodos de acesso
aos dados dos sistemas NoSQL para processamento de transaes
online (OLTP), mantendo as garantias ACID de um sistema de
banco de dados tradicional. Isto o que alguns autores chamam
de NewSQL.
H vrias interfaces que as aplicaes podero usar para escrever e ler dados do MySQL Cluster. Por exemplo, o desenvolvedor
pode fazer chamadas diretas ao banco de dados usando C++, Java,
Node.js, HTTP ou Memcached protocol. Desta forma, a camada
de SQL no ser necessria, diminuindo sobrecarga e aumentando performance, alm de oferecer flexibilidade e agilidade no
desenvolvimento. Cada uma das APIs NoSQL pode ser utilizada
simultaneamente com SQL, sobre o mesmo conjunto de dados.
Estes sero mapeados automaticamente ou via configurao em
tabelas e a viso final ser a mesma, com consistncia e integridade garantidas pelo MySQL Cluster, inclusive para chaves
estrangeiras (FKs).
53
Alta disponibilidade
Como cada tipo de n possui uma responsabilidade bem definida e com dependncias minimizadas, possvel distribu-los
em mltiplas mquinas (hosts fsicos ou virtuais). Estas mquinas
podem estar fisicamente no mesmo datacenter ou em vrios (via
geo-replicao), o que permite as devidas redundncias para um
nvel de disponibilidade de 99,999%.
Para obter este nvel de alta disponibilidade, um cluster mnimo
deve ter seis ns lgicos (dois de cada tipo). Porm, alguns destes
ns podem ser co-alocados fisicamente em um mesmo host/mquina, desde que no haja ponto nico de falha. A implementao
mais comum para alta disponibilidade conta com quatro hosts:
dois ns de dados e mais dois co-alocando um n SQL e um n
de gerenciamento em cada um.
Podemos adicionar ns redundantes em todas as camadas. Os
dados sero replicados automaticamente pelo cluster entre os ns
de dados e mesmo que alguns ns de dados, de aplicativo ou de
Escalabilidade
tambm essa arquitetura do MySQL Cluster que possibilita
escalabilidade linear de leituras e escritas, distribuindo os dados e
as cargas entre os ns no modelo multi-master. No MySQL Cluster,
h particionamento automtico de dados (auto-sharding) entre os
data nodes. Por exemplo, em dois cenrios tpicos, quando uma
tabela com dados carregada no Cluster:
1. se o Cluster possuir apenas dois Data Nodes, a tabela ser
persistida em um n e uma cpia (rplica) automaticamente vai
para outro n. Se um n falhar, o Cluster automaticamente usa
os dados do n disponvel;
2. se o Cluster possuir quatro Data Nodes, as linhas da tabela (alm
de replicadas) so distribudas automaticamente e uniformemente
entre os ns (auto-sharding). Desta forma, metade dos dados da
tabela estar em dois ns e outra metade nos outros dois ns.
No somente os dados so distribudos nas operaes de escrita,
mas tambm so distribudas as operaes de leitura via balanceamento de carga. Adicionando mais ns, aumenta-se a capacidade e performance do Cluster, tanto para leituras quanto para
escritas. Esta capacidade de escalar linear, ou seja, adicionando
o dobro de ns em um Cluster possvel dobrar sua capacidade
de armazenamento e desempenho.
Portanto, o MySQL Cluster escala horizontalmente. Como veremos, a replicao dos dados ocorre de forma sncrona e imediata,
portanto os programas podero conectar-se a qualquer application
node e sempre enxergaro o mesmo conjunto consistente de dados.
Na prtica, isso significa que permitido colocar um balanceador
de carga entre os aplicativos e os application nodes distribuindo a
carga entre os ns.
Outra propriedade interessante desta arquitetura a elasticidade.
A adio de mais ns pode ser realizada online, sem paralisaes
no sistema. Sendo assim, se no h como prever a demanda antecipadamente, isto no um problema para o MySQL Cluster.
para nossos exemplos neste artigo. Para as outras opes consulte o manual de referncia (ver a seo de Links).
Testaremos conectividade via SQL e as capacidades de alta
disponibilidade e escalabilidade horizontal. No nosso objetivo testar a performance, outras APIs de acesso, alm de SQL,
nem operaes de manuteno, tal como backup online.
O MCM um utilitrio opcional para facilitar o gerenciamento
do MySQL Cluster. Ele no essencial para o funcionamento do
MySQL Cluster, ento no confunda com o Management Node.
H duas edies do MySQL Cluster: Community Edition e Cluster Carrier-Grade Edition. A primeira est sob licenciamento GPL
v2, que permite o uso gratuito em produo e sem limitaes.
A segunda possui uma licena comercial. No h diferenas nas
funcionalidades do banco de dados em si. A opo comercial
existe para permitir que o MySQL Cluster seja embarcado em
outros produtos de hardware ou software e redistribudo sem
a necessidade de abrir o cdigo fonte da aplicao ou demais
componentes. O MySQL Cluster Manager um utilitrio tambm com licena comercial, mas opcional e pode ser utilizado
em ambiente de desenvolvimento para testes por 30 dias.
No MCM, h uma opo para criar um cluster mnimo para
testes composto por cinco ns lgicos como mostra a Figura 2,
sendo um Management Node (ndb_mgmd), dois Data Nodes
(ndbmtd) e dois SQL Nodes (mysqld).
55
Testes bsicos
Instalao
Para os passos a seguir, utilize um usurio diferente de root e
certifique-se que possui pelo menos 3 GB de RAM. A instalao
trivial, basta descompactar os arquivos baixados conforme a
Listagem 1. Extraia o contedo do .zip e, em seguida, extraia o .tar
j para um diretrio onde ficaro os executveis do MySQL Cluster
e MCM, normalmente um subdiretrio do home do usurio.
No necessria nenhuma configurao adicional. Opcionalmente, voc pode querer alterar alguns parmetros de configurao do MCM editando o arquivo em mcm*/etc/mcmd.ini.
57
Este processo relativamente mais lento e envolve a reinicializao dos demais ns do cluster, porm o MCM o far automaticamente e de maneira alternada (rolling restart), sem que haja
indisponibilidade para a aplicao. Acompanhando o script em
execuo, possvel notar que alguns nodes ficaro inacessveis
(alternadamente) por um curto perodo de tempo, mas a execuo
em si no afetada.
A adio de SQL Nodes pode ser testada pelo leitor de maneira
anloga. Erros so raros usando o MCM, porm certifique-se
de que h memria RAM disponvel antes do comando start
process. A remoo de ns pode ser realizada com o comando
remove process XX mycluster;.
Limitaes e cuidados
Como vimos, o MySQL Cluster um verdadeiro banco
de dados distribudo ACID com arquitetura shared-nothing.
Esta arquitetura ao mesmo tempo que nos d uma enorme
flexibilidade, implica em algumas limitaes, uma vez que
os dados estaro distribudos e fragmentados entre ns
independentes e que podem estar fisicamente separados.
Porm, com alguns cuidados especiais, pode-se minimizar
ou eliminar tais limitaes, expandindo os cenrios de uso
do MySQL Cluster.
O melhor caso para usar o MySQL Cluster uma aplicao
nova ou em construo e que assemelha-se s descritas no
incio do artigo (Tabela 1). Portanto, inicie seu projeto com
um ambiente de desenvolvimento j com o MySQL Cluster. Se
alguma limitao impactar o uso, ela ser detectada e contornada antecipadamente e mais facilmente. Um dos principais
cuidados a serem tomados neste caso o dimensionamento
correto de memria RAM, definindo quais tabelas podero ser
disk-based e por quanto tempo os dados devero residir no
cluster. Sempre possvel adicionar mais ns para aumentar
a capacidade do cluster, porm uma poltica de reteno de
dados com perodo limitado e com estratgias de expurgo ou
arquivamento peridicos, uma boa maneira de fazer uso
inteligente de recursos.
Se a aplicao j existe, muito provavelmente sero necessrias algumas adaptaes e otimizaes de performance, tanto
na aplicao, quanto no banco de dados. Dependendo do seu
modelo de dados e da carga de trabalho, esta tarefa pode ser
bastante simples ou muito complexa. A imensa maioria das
consultas existentes vo continuar funcionando pois, os dados
so particionados automaticamente e de maneira transparente pelo Cluster, porm quase certo que seja necessrio
algum ajuste para melhorar a performance. Por exemplo,
reescrever algumas consultas e rotinas para evitar Full Table
Scans usando FORCE/USE INDEX, ANALYZE, Adaptive Query
Localization. Em casos mais extremos, talvez seja necessrio
revisar o modelo de dados, principalmente reduzindo o uso
de Foreign Keys e tipos BLOB ou TEXT. Outro caso que pode
exigir uma adaptao quando a aplicao faz uso de ndices
Full Text, que no so suportados pelo MySQL Cluster. Neste
caso, uma sada seria manter alguns dados de consulta em
InnoDB, lembrando que possvel misturar storage engines.
59
Autor
Airton Lastori
[email protected] - www.alastori.com.br
Airton Lastori consultor MySQL da Oracle Brasil. Possui formao em Cincia da Computao pela Universidade Federal
de Itajub e especializao em Engenharia de Software baseada em SOA
pelo IBTA. H mais de 10 anos est envolvido com diversas tecnologias
Open Source relacionadas principalmente ao universo Web.
Links:
Download do MySQL Cluster Manager
http://edelivery.oracle.com
Download do MySQL Cluster
http://dev.mysql.com/downloads/cluster
Manual de Referncia do MySQL Cluster
http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster.html
Manual de Referncia do MySQL Cluster Manager
http://dev.mysql.com/doc/mysql-cluster-manager/1.3/en/index.html
Frum MySQL Cluster
http://forums.mysql.com/list.php?25
MySQL Cluster Evaluation Guide
http://www.mysql.com/why-mysql/white-papers/mysql-cluster-evaluation-guide
PostgreSQL distribudo
com PgPool-II
Saiba como aumentar a disponibilidade de seu
SGBD PostgreSQL criando uma soluo distribuda
baseada no PgPool-II
61
Ferramenta PgPool-II
O PgPool-II um projeto criado com o objetivo de suprir a
carncia de funcionalidades que o SGBD PostgreSQL possui,
principalmente na funcionalidade de balanceamento de carga.
Ele um software middleware que funciona em uma camada
entre um servidor do banco de dados PostgreSQL e um cliente,
proporcionando diversas funcionalidades, entre elas:
Pooling de conexo: armazena um nmero limitado de conexes
em um repositrio interno para serem utilizadas posteriormente
sempre que uma aplicao requisitar. Sua principal funo
otimizar o acesso ao banco de dados atravs da reutilizao de
conexes sempre que uma nova conexo com as mesmas propriedades for detectada. Quando o tamanho mximo de conexes
for alcanado, as requisies so enfileiradas para aguardar a
liberao de novas;
Replicao: mantm cpias idnticas de uma base de dados em
diferentes servidores PostgreSQL, chamados clusters. Atravs destas cpias, possvel criar um sistema tolerante a falhas, ligando e
desligando clusters a qualquer momento, uma vez que seus dados
usar a memria compartilhada shared memory. A memria compartilhada utilizada em ambientes onde esto presentes vrias
instncias do PgPool-II, e garante a integridade do cache atravs
de seu compartilhamento.
Modos de operao
De acordo com a documentao oficial, o PgPool-II pode operar
em cinco modos distintos: Raw Mode, Connection Pool Mode, Replication Mode, Parallel Mode e Master/Slave Mode.
No Raw Mode, ele configurado no front-end apenas para receber
a conexo de clientes que acessarem o servidor PostgreSQL, podendo desse modo limitar a quantidade de conexes simultneas
ao servidor, oferecendo tambm um ambiente de alta disponibilidade atravs do failover.
No Connection Pool, ele continua gerenciando as conexes dos
clientes ao servidor, porm, mantendo um pool de conexes
atravs da criao de vrios processos para poderem ser reutilizadas sempre que possvel, diminuindo a carga no servidor de
dados.
No Replication, ele replica as operaes em todos os servidores
conectados a ele criando um sistema de redundncia. Dessa forma,
caso algum servidor venha a ficar indisponvel, ele removido
pelo PgPool-II e o sistema no interrompido. Esta caracterstica
tambm conhecida como degenerao.
No Parallel, o PgPool-II divide as queries e as tabelas em diferentes servidores conectados ao sistema, aliviando dessa forma
a quantidade de dados armazenados nos servidores. Como o
SGBD PostgreSQL no suporta este tipo de arquitetura de queries
paralelas, o Pgpool-II na verdade acaba utilizando o conceito de
fragmentao horizontal, que considerada um tipo de query
paralela.
J o modo Master/Slave utilizado em conjunto com outro sistema de replicao Master/Slave, como por exemplo o Slony. Nesse
modo, as operaes do banco de dados so enviadas a um servidor
principal (Master) e ele responsvel por envi-las aos demais
servidores (Slaves) quando possvel.
O PgPool-II fornece uma interface de controle chamada de pcp,
em que o administrador pode gerenciar o status do pgpool-II
alm de poder controlar processos remotamente. Todos os modos
de operao requerem que o pcp esteja configurado para serem
operados.
A arquitetura do PgPool-II formada por (ver Figura 2):
um SQL Parser, que tem a funo de validar e analisar todas as
queries vindas das aplicaes;
um SQL Rewriter, que responsvel por reescrever queries em
determinados casos, como na execuo de queries paralelas, e;
um motor de execuo, ou engine, que responsvel por enviar
informaes e manipular os demais clusters do sistema.
O Pgpool-II uma ferramenta robusta. Entretanto, algumas
limitaes ocorrem em sua utilizao como a impossibilidade
de realizar o balanceamento de carga com queries paralelas no
modo Master/Slave, impossibilidade de autenticao por host
Watchdog
possvel tambm coordenar um sistema de alta disponibilidade constitudo de vrios Pgpool-IIs atravs de um processo
chamado watchdog. Ele pode monitorar os sistemas trocando
informaes atravs de dois mtodos: Modo Hearthbeat ou
Modo Query.
No modo Hearthbeat, o watchdog monitora os demais processos
do pgpool-II enviando sinais frequentes atravs da rede garantindo que a outra ponta esteja sempre operacional. Caso algum
sinal enviado no retorne nada por algum tempo, o watchdog
interpretar isto como sendo um ponto de falha e informar a
ocorrncia.
No modo Query, o watchdog realiza o monitoramento enviando queries aos demais servios Pgpool-II, verificando assim sua
resposta. Apesar de funcional, este modo pouco utilizado e j
encontra-se depreciado.
Alm de monitorar os demais processos, o Watchdog tambm
pode monitorar os servidores de aplicao. Ele pode ser configurado pelo arquivo de configuraes pgpool.conf, informando qual
ser seu hostname, porta e chave de autenticao.
63
cluster, mas prefervel um servidor dedicado afim de desacoplar o ambiente e manter um maior controle sobre o sistema.
A Figura 3 mostra a disposio de um ambiente distribudo com
PostgreSQL.
$make
$make install
No comando, a opo n no
executa o processo como um daemon, deixando o terminal aberto.
A opo d habilita as mensagens
de log no arquivo indicado. Diversas outras opes podem ser
utilizadas como c para limpar o
cach e -f/-a/-F para especificar os
arquivos de configurao (pgpool.
conf, pool_hba.conf e pcp.conf
respectivamente).
Antes de iniciar o PgPool-II,
importante verificar se todos
os servidores backend esto em
operao.
Comandos PCP
65
Comando
Finalidade
pcp_node_count
Exibe o nmero total de clusters definidos no arquivo pgpool.conf. Todos so considerados, tanto os ativos quanto os
inativos.
pcp_node_info
Exibe a informao de determinado cluster atravs de seu ID. Ele retorna o status do cluster que pode ser:
1 para ativo, mas sem conexes;
2 para ativo e sendo utilizado no momento, e;
3 para desligado.
pcp_attach_node/pcp_detach_node
Conecta/Desconecta um cluster ao sistema. Caso o cluster esteja ativo, ele forado a desligar.
pcp_stop_pgpool
pcp_proc_count
pcp_proc_info
pcp_pool_status
pcp_detach_node
pcp_attach_node
pcp_promote_node
Autor
Luis Eduardo de Oliveira Floriano
[email protected]
Graduado em Banco de Dados e Especialista em Desenvolvimento de Sistemas Web e Mobile. Atua como Desenvolvedor
Java, possuindo experincia com banco de dados relacionais, banco de
dados distribudos, PostgreSQL, Oracle e MySQL.
Links:
Pgina de Downloads do PgPool-II
http://pgpool.net/mediawiki/index.php/Downloads
Documentao Oficial do PgPool-II
http://www.pgpool.net/docs/latest/pgpool-en.html
67