Na postagem anterior do blog, mostramos algumas etapas básicas para implantar e gerenciar um servidor MySQL autônomo, bem como a configuração da Replicação MySQL usando o módulo MySQL Puppet. Nesta segunda instalação, abordaremos etapas semelhantes, mas agora com uma configuração do Galera Cluster.
Galera Cluster com Marionete
Como você deve saber, o Galera Cluster possui três provedores principais:
- Cluster MySQL Galera (Codificação)
- Cluster Percona XtraDB (Percona)
- Cluster MariaDB (incorporado no MariaDB Server pelo MariaDB)
Uma prática comum com as implantações do Galera Cluster é ter uma camada adicional sobre o cluster de banco de dados para fins de balanceamento de carga. No entanto, esse é um processo complexo que merece um post próprio.
Há vários módulos Puppet disponíveis no Puppet Forge que podem ser usados para implantar um Galera Cluster. Aqui estão alguns deles..
- puppetlabs/mysql - somente MariaDB Galera
- fraenki/galera - Percona XtraDB Cluster e MySQL Galera da Codership
- edestecd/mariadb - somente cluster MariaDB
- filiadata/percona - Percona XtraDB Cluster
Como nosso objetivo é fornecer um entendimento básico de como escrever manifesto e automatizar a implantação do Galera Cluster, abordaremos a implantação do MariaDB Galera Cluster usando o módulo puppetlabs/mysql. Para outros módulos, você sempre pode dar uma olhada na respectiva documentação para obter instruções ou dicas sobre como instalar.
No Galera Cluster, a ordenação ao iniciar o nó é crítica. Para iniciar corretamente um novo cluster, um nó deve ser configurado como o nó de referência. Este nó será iniciado com uma string de conexão de host vazia (gcomm://) para inicializar o cluster. Esse processo é chamado de bootstrap.
Uma vez iniciado, o nó se tornará um componente primário e os nós restantes podem ser iniciados usando o comando padrão mysql start (systemctl start mysql ou início do mysql do serviço ) seguido por uma string de conexão de host completo (gcomm://db1,db2,db3). A inicialização só é necessária se não houver nenhum componente primário retido por nenhum outro nó no cluster (verifique com wsrep_cluster_status status).
O processo de inicialização do cluster deve ser executado explicitamente pelo usuário. O manifesto em si NÃO deve iniciar o cluster (inicializar qualquer nó) na primeira execução para evitar qualquer risco de perda de dados. Lembre-se, o manifesto do Puppet deve ser escrito para ser o mais idempotente possível. O manifesto deve ser seguro para ser executado várias vezes sem afetar as instâncias MySQL já em execução. Isso significa que temos que nos concentrar principalmente na configuração do repositório, instalação de pacotes, configuração pré-execução e configuração do usuário SST.
As seguintes opções de configuração são obrigatórias para o Galera:
- wsrep_on :um sinalizador para ativar a API de replicação de conjunto de gravação para Galera Cluster (somente MariaDB).
- wsrep_cluster_name :o nome do cluster. Deve ser idêntico em todos os nós que fazem parte do mesmo cluster.
- wsrep_cluster_address :A cadeia de conexão de comunicação Galera, prefixada com gcomm:// e seguida pela lista de nós, separada por vírgula. Lista de nós vazia significa inicialização do cluster.
- wsrep_provider :O caminho onde reside a biblioteca Galera. O caminho pode ser diferente dependendo do sistema operacional.
- bind_address :o MySQL deve ser acessível externamente, portanto, o valor '0.0.0.0' é obrigatório.
- wsrep_sst_method :para MariaDB, o método SST preferido é mariabackup.
- wsrep_sst_auth :usuário e senha do MySQL (separados por dois pontos) para realizar a transferência de instantâneo. Normalmente, especificamos um usuário que pode criar um backup completo.
- wsrep_node_address :Endereço IP para comunicação e replicação Galera. Use o fator Puppet para escolher o endereço IP correto.
- wsrep_node_name :nome do host do FQDN. Use o fator Puppet para escolher o nome de host correto.
Para implantações baseadas em Debian, o script de pós-instalação tentará iniciar o servidor MariaDB automaticamente. Se configuramos wsrep_on=ON (sinalizador para habilitar Galera) com o endereço completo em wsrep_cluster_address variável, o servidor falharia durante a instalação. Isso ocorre porque ele não tem nenhum componente primário para se conectar.
Para iniciar corretamente um cluster no Galera, o primeiro nó (chamado nó de bootstrap) deve ser configurado com uma string de conexão vazia (wsrep_cluster_address =gcomm://) para iniciar o nó como o componente primário. Você também pode executar o script bootstrap fornecido, chamado galera_new_cluster, que basicamente faz algo semelhante, mas em segundo plano.
Implantação do Galera Cluster (MariaDB)
A implantação do Galera Cluster requer configuração adicional na origem do APT para instalar o repositório de versão preferencial do MariaDB.
Observe que a replicação do Galera é incorporada ao MariaDB Server e não requer a instalação de pacotes adicionais. Dito isto, um sinalizador extra é necessário para habilitar o Galera usando wsrep_on=ON. Sem esse sinalizador, o MariaDB atuará como um servidor autônomo.
Em nosso ambiente baseado em Debian, a opção wsrep_on só pode ser apresentada no manifesto após a conclusão da primeira implantação (como mostrado mais abaixo nas etapas de implantação). Isso é para garantir que a primeira inicialização funcione como um servidor autônomo para o Puppet provisionar o nó antes que ele esteja completamente pronto para ser um nó Galera.
Vamos começar preparando o conteúdo do manifesto conforme abaixo (modifique a seção de variáveis globais se necessário):
# Puppet manifest for Galera Cluster MariaDB 10.3 on Ubuntu 18.04 (Puppet v6.4.2)
# /etc/puppetlabs/code/environments/production/manifests/galera.pp
# global vars
$sst_user = 'sstuser'
$sst_password = 'S3cr333t$'
$backup_dir = '/home/backup/mysql'
$mysql_cluster_address = 'gcomm://192.168.0.161,192.168.0.162,192.168.0.163'
# node definition
node "db1.local", "db2.local", "db3.local" {
Apt::Source['mariadb'] ~>
Class['apt::update'] ->
Class['mysql::server'] ->
Class['mysql::backup::xtrabackup']
}
# apt module must be installed first: 'puppet module install puppetlabs-apt'
include apt
# custom repository definition
apt::source { 'mariadb':
location => 'http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.3/ubuntu',
release => $::lsbdistcodename,
repos => 'main',
key => {
id => 'A6E773A1812E4B8FD94024AAC0F47944DE8F6914',
server => 'hkp://keyserver.ubuntu.com:80',
},
include => {
src => false,
deb => true,
},
}
# Galera configuration
class {'mysql::server':
package_name => 'mariadb-server',
root_password => '[email protected]#',
service_name => 'mysql',
create_root_my_cnf => true,
remove_default_accounts => true,
manage_config_file => true,
override_options => {
'mysqld' => {
'datadir' => '/var/lib/mysql',
'bind_address' => '0.0.0.0',
'binlog-format' => 'ROW',
'default-storage-engine' => 'InnoDB',
'wsrep_provider' => '/usr/lib/galera/libgalera_smm.so',
'wsrep_provider_options' => 'gcache.size=1G',
'wsrep_cluster_name' => 'galera_cluster',
'wsrep_cluster_address' => $mysql_cluster_address,
'log-error' => '/var/log/mysql/error.log',
'wsrep_node_address' => $facts['networking']['interfaces']['enp0s8']['ip'],
'wsrep_node_name' => $hostname,
'innodb_buffer_pool_size' => '512M',
'wsrep_sst_method' => 'mariabackup',
'wsrep_sst_auth' => "${sst_user}:${sst_password}"
},
'mysqld_safe' => {
'log-error' => '/var/log/mysql/error.log'
}
}
}
# force creation of backup dir if not exist
exec { "mkdir -p ${backup_dir}" :
path => ['/bin','/usr/bin'],
unless => "test -d ${backup_dir}"
}
# create SST and backup user
class { 'mysql::backup::xtrabackup' :
xtrabackup_package_name => 'mariadb-backup',
backupuser => "${sst_user}",
backuppassword => "${sst_password}",
backupmethod => 'mariabackup',
backupdir => "${backup_dir}"
}
# /etc/hosts definition
host {
'db1.local': ip => '192.168.0.161';
'db2.local': ip => '192.169.0.162';
'db3.local': ip => '192.168.0.163';
}
Um pouco de explicação é necessária neste momento. 'wsrep_node_address' deve ser apontado para o mesmo endereço IP que foi declarado no wsrep_cluster_address. Neste ambiente nossos hosts possuem duas interfaces de rede e queremos usar a segunda interface (chamada enp0s8) para comunicação Galera (onde a rede 192.168.0.0/24 está conectada). É por isso que usamos o fator Puppet para obter as informações do nó e aplicá-las à opção de configuração. O resto é bem autoexplicativo.
Em cada nó MariaDB, execute o seguinte comando para aplicar o catálogo como usuário root:
$ puppet agent -t
O catálogo será aplicado a cada nó para instalação e preparação. Uma vez feito, temos que adicionar a seguinte linha em nosso manifesto na seção "override_options => mysqld":
'wsrep_on' => 'ON',
O acima satisfará o requisito do Galera para o MariaDB. Em seguida, aplique o catálogo em cada nó MariaDB mais uma vez:
$ puppet agent -t
Uma vez feito, estamos prontos para inicializar nosso cluster. Como este é um novo cluster, podemos escolher qualquer um dos nós para ser o nó de referência, também conhecido como nó de bootstrap. Vamos escolher db1.local (192.168.0.161) e executar o seguinte comando:
$ galera_new_cluster #db1
Uma vez que o primeiro nó é iniciado, podemos iniciar o nó restante com o comando start padrão (um nó por vez):
$ systemctl restart mariadb #db2 and db3
Uma vez iniciado, dê uma olhada no log de erros do MySQL em /var/log/mysql/error.log e certifique-se de que o log termine com a seguinte linha:
2019-06-10 4:11:10 2 [Note] WSREP: Synchronized with group, ready for connections
O acima nos diz que os nós estão sincronizados com o grupo. Podemos então verificar o status usando o seguinte comando:
$ mysql -uroot -e 'show status like "wsrep%"'
Certifique-se de que em todos os nós, o wsrep_cluster_size , wsrep_cluster_status e wsrep_local_state_comment são 3, "Primário" e "Sincronizado", respectivamente.
Gerenciamento MySQL
Este módulo pode ser usado para executar várias tarefas de gerenciamento do MySQL...
- opções de configuração (modificar, aplicar, configuração personalizada)
- recursos de banco de dados (banco de dados, usuário, concessões)
- backup (criar, agendar, usuário de backup, armazenamento)
- restauração simples (somente mysqldump)
- instalação/ativação de plugins
Controle de Serviço
A maneira mais segura de provisionar o Galera Cluster com Puppet é lidar com todas as operações de controle de serviço manualmente (não deixe o Puppet lidar com isso). Para uma reinicialização contínua de cluster simples, o comando de serviço padrão serviria. Execute o seguinte comando um nó por vez.
$ systemctl restart mariadb # Systemd
$ service mariadb restart # SysVinit
No entanto, no caso de ocorrer uma partição de rede e nenhum componente primário estiver disponível (verifique com wsrep_cluster_status ), o nó mais atualizado deve ser inicializado para que o cluster volte a funcionar sem perda de dados. Você pode seguir as etapas conforme mostrado na seção de implantação acima. Para saber mais sobre o processo de bootstrap com o cenário de exemplos, abordamos isso em detalhes nesta postagem do blog, How to Bootstrap MySQL or MariaDB Galera Cluster.
Recurso de banco de dados
Use a classe mysql::db para garantir que um banco de dados com usuário e privilégios associados esteja presente, por exemplo:
# make sure the database and user exist with proper grant
mysql::db { 'mynewdb':
user => 'mynewuser',
password => 'passw0rd',
host => '192.168.0.%',
grant => ['SELECT', 'UPDATE']
}
A definição acima pode ser atribuída a qualquer nó, pois cada nó em um Galera Cluster é um mestre.
Backup e restauração
Como criamos um usuário SST usando a classe xtrabackup, o Puppet configurará todos os pré-requisitos para o trabalho de backup - criar o usuário de backup, preparar o caminho de destino, atribuir propriedade e permissão, definir o trabalho cron e configurar as opções de comando de backup a serem usadas no script de backup fornecido. Cada nó será configurado com dois trabalhos de backup (um para semanal completo e outro para incremental diário) padrão para 23h05, como você pode ver na saída do crontab:
$ crontab -l
# Puppet Name: xtrabackup-weekly
5 23 * * 0 /usr/local/sbin/xtrabackup.sh --target-dir=/home/backup/mysql --backup
# Puppet Name: xtrabackup-daily
5 23 * * 1-6 /usr/local/sbin/xtrabackup.sh --incremental-basedir=/home/backup/mysql --target-dir=/home/backup/mysql/`date +%F_%H-%M-%S` --backup
Se você quiser agendar o mysqldump, use a classe mysql::server::backup para preparar os recursos de backup. Suponha que temos a seguinte declaração em nosso manifesto:
# Prepare the backup script, /usr/local/sbin/mysqlbackup.sh
class { 'mysql::server::backup':
backupuser => 'backup',
backuppassword => 'passw0rd',
backupdir => '/home/backup',
backupdirowner => 'mysql',
backupdirgroup => 'mysql',
backupdirmode => '755',
backuprotate => 15,
time => ['23','30'], #backup starts at 11:30PM everyday
include_routines => true,
include_triggers => true,
ignore_events => false,
maxallowedpacket => '64M'
}
O acima diz ao Puppet para configurar o script de backup em /usr/local/sbin/mysqlbackup.sh e agendá-lo às 23h30 todos os dias. Se você quiser fazer um backup imediato, basta invocar:
$ mysqlbackup.sh
Para a restauração, o módulo só suporta restauração com o método de backup mysqldump, importando o arquivo SQL diretamente para o banco de dados usando a classe mysql::db, por exemplo:
mysql::db { 'mydb':
user => 'myuser',
password => 'mypass',
host => 'localhost',
grant => ['ALL PRIVILEGES'],
sql => '/home/backup/mysql/mydb/backup.gz',
import_cat_cmd => 'zcat',
import_timeout => 900
}
O arquivo SQL será carregado apenas uma vez e não em todas as execuções, a menos que force_sql => true seja usado.
Gerenciamento de configuração
Neste exemplo, usamos manage_config_file => true com override_options para estruturar nossas linhas de configuração que mais tarde serão enviadas pelo Puppet. Qualquer modificação no arquivo de manifesto refletirá apenas o conteúdo do arquivo de configuração MySQL de destino. Este módulo não carregará a configuração em tempo de execução nem reiniciará o serviço MySQL após enviar as alterações para o arquivo de configuração. É responsabilidade do sysadmin reiniciar o serviço para ativar as alterações.
Para adicionar uma configuração personalizada do MySQL, podemos colocar arquivos adicionais em "includedir", padrão para /etc/mysql/conf.d. Isso nos permite substituir configurações ou adicionar outras, o que é útil se você não usar override_options na classe mysql::server. Fazer uso do modelo Puppet é altamente recomendado aqui. Coloque o arquivo de configuração personalizado no diretório do modelo do módulo (padrão para , /etc/puppetlabs/code/environments/production/modules/mysql/templates) e adicione as seguintes linhas no manifesto:
# Loads /etc/puppetlabs/code/environments/production/modules/mysql/templates/my-custom-config.cnf.erb into /etc/mysql/conf.d/my-custom-config.cnf
file { '/etc/mysql/conf.d/my-custom-config.cnf':
ensure => file,
content => template('mysql/my-custom-config.cnf.erb')
}
Guia de DevOps para gerenciamento de banco de dados de vários novesSaiba mais sobre o que você precisa saber para automatizar e gerenciar seus bancos de dados de código abertoBaixe gratuitamente Puppet vs ClusterControl
Você sabia que também pode automatizar a implantação do MySQL ou MariaDB Galera usando o ClusterControl? Você pode usar o módulo ClusterControl Puppet para instalá-lo, ou simplesmente baixando-o do nosso site.
Quando comparado ao ClusterControl, você pode esperar as seguintes diferenças:
- Um pouco de curva de aprendizado para entender as sintaxes, formatação e estruturas do Puppet antes de escrever manifestos.
- O manifesto deve ser testado regularmente. É muito comum você receber um erro de compilação no código, especialmente se o catálogo for aplicado pela primeira vez.
- Puppet presume que os códigos sejam idempotentes. A condição de teste/verificação/verificação é de responsabilidade do autor para evitar atrapalhar um sistema em execução.
- O Puppet requer um agente no nó gerenciado.
- Incompatibilidade com versões anteriores. Alguns módulos antigos não funcionariam corretamente na nova versão.
- O monitoramento de banco de dados/host deve ser configurado separadamente.
O assistente de implantação do ClusterControl orienta o processo de implantação:
Como alternativa, você pode usar a interface de linha de comando do ClusterControl chamada "s9s" para obter resultados semelhantes. O comando a seguir cria um cluster Percona XtraDB de três nós (desde que sem senha para todos os nós tenha sido configurado previamente):
$ s9s cluster --create \
--cluster-type=galera \
--nodes='192.168.0.21;192.168.0.22;192.168.0.23' \
--vendor=percona \
--cluster-name='Percona XtraDB Cluster 5.7' \
--provider-version=5.7 \
--db-admin='root' \
--db-admin-passwd='$ecR3t^word' \
--log
Recursos relacionados Módulo Puppet para ClusterControl - Adicionando gerenciamento e monitoramento aos clusters de banco de dados existentes Como automatizar a implantação do MySQL Galera Cluster usando s9s CLI e Chef Automação de banco de dados com Puppet:implantação de replicação MySQL e MariaDB Além disso, o ClusterControl oferece suporte à implantação de balanceadores de carga para Galera Cluster - HAproxy, ProxySQL e MariaDB MaxScale - juntamente com um endereço IP virtual (fornecido pelo Keepalived) para eliminar qualquer ponto único de falha para seu serviço de banco de dados.
Após a implantação, os nós/clusters podem ser monitorados e totalmente gerenciados pelo ClusterControl, incluindo detecção automática de falhas, recuperação automática, gerenciamento de backup, gerenciamento de balanceador de carga, conexão de escravo assíncrono, gerenciamento de configuração e assim por diante. Tudo isso reunido em um único produto. Em média, seu cluster de banco de dados estará funcionando em 30 minutos. O que ele precisa é apenas SSH sem senha para os nós de destino.
Você também pode importar um Galera Cluster já em execução, implantado pelo Puppet (ou qualquer outro meio) no ClusterControl para sobrecarregar seu cluster com todos os recursos interessantes que o acompanham. A edição da comunidade (gratuita para sempre!) oferece implantação e monitoramento.
No próximo episódio, vamos orientá-lo na implantação do balanceador de carga MySQL usando o Puppet. Fique atento!