Executando verificação de segurança...
63

Como o Uber atualizou sua infraestrutura MySQL da versão 5.7 para 8.0

O Uber atualizou sua infraestrutura MySQL da versão 5.7, lançada em 2015, para a 8.0, de 2018. Mas por que essa atualização foi necessária? E por que não optar pela versão LTS mais recente, o MySQL 8.4, lançado em 2024? Alguns engenheiros do Uber compartilharam esse processo no blog da empresa, e eu resumi os principais pontos. Você vai ver como eles planejaram essa transição, a estratégia adotada e, o mais importante, se a mudança realmente valeu a pena.

Por que atualizar?

No ano de 2023, o Uber decidiu atualizar sua infraestrutura MySQL. Um dos principais motivos era o fim do suporte estendido para a versão 5.7, que aconteceria em outubro de 2023. Além disso, a equipe do Uber levantou outros benefícios que teriam ao atualizar a versão:

  • Melhor desempenho e concorrência no MySQL 8.0.
  • Novas funcionalidades como suporte para funções de janela (window functions), tratamento JSON aprimorado e melhores recursos de dados espaciais.
  • Rotação de senhas: dual passwords.
  • Tempo de inatividade reduzido durante alterações de esquema com INSTANT ADD.

Além disso, como a nova versão LTS do MySQL foi lançada apenas em 2024 (vide tabela abaixo), realizar uma mudança de rota para utilizar a versão mais recente teria um risco maior.

VersãoData de lançamentoFim do suporte estendido
8.4 (LTS)10/04/202430/04/2032
8.0 (LTS)08/04/201830/04/2026
5.709/10/201531/10/2023

Fonte.

A infraestrutura

Terminando o ano de 2023 com 150 milhões de usuários ativos e com mais de 9.4 bilhões de viagens realizadas pelo app, a infraestrutura MySQL do Uber contava com:

  • 2.100 clusters, distribuídos em 19 zonas, com mais de 16.000 nós.
  • Múltiplos petabytes de dados, com 3 milhões de consultas por segundo.
  • Arquitetura em cluster para redundância.
  • Replicação Primária-Secundária: em cada cluster, um nó primário gerencia todo o tráfego de escrita, enquanto nós secundários replicam dados de forma assíncrona.

Essa forma de replicação traz uma consideração extra sobre o planejamento da atualização: embora a replicação primária do MySQL 5.7 para a réplica de leitura do MySQL 8.0 seja compatível, o cenário inverso não é suportado.

Estratégia de atualização

A estratégia escolhida para atualizar o MySQL foi manter ambas versões executando lado a lado. Isso possibilita:

  • Tempo de inatividade mínimo.
  • Risco reduzido, com a possibilidade de reverter para os nós MySQL 5.7 caso ocorra algum problema nos nós MySQL 8.0.
  • Testar os novos nós com carga de aplicativo somente leitura em produção, antes de efetivar a troca dos nós antigos pelos novos.

Atualização dos clusters lado a lado

Após o planejamento, o Uber desenvolveu um sistema para automatizar a transição de um cluster MySQL 5.7 para 8.0, com alertas e monitoramento.

Passo a passo da atualização

Para conseguir atualizar conforme a estratégia definida, os passos são os seguintes:

  1. Replicação de nós: para cada nó MySQL 5.7 no cluster, um nó de réplica MySQL 8.0 correspondente é adicionado na mesma região/zona.
  2. Período de imersão: período de monitoramento de uma semana para observar o desempenho do sistema e detectar degradações ou violações de SLA causadas pelos nós de versão mais recente.

Criação das réplicas no MySQL 8.0

  1. Desvio de tráfego: os nós de réplica do MySQL 5.7 são desabilitados para desviar o tráfego deles.
  2. Promoção de nó primário: um nó MySQL 8.0 é promovido ao status primário do cluster. Tentar reverter essa promoção pode acarretar em perda de dados, pois quaisquer alterações feitas no nó MySQL 8.0 primário não seriam replicadas de volta para o MySQL 5.7 por questões de compatibilidade.

Desabilitando nós do MySQL 5.7

  1. Remoção de nós antigos: todos os nós MySQL 5.7 são removidos.

Remoção dos nós MySQL 5.7

Problemas na atualização

Durante o processo de atualização, ocorreram alguns problemas:

  • Mudança de plano de execução das consultas: alguns clusters tiveram um aumento de latência e consumo de recursos. Para resolver esse problema, o Uber colaborou com a Percona, identificaram uma correção de patch e a implementaram nos clusters afetados.
  • Consultas e configurações não suportadas: alterações de sintaxe de certas palavras-chave interromperam algumas consultas. Além disso, uma parte dos clusters não tinha o modo STRICT_TRANS_TABLES habilitado, que é uma configuração padrão no MySQL 8.0. Isso resultou em erros durante o procedimento de atualização. Também ocorreram erros com o modo ONLY_FULL_GROUP_BY.
  • Mudança no collation padrão: no MySQL 8.0, o conjunto de caracteres padrão é utf8mb4, acompanhado pelo collation utf8mb4_0900_ai_ci. O MySQL 5.7 usava utf8mb4_unicode_520_ci, sem suporte para o mais recente utf8mb4_0900_ai_ci.
  • Incompatibilidade da biblioteca do cliente: Muitas bibliotecas de cliente existentes eram incompatíveis com o MySQL 8.0, então precisaram atualizá-las também.

Resultados

Mesmo com as dificuldades enfrentadas, ao trabalhar com a Percona, o Uber garantiu que não estaria atualizando para algo pior. As melhorias foram significativas, o que possibilitou o Uber otimizar sua infraestrutura e abre a possibilidade de manter uma operação mais escalável com o mesmo poder computacional, ou reduzir a infraestrutura para uma operação mais econômica.

Os resultados apresentados no artigo original são:

  • Melhoria de 29% na latência do p99 para 1 milhão de inserções em 1024 threads.
    Gráfico de barras para inserções

  • Melhoria de 33% na latência do p99 para 1 milhão de leituras em 1024 threads.
    Gráfico de barras para leituras

  • Melhoria de 47% na latência do p99 para 1 milhão de atualizações em 1024 threads. (talvez este percentual esteja errado, porque no gráfico não aparenta ser 47%)
    Gráfico de barras para atualizações

  • ~94% de redução no tempo geral de bloqueio (lock) do banco de dados.
    Gráfico de bloqueio

  • ~78% de redução no tempo de consulta para algumas consultas.
    Gráfico de tempo de queries

Carregando publicação patrocinada...
15
3

Vamos entender esse artigo de forma bem simples, passo a passo. Vou usar comparações fáceis para te ajudar a visualizar como foi a atualização que o Uber fez no sistema de banco de dados deles.

O que é um banco de dados?

Um banco de dados é como um grande armário onde você guarda informações organizadas. Pense no Uber: ele precisa guardar dados como nomes de usuários, corridas realizadas, pagamentos, avaliações, e muito mais.

Agora, imagine que o armário que eles usavam (o MySQL 5.7) estava ficando velho e com algumas limitações. Era hora de trocar por um armário mais novo, mais rápido e com mais espaço (o MySQL 8.0).

Por que o Uber atualizou o banco de dados?

  1. Fim do suporte: O "armário antigo" (MySQL 5.7) não ia mais receber atualizações nem consertos, então seria arriscado continuar usando.
  2. Melhorias no novo armário (MySQL 8.0):
    • Mais rápido: Ele consegue atender mais usuários ao mesmo tempo.
    • Funcionalidades novas: Por exemplo, consegue organizar melhor dados em "gavetas" novas (funções como "funções de janela" e tratamento de dados JSON, que é como guardar arquivos organizados em envelopes).
    • Alterações rápidas: Conseguem mudar as prateleiras sem precisar desmontar todo o armário.

Como era a infraestrutura do Uber?

  • Tamanho gigante: O Uber tinha 2.100 armários (clusters de bancos de dados) espalhados por várias cidades (19 zonas).
  • Muitas gavetas: Mais de 16.000 prateleiras (nós).
  • Movimentação constante: Eles atendem 3 milhões de pedidos por segundo. Ou seja, precisa ser um sistema muito ágil e estável.

Agora, atualizar um sistema assim grande não é como trocar um armário em casa. Eles precisavam de um plano para trocar o velho pelo novo sem causar "bagunça".

Como foi a atualização?

Eles fizeram a transição devagar, sem parar o serviço. Aqui está o plano:

  1. Instalar o armário novo ao lado do velho:

    • Eles colocaram os bancos de dados MySQL 8.0 ao lado dos MySQL 5.7 e deixaram os dois funcionando juntos por um tempo.
  2. Testar o armário novo:

    • Antes de "transferir as gavetas", eles testaram o MySQL 8.0 para ver se ele aguentava o trabalho.
    • Se algo desse errado, eles poderiam voltar a usar o MySQL 5.7.
  3. Transferir as gavetas:

    • Depois de garantir que o novo sistema estava funcionando bem, transferiram os dados do MySQL 5.7 para o 8.0.
  4. Remover o armário velho:

    • Por fim, eles desligaram o MySQL 5.7.

Quais problemas apareceram?

Mesmo com planejamento, alguns desafios surgiram:

  1. Mudança na organização das gavetas:

    • Algumas gavetas (consultas) ficaram mais lentas porque o novo armário organiza as coisas de forma diferente. Eles resolveram ajustando o software.
  2. Palavras diferentes:

    • O MySQL 8.0 "fala" de forma um pouco diferente. Algumas instruções que funcionavam no MySQL 5.7 não funcionavam no 8.0.
  3. Formato de letras:

    • O MySQL 8.0 usa um "alfabeto" diferente (collation padrão). Isso causou erros com dados que tinham caracteres especiais.
  4. Ferramentas antigas:

    • Alguns "acessórios" que eles usavam para interagir com o banco de dados eram incompatíveis e precisaram ser atualizados.

Valeu a pena?

Sim! Mesmo com os desafios, os resultados foram ótimos:

  1. Mais rápido:

    • Inserir dados ficou 29% mais rápido.
    • Ler dados ficou 33% mais rápido.
    • Atualizar dados ficou 47% mais rápido.
  2. Menos filas e atrasos:

    • As "travas" que seguravam o banco de dados foram reduzidas em 94%.
  3. Economia:

    • Com um banco de dados mais eficiente, o Uber pode usar menos computadores e ainda assim atender o mesmo número de pessoas.

Por que não usar a versão mais nova (8.4)?

O Uber não usou o MySQL 8.4 porque:

  • Foi lançado apenas em 2024, e a atualização começou em 2023.
  • Eles preferiram algo já testado e confiável (8.0), em vez de arriscar usar algo tão novo.
1

Cara, muito obrigado por teres feito escrito essa explicaçao, não só é útil para o cara que disse não entender mas para outros como também.

E ainda estou com uma dúvida, as pessoas tendem a não confiar muito MySql(não sei o motivo) mas a Uber que é uma empresa gigante usa sem nenhum problema e tem atendido um grande número de requisões(3 milhoes/s) qual MySql eles usam? o MySql pago ou o MariaDB que é gratuito?

1
4

Um dos melhores artigos que li no TabNews, parabéns! É incrível essa transição com uma base de dados tão grande como essa. As melhorias dessa mudança compensam todo o trampo que teve.

1
1
1
1

Se eles tiveram problema com ONLY FULL GROUP BY e certamente resolveram por remover essa diretiva... fico mais tranquilo pq achei que eu sempre programei errada minhas queries rs.

1

Esse fórum nasceu pra esse tipo de coisa! Obrigado pelo ótimo post! 💯

E que interessante e "simples" (do ponto de vista conceitual) essa estratégia da Uber de usar ambos os lado a lado!

0
1