Há diferentes razões para atualizar seus bancos de dados. Pode ser aplicar correções de segurança, usar novos recursos, resolver problemas de compatibilidade ou apenas manter seu sistema atualizado. Essa atualização pode ser uma atualização principal ou secundária e, dependendo da tecnologia, existem diferentes abordagens para fazer esse trabalho, mas se você precisar que seus sistemas funcionem o tempo todo com tempo de inatividade zero, realizar uma atualização sem interrupção pode ser a melhor opção .
Neste blog, veremos algumas considerações a serem levadas em consideração antes de atualizar e como realizar uma atualização sem interrupção no MySQL.
Atualizações secundárias vs. principais
Em geral, atualizações menores são seguras na medida em que você pode facilmente fazer downgrade ou reverter e devem ser compatíveis com os pacotes e recursos anteriores.
A atualização de versão principal envolve alguns riscos, como remoção de pacote de banco de dados, compatibilidade de configuração e conectores, recursos obsoletos e muito mais.
Assim, mesmo quando o teste é importante para ambos os cenários, no caso de grandes atualizações, é imprescindível se você quiser evitar problemas sérios para o seu negócio.
Antes de atualizar
Agora, vamos ver algumas considerações antes de atualizar, para evitar problemas futuros.
Backups
Os backups são sempre importantes, e ainda mais se você deseja atualizar seu banco de dados. Se algo der errado e outras opções de recuperação de desastres falharem, você precisará de um backup para restaurar seu banco de dados. Portanto, antes de iniciar a tarefa, faça um backup completo (físico e/ou lógico) do seu banco de dados atual e mantenha-o seguro até ter certeza de que tudo está funcionando corretamente por alguns dias/semanas.
Revisar recursos obsoletos
Se você estiver usando um recurso obsoleto na nova versão, seu aplicativo poderá falhar e você precisará reverter para recuperar seus sistemas, o que gerará tempo de inatividade (depende da abordagem) e um perda de tempo. Verificar o recurso obsoleto e compará-lo com os que você está usando evitará essa tentativa de atualização com falha.
Teste
Isso é importante não apenas para atualizações, mas também para qualquer alteração em seu banco de dados ou aplicativo. Ter um ambiente de teste que replica o ambiente de produção pode economizar seu tempo e evitar problemas inesperados durante qualquer atualização ou alteração do banco de dados.
Reversão
Em qualquer atualização, é importante ter um rollback pronto para ser usado se necessário para ter seu banco de dados funcionando o mais rápido possível. Caso contrário, isso pode afetar seu RTO (objetivo de tempo de recuperação) caso você precise recriar o cluster de um backup ou de outra opção de plano de recuperação.
Lembre-se de que, às vezes, os downgrades não são possíveis, portanto, você deve ter um plano secundário caso precise reverter suas alterações.
Verificações de fornecedores
Dependendo do fornecedor e da versão, você pode usar o comando mysqlcheck para realizar a verificação preliminar em sua instalação atual e confirmar que está pronto para começar.
$ mysqlcheck -u root -p --all-databases --check-upgrade
Enter password:
mysql.columns_priv OK
mysql.db OK
mysql.engine_cost OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.server_cost OK
mysql.servers OK
mysql.slave_master_info OK
mysql.slave_relay_log_info OK
mysql.slave_worker_info OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
sys.sys_config OK
Esta é a primeira verificação a ser executada antes da atualização e verificará se não há:
- Tabelas que usam tipos de dados ou funções obsoletas
- Arquivos frm órfãos
- Triggers com definidor ausente ou vazio ou um contexto de criação inválido
Há mais algumas coisas que você precisa verificar, mas para evitar uma postagem extensa no blog, você pode consultar a documentação oficial do MySQL para isso.
Atualizações contínuas manuais para MySQL
Existem diferentes abordagens para realizar uma atualização sem interrupção. Pode estar no lugar, usando replicação ou até mesmo uma mistura deles. De qualquer forma, se você deseja evitar o tempo de inatividade, não deve realizar alterações em seu aplicativo durante a atualização. Para isso, você pode adicionar um Load Balancer na frente de seus bancos de dados. Seu aplicativo se conectará ao seu Load Balancer e redirecionará o tráfego para os nós disponíveis.
Digamos que você tenha uma Replicação MySQL com 1 nó mestre e 2 nós escravos e 1 nó HAProxy na frente deles:
Uma maneira simplificada de realizar uma atualização manual sem interrupção neste ambiente pode ser:
- Desabilite um nó escravo do seu HAProxy
- Certifique-se de que não haja tráfego neste nó escravo
- Atualize o nó escravo manualmente
- Verifique o status da replicação para certificar-se de que está atualizado
- Desative o nó mestre em seu HAProxy
- Certifique-se de que não haja tráfego em seu nó mestre
- Promova o nó escravo atualizado
- Ative-o em seu HAProxy
- Confirme se o novo mestre está recebendo tráfego
- Reconfigure seu segundo escravo para replicar do novo mestre
- Desabilite o segundo escravo do seu HAProxy
- Certifique-se de que não haja tráfego neste nó escravo
- Atualize o nó escravo manualmente
- Verifique o status da replicação para certificar-se de que está atualizado
- Ative-o em seu HAProxy
- Confirme se o nó escravo está recebendo tráfego (se necessário)
- Reconfigure seu antigo mestre para replicar do novo mestre
- Atualize o nó mestre antigo manualmente
- Verifique o status da replicação para certificar-se de que está atualizado
- Ative-o em seu HAProxy
- Confirme se o antigo mestre (agora escravo) está recebendo tráfego (se necessário)
Como você pode ver, mesmo de forma simplificada, esta tarefa requer muitas etapas, e significa mais possibilidades de algo dar errado.
Atualizações contínuas do ClusterControl para MySQL
A melhor maneira de reduzir a possibilidade de falha é automatizar todas (ou quase todas) essas etapas. Usando o ClusterControl, você pode realizar uma pequena atualização sem interrupção do seu cluster MySQL com apenas alguns cliques.
Para fazer isso, vá para ClusterControl -> Select Cluster -> Manage -> Upgrades, onde você vê a opção Upgrade.
As atualizações estão online e são executadas em um nó por vez. O nó será interrompido, o software será atualizado e, em seguida, o nó será iniciado novamente. Se um nó não for atualizado, o processo será abortado.
Se você escolher a opção Upgrade, verá uma confirmação sobre a versão que será atualizada:
E você só precisa pressionar Upgrade para confirmar este trabalho. Depois disso, você pode monitorar o processo de atualização na Seção de Atividade do ClusterControl:
Ao mesmo tempo, o ClusterControl reconfigurará seus Load Balancers para enviar o tráfego para os nós disponíveis.
O ClusterControl suporta apenas atualizações secundárias, porque, como mencionamos anteriormente, uma atualização importante é uma tarefa arriscada que requer testes e pesquisas para garantir que seu aplicativo funcione bem na nova versão principal.
Conclusão
A atualização é uma tarefa importante em todas as empresas e pode ser arriscada se você não tomar certas precauções e seguir todas as etapas de atualização corretamente.
Neste blog, mencionamos algumas considerações a serem consideradas antes de atualizar seu banco de dados e mostramos a diferença entre fazer essa tarefa manualmente e usar o ClusterControl, que ajuda a minimizar a possibilidade de falha.