MySQL: Tuning e Performance - Hardware e Configurações (Parte 1)
Este é o primeiro artigo da série sobre administração de MySQL. Aqui vamos explorar os fundamentos de tuning e performance, desde configurações de hardware até otimizações de sistema operacional.
Introdução ao Tuning MySQL
DBA (Database Administrator) é uma área de atuação muito grande. E apesar de estudar bastante, gostar do assunto, eu não tenho tanta experiência profissional.
Minha especialidade é desenvolvimento de software, mas vou compartilhar e tentar explicar o mínimo que eu acho que todo desenvolvedor deveria saber sobre administração de Banco de Dados.
O objetivo final é falar sobre Administrar um Banco de Dados, mas vou falar de vários outros assuntos e conceitos de SO, memória, armazenamento, redes, etc.
Nesse artigo vou usar o MySQL como exemplo, mas as informações são válidas para outros SGBDs.
Conceitos Fundamentais
Vamos começar deixando claro os conceitos. A sigla SGBD é: Sistema Gerenciador de Banco de Dados. Exemplos: MySQL, PostgreSQL, Oracle, SQL Server, etc.
Já o "Banco de dados" é uma coleção de dados em si. Diferentes SGBDs possuem diferentes formas de armazenar e gerenciar esses dados.
Os exemplos citados de SGBDs foram os que possuem modelos de dados relacionais. Mas existe outro universo só de SGBDs que não são relacionais, como o MongoDB que temos o costume de chamar de NoSQL.
NoSQL é um termo que vem do inglês "Not Only SQL". SQL (Structured Query Language) é a linguagem/protocolo de consulta de dados relacionais. Tem uma base comum de SQL em todos os SGBDs relacionais, mas cada SGBD tem suas próprias características.
Tuning em Duas Dimensões
Primeiro, trabalhando com os bancos de dados e índices, são coisas que eu vou falar depois, nós temos tuning através das variáveis internas do MySQL, que a gente chama ali de MySQLD tuning e através do hardware e do sistema operacional que o MySQL está instalado.
Vou começar pelo hardware e depois o tuning do MySQLD.
Configurações de Hardware
Sistema Operacional
A primeira coisa básica é considerar sempre sistemas operacionais de 64 bits. O MySQL tem uma gama de poder utilizar vários processadores em paralelo e de consumir realmente toda a capacidade de memória de hardware que a máquina possui.
Configuração de RAM
Outra coisa importante é ver a configuração de RAM que está sendo utilizada. Na verdade, existe um parâmetro interno no MySQL, que configuramos quanto de RAM os nossos processos vão poder consumir no máximo.
É claro que eu não vou disponibilizar toda a RAM disponível dentro da minha máquina. Normalmente a dica é que você disponibilize, pelo menos, no máximo 50% da sua RAM existente.
Então, se eu estiver usando, por exemplo, um servidor com 32GB de RAM, a gente vai ter então disponível para o MySQL, preferencialmente metade disso ou 16GB.
Relação entre Tamanho da Base e RAM
Aí, cabe a você definir se esses 16GB é muita coisa ou não e há aí uma relação que a experiência mostra... direta, entre o tamanho da base e a quantidade de RAM que o processo vai gastar.
Um exemplo é o seguinte: uma base normalmente de 1GB de tamanho, não vai gastar mais do que 8GB de RAM para fazer qualquer coisa nessa sua base.
Claro que um ambiente real, a gente não vai ter só uma conexão fazendo coisa na base, eu vou ter várias conexões. Então, dependendo da forma com que o banco é usado, talvez, mesmo tendo um banco de 1GB, 8GB de RAM vai ser pouco, porque eu posso ter muitos processos acessando a base ao mesmo tempo.
Configurações de Disco
Tipos de Disco
Outro ponto importante que deve ser colocado é o tipo de leitura de disco, o "IO", que esse banco vai ter. E aí, claro, aonde estiver armazenado a base de dados, vai fazer uma enorme diferença.
Hoje em dia, a gente tem diversos tipos de HDs de discos rígidos, onde nós podemos armazenar os nossos dados.
Claro que se você tiver dinheiro e capacidade de colocar tudo num disco SSD, que é um disco rígido de memória, iria ser imbatível, a velocidade de "IO" vai ter um ganho enorme, mas hoje os SSDs ainda são caros.
Então, a gente sempre vai encontrar discos do tipo: SATA, SAS e SATA.
Desses três, normalmente SATA são muito velhos, a gente quase não encontra mais hoje em dia e entre disco SAS e SATA, de preferência aos discos SAS, porque eles são mais performáticos.
Configurações RAID
Outra forma também é como é que você usa a sua controladora de disco RAID. Geralmente os discos RAID são usados, para a gente poder trazer segurança aos nossos dados.
Existem vários tipos de RAID, os mais usados são RAID 0, RAID 1, RAID 5 e RAID 10:
RAID 0: Ele vai dividir o seu dado em dois discos rígidos diferentes. Então, eu tenho dois discos rígidos físicos, mas logicamente, eu enxergo somente um drive e aí, o sistema operacional vai dividindo esse dado entre os discos.
RAID 1: Normalmente é uma cópia, eu tenho dois discos rígidos, eu olho um só, mas a capacidade do que eu olho de discos normalmente é de um deles somente. E internamente, toda a vez que eu gravo, que eu incluo, altero ou excluo informações, essa operação é feita ao mesmo tempo nos dois discos.
RAID 5: Seria a divisão dos dados, só que em mais discos.
RAID 10: Seria o espelhamento dos discos, usando mais discos rígidos.
Claro que o RAID 10 e o RAID 1, eles gastam metade do espaço físico fazendo redundância, mas com certeza, eles são mais seguros para suportar um banco de dados MySQL, porque se por acaso um dos discos quebrar ou tiver indisponível, eu tenho o meu dado no outro disco preservado.
Considerações sobre Nuvem
Claro que essas configurações de hardware, elas vêm muito com a experiência do profissional e o pessoal de infraestrutura e de suporte, eles podem ajudar muito o DBA a desenhar o melhor ambiente para o banco de dados MySQL.
Mas aí, novamente falando sobre nuvens, hoje em dia, a gente usa muito a nuvem para criar uma instância do MySQL. E aí, quando a gente fala de nuvem, da mesma maneira que a gente não precisa mais estar se preocupando em configurações de backup de ambiente, também performance, a gente não se preocupa mais, porque a gente tem dentro da configuração do MySQL na nuvem, seja ela na Amazon, na Azure ou na Google, você tem configurações de recursos de hardware que você vai reservar para o seu banco de dados MySQL.
E aí, você consegue em maneira lógica, ir aumentando esses recursos, na medida em que seu banco vai sendo usado e aí, internamente, se eu estou usando RAID, quanto de RAM, se é RAID 0, RAID 1, RAID 5, isso tudo é transparente para mim, que na parametrização da nuvem está pedindo para que aquele MySQL utilize mais recursos.
Conclusão
O tuning de hardware é fundamental para o desempenho do MySQL. Comece sempre com um sistema operacional de 64 bits, configure adequadamente a RAM (máximo 50% para o MySQL) e escolha discos de qualidade com configurações RAID apropriadas para seu caso de uso.
Na próxima parte desta série, exploraremos os mecanismos de armazenamento do MySQL (MyISAM, InnoDB e Memory) e como eles impactam a performance do sistema.