Percona Server para MySQL 8.0 oferece várias soluções de cluster para alta disponibilidade prontas para uso:
- Mestre único:
- Replicação assíncrona
- Replicação semi-síncrona
- Multi-mestre:
- Replicação de grupo
- InnoDB Cluster (uma combinação de MySQL Router, MySQL Shell e Percona Server com replicação de grupo)
A solução mais popular, testada em batalha e altamente escalável é, obviamente, a replicação assíncrona. Nesta postagem do blog, vamos implantar uma configuração de replicação do Percona Server especificamente para alta disponibilidade. As instruções descritas aqui são baseadas no CentOS 7.
Instalando o Servidor Percona
Para alta disponibilidade, precisamos de pelo menos dois nós em uma configuração simples de replicação mestre-escravo:
- db1 - mestre (192.168.0.61)
- db2 - escravo (192.168.0.62)
As etapas descritas nesta seção devem ser executadas em todos os nós do banco de dados (db1 e db2). Começaremos instalando o pacote do repositório Percona:
$ yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
A última versão estável neste momento é o Percona Server para MySQL 8.0, mas por padrão, o pacote do repositório é configurado apenas até a versão 5.7. O pacote percona-release contém um script que pode habilitar repositórios adicionais para os produtos mais recentes. Vamos executar esse script e habilitar os repositórios 8.0:
$ percona-release setup ps80
Em seguida, instale o Percona Server e o Percona Xtrabackup mais recentes:
$ yum -y install percona-server-server percona-xtrabackup-80
Neste momento, você deve ter instalado um Servidor Percona para MySQL 8.0.21. Todos os pacotes de dependência serão instalados como pacotes compartilhados, compartilhados e clientes. Podemos então habilitar o serviço MySQL na inicialização e iniciar o serviço:
$ systemctl enable mysql
$ systemctl start mysql
Uma nova senha de root será gerada durante a primeira inicialização. Precisamos recuperar as informações de senha de root primeiro do log de erros do MySQL (o padrão é /var/log/mysqld.log em sistemas baseados em RHEL):
$ cat /var/log/mysqld.log | grep temporary
2020-11-06T04:53:07.402040Z 6 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: o%(_M>t1)R-P
Como você pode ver, a senha gerada é "o%(_M>t1)R-P". Em seguida, precisamos executar uma tarefa de pós-instalação para proteger a instalação do servidor MySQL. Execute o seguinte comando:
$ mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:
The existing password for the user account root has expired. Please set a new password.
New password:
Re-enter new password:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y
New password:
Re-enter new password:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
A senha de root gerada expirará imediatamente após o primeiro login de root. O script auxiliar acima nos ajuda a configurar uma nova senha de root do MySQL, desabilitando o login remoto para root, remover banco de dados de teste e usuários anônimos e também recarregar as tabelas de privilégios.
Agora estamos prontos para configurar o recurso de alta disponibilidade para o Percona Server 8.0.
Replicação semi-síncrona
A replicação semi-síncrona está entre a replicação assíncrona e totalmente síncrona. A origem aguarda até que pelo menos uma réplica tenha recebido e registrado os eventos e, em seguida, confirma a transação. A origem não espera que todas as réplicas confirmem o recebimento e requer apenas uma confirmação das réplicas, não que os eventos tenham sido totalmente executados e confirmados no lado da réplica. A replicação semi-síncrona, portanto, garante que, se a fonte travar, todas as transações que ela confirmou foram transmitidas para pelo menos uma réplica.
Para obter a melhor integridade de replicação, escolha a replicação semi-síncrona. Para configurá-lo, no primeiro nó, db1 (192.168.0.61), adicione as seguintes linhas dentro de /etc/my.cnf (deve estar na seção [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON
No segundo nó, db2 (192.168.0.62), adicione as seguintes linhas dentro de /etc/my.cnf (deve estar na seção [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON
Podemos então prosseguir para configurar o link de replicação conforme descrito em "Configurando o link de replicação" mais abaixo.
Replicação assíncrona
Para replicação assíncrona, basta remover todas as opções relacionadas à replicação semi-síncrona e devemos estar bem. No primeiro nó, db1 (192.168.0.61), adicione as seguintes linhas dentro de /etc/my.cnf (deve estar na seção [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
No segundo nó, db2 (192.168.0.62), adicione as seguintes linhas dentro de /etc/my.cnf (deve estar na seção [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
Podemos então prosseguir para configurar o link de replicação conforme descrito em "Configurando o link de replicação" abaixo.
Configurando o link de replicação
No mestre (db1), crie um usuário escravo e permita que o usuário se conecte de todos os hosts nesta rede (usando % curinga):
mysql> CREATE USER 'slave'@'192.168.0.%' IDENTIFIED WITH mysql_native_password BY '[email protected]&9';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%';
No escravo (db2), redefina os logs binários, configure as credenciais de replicação e inicie o processo de replicação:
mysql> RESET MASTER;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.61', MASTER_USER = 'slave', MASTER_PASSWORD = '[email protected]&9', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Verifique o status da replicação:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.61
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000008
Read_Master_Log_Pos: 912
Relay_Log_File: db2-relay-bin.000007
Relay_Log_Pos: 1081
Relay_Master_Log_File: binlog.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 912
Relay_Log_Space: 1500
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 66
Master_UUID: f60cf793-1feb-11eb-af72-5254008afee6
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:5-7
Executed_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:1-7
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
Preste atenção ao seguinte status importante para determinar se a replicação está configurada corretamente e o escravo alcançou o mestre:
- Slave_IO_Running:Sim
- Slave_SQL_Running:Sim
- Seconds_Behind_Master:0
Se a replicação semi-síncrona estiver habilitada, você deverá obter a seguinte saída no mestre:
mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_slave_status | OFF |
+-----------------------------+-------+
Enquanto no escravo, o status é o seguinte:
mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_slave_status | ON |
+-----------------------------+-------+
Para replicação assíncrona, a consulta acima não deve retornar nada (conjunto vazio), pois os plugins de replicação semi-síncrona não estão habilitados. Em um conjunto de replicação, é possível ter uma combinação de hosts escravos replicando com replicação assíncrona e semi-síncrona.
Implantando o Percona Server para MySQL usando ClusterControl
É praticamente fácil implantar uma replicação de servidor Percona mestre-escravo com o ClusterControl e, por padrão, o ClusterControl configurará a implantação da replicação com uma replicação assíncrona. Basta preparar os nós que você deseja implantar e, neste exemplo, implantaremos um servidor Percona de três nós para MySQL 8.0 com replicação mestre-escravo. Com ClusterControl entra em cena, somos obrigados a ter um nó adicional para ClusterControl. Portanto, nossa configuração fica assim:
- ClusterControl - cc (192.168.0.19)
- Mestre - db1 (192.168.0.61)
- Escravo - db2 (192.168.0.62)
- Escravo - db3 (192.168.0.63)
No servidor ClusterControl, instale o ClusterControl usando o script do instalador. Como root, execute o seguinte:
$ wget http://severalnines.com/downloads/cmon/install-cc
$ chmod 755 install-cc
$ ./install-cc
Siga as instruções de instalação até terminar. Em seguida, abra um navegador da Web e acesse http://{ClusterControl_IP_address}/clustercontrol e crie um usuário e senha de administrador padrão. Em seguida, precisamos configurar o SSH sem senha do servidor ClusterControl para todos os nós do banco de dados. Como usuário root, precisamos primeiro gerar uma chave SSH:
$ whoami
root
$ ssh-keygen -t rsa # press Enter on all prompts
Em seguida, copie a chave pública SSH criada para todos os nós do banco de dados:
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db1
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db2
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db3
Agora estamos prontos para iniciar a implantação do cluster. Vá para ClusterControl -> Deploy -> MySQL Replication e especifique os detalhes necessários conforme abaixo:
Em seguida, clique em "Continuar" para prosseguir para a próxima etapa onde configuramos a especificação de instalação do MySQL:
Escolha "Percona" para o fornecedor e 8.0 como a versão. Mantenha o resto como padrão e digite a senha de root do MySQL. Clique em "Continuar" para prosseguir para a configuração do host e da topologia:
Especifique o endereço IP ou nome de host dos hosts do banco de dados um por um e faça certifique-se de obter os ícones verdes após cada inserção. Isso indica que o ClusterControl é capaz de alcançar os hosts correspondentes via SSH sem senha com o usuário e a chave SSH fornecidos conforme definido na etapa 1. Clique no botão "Implantar" para iniciar a implantação.
ClusterControl então aciona um trabalho de implantação onde você pode monitorar o progresso da implantação indo para ClusterControl -> Activity -> Jobs -> Create Cluster -> Full Job Details, conforme mostrado na captura de tela a seguir:
Depois que o processo for concluído, você verá que o cluster está listado no Painel :
É isso. A implantação agora está concluída.