A realização de um upgrade de banco de dados em produção exige planejamento e validação cuidadosa. Antes de direcionar a aplicação para uma nova versão, é importante avaliar o comportamento das consultas e identificar possíveis problemas de compatibilidade ou desempenho.
Demonstração de uma estratégia para validar um novo ambiente MySQL 8.4 antes de realizar o upgrade do ambiente atual MySQL 8.0.
Para isso, utilizarei o ProxySQL Query Mirroring, permitindo que consultas executadas no MySQL 8.0 sejam espelhadas/replicadas para o MySQL 8.4, possibilitando validar o novo ambiente com tráfego real antes do cutover.
Cenário do laboratório
| Servidor | Sistema Operacional | MySQL | IP | Função |
|---|---|---|---|---|
| Servidor atual | Oracle Linux 7 | MySQL 8.0.45 | 192.168.18.121 | Ambiente atual |
| Novo servidor | Oracle Linux 10 | MySQL 8.4.10 | 192.168.18.122 | Futuro ambiente |
Arquitetura
|
1 2 3 4 5 6 7 8 9 10 11 |
Aplicação | v ProxySQL | +---------+---------+ | | v v MySQL 8.0.45 MySQL 8.4.10 Produção Mirror 192.168.18.121 192.168.18.122 |
Configurando o ProxySQL
Iniciamos o serviço:
|
1 |
systemctl enable --now proxysql |
Conectamos na interface administrativa do ProxySQL:
|
1 |
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt 'ProxySQL Admin> ' |
Adicionando os servidores MySQL
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# NO PROXYSQL ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.18.121',3306); ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (2,'192.168.18.122',3306); ProxySQL Admin> UPDATE global_variables SET variable_value='proxy_user' WHERE variable_name='mysql-monitor_username'; ProxySQL Admin> UPDATE global_variables SET variable_value='proxy_user' WHERE variable_name='mysql-monitor_password'; ProxySQL Admin> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ( 'mysql-monitor_connect_interval', 'mysql-monitor_ping_interval', 'mysql-monitor_read_only_interval' ); ProxySQL Admin> LOAD MYSQL VARIABLES TO RUNTIME; ProxySQL Admin> SAVE MYSQL VARIABLES TO DISK; ProxySQL Admin> LOAD MYSQL SERVERS TO RUNTIME; ProxySQL Admin> SAVE MYSQL SERVERS TO DISK; |
Também precisa criar o user no mysql
|
1 2 3 |
mysql> DROP USER proxy_user; mysql> CREATE USER proxy_user IDENTIFIED BY 'proxy_user'; mysql> GRANT REPLICATION CLIENT ON *.* TO 'proxy_user'; |
O hostgroup 1 será utilizado pelo MySQL 8.0.45, enquanto o hostgroup 2 será utilizado pelo MySQL 8.4.10 como servidor de mirror.
Configurando o Query Mirroring e usuarios de acesso.
Agora vamos criar uma regra para que as consultas SELECT sejam encaminhadas normalmente para o MySQL 8.0 e também espelhadas para o MySQL 8.4.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# INSERINDO USUARIOS / NO PROXYSQL: ProxySQL Admin> INSERT INTO mysql_users(username,password,default_hostgroup)VALUES ('root','rootlab',1); ProxySQL Admin> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('hrproxy','hrproxy',1); #REGRAS DO MIRROR ProxySQL Admin> INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, mirror_hostgroup, apply , match_digest) VALUES (1, 1, '.', 1, 2, 1, '(?i)^SELECT'); ProxySQL Admin> LOAD MYSQL USERS TO RUNTIME; ProxySQL Admin> SAVE MYSQL USERS TO DISK; ProxySQL Admin> LOAD MYSQL QUERY RULES TO RUNTIME; ProxySQL Admin> SAVE MYSQL QUERY RULES TO DISK; ProxySQL Admin> select rule_id, active, match_pattern, destination_hostgroup, mirror_hostgroup, apply , match_digest from mysql_query_rules; ProxySQL Admin> SET mysql-mirror_max_concurrency=64; ProxySQL Admin> SET mysql-mirror_max_queue_length=10000; ProxySQL Admin> LOAD MYSQL VARIABLES TO RUNTIME; ProxySQL Admin> SAVE MYSQL VARIABLES TO DISK; |
A aplicação continua recebendo a resposta do MySQL 8.0.45, enquanto uma cópia da consulta é enviada para o MySQL 8.4.10.
Métricas no ProxySQL
|
1 2 3 4 5 6 7 8 9 10 11 |
#metricas no proxysql mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt 'ProxySQL Admin> ' ProxySQL Admin> SELECT hostgroup, srv_host, srv_port, Queries, Bytes_data_sent, Bytes_data_recv, Latency_us FROM stats_mysql_connection_pool ORDER BY hostgroup, srv_host; ProxySQL Admin> SELECT hostgroup, count_star, sum_time, digest_text FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' ORDER BY hostgroup, count_star DESC; |
Conclusão
O ProxySQL Query Mirroring permite validar o novo ambiente MySQL 8.4 utilizando consultas reais do ambiente atual, sem alterar inicialmente o servidor que atende a aplicação.
Essa estratégia pode ajudar o Administrador de banco de dados a identificar problemas de compatibilidade, comportamento e desempenho antes da mudança definitiva para o novo ambiente.
Após a validação, o próximo passo pode ser o cutover, direcionando o tráfego da aplicação do MySQL 8.0 para o MySQL 8.4.
Hands-on
Links uteis:





