Desenvolvimento

28 jul, 2016

Engenharia de Micro Deploy do Uber: deploy diário com confiança

Publicidade

Em 2014, Uber o começou a se expandir cada vez mais rapidamente. Nossa plataforma cresceu de cerca de 60 cidades para 100 na primavera, e depois para 200 no outono (estações correspondentes ao hemisfério norte). Enquanto isso, as nossas cidades de mais rápido crescimento estão entre as nossas mais antigas.

À medida que o número de engenheiros adicionais da plataforma cresceu, também aumentou a desorganização do deploy do novo código. Cada equipe usou seus próprios scripts shell personalizados para enviar novas versões de seus microsserviços para produção, monitorando-os manualmente com ferramentas específicas do serviço. Quando a atualização dos hosts dá errado, engenheiros tediosamente revertem uma máquina de cada vez. Com mais e mais engenheiros trabalhando nos serviços do Uber, esse trabalho manual não poderia escalar e às vezes era a causa de prolongadas interrupções.

Como é que aprendemos a fazer deploy de forma consistente todos os dias? Nós desenvolvemos o Micro Deploy (conhecido como μDeploy), o nosso sistema de deploy in-house que faz build, upgrades, e rolls back no Uber.

O processo de deploy diário

Engenheiros do Uber usam o Micro Deploy quando seu código está pronto para produção, ou seja, revisado, aceito, passado em todos os testes unitários, e feito o merge no repositório. Em primeiro lugar, o engenheiro seleciona um serviço para atualização da interface do μDeploy. Para iniciar um fluxo de trabalho de atualização, eles selecionam um deploy e o referem a uma versão do código-fonte no repositório Git.

deploy-1

Nos bastidores, o μDeploy faz o build do serviço conforme necessário, distribui o build, fala com os masters relevantes nos data centers corretos, e faz cada agente atualizar o serviço nos hosts marcados para o deploy. Ao longo do processo, a UI do μDeploy dá feedback visual sobre o estado da implementação até que o fluxo de trabalho seja concluído para que o engenheiro passe para outra tarefa.

Dessa forma, o μDeploy faz deploy e rolls out para a maioria dos serviços em poucos minutos. Essa também é a rapidez com que um engenheiro tem um impacto.

O intervalo entre um engenheiro escrever o código e este ir para o sistema em produção no Uber é incrivelmente curto. O crescimento do Uber não diminuiu desde que foi lançada a versão inicial do μDeploy. A cada semana, em 2016, milhares de engenheiros empurraram para produção vários milhares de build de serviços, 10% dos quais o μDeploy rejeitou após monitoramento, fazendo o rollout para a versão anterior. Isso significa que alguma parte do sistema do Uber começa a atualizar a cada minuto durante as horas de trabalho. Como as atualizações normalmente demoram mais de um minuto, o sistema está sempre a caminho de uma nova versão.

Nossa missão: deploy com confiança

O Micro Deploy é composto de muitos microsserviços, e a maioria deles faz deploy com o μDeploy:

deploy-2

  • A UI de uma aplicação web mais CLI permite aos engenheiros escolher a forma de interagir com o μDeploy.
  • Agentes μDeploy são executados em cada máquina de nossos data centers. O agente instala e reconfigura serviços quando instruído pelo seu μDeploy master. O agente também reporta o estado da máquina para o master com uma visão completa de cada serviço.
  • Masters μDeploy controlam a forma como os agentes μDeploy se comportam em todas as máquinas em um data center. Cada data center tem pelo menos um master.
  • As interfaces agregadoras do μDeploy têm um master em cada data center para gerenciar deploys por toda parte.
  • Um sistema que chamamos uBuild faz o build dos serviços antes do rollout em um único cluster de máquinas uBuild e depois as distribui para todos os data centers.
  • Replicadores μDeploy copiam o build final entre eles e para os data centers.
  • Orquestradores μDeploy gerenciam fluxos de trabalho de rollout de uma forma distribuída e tolerante a falhas.
  • Colocação μDeploy localiza um conjunto de máquinas host para o deploy de um serviço.
  • Um sistema que chamamos uConfig permite alterações de configuração de serviço, da mesma forma que as atualizações de serviço.

Que características são importantes em um sistema de deploy?

Uma combinação de características tornam o Micro Deploy um sistema de gestão de compilação e deploy completo para nós. Isto é o que nós consideramos ser importante desenvolver para um sistema de deploy para sistemas de infraestrutura como o do Uber:

  • Builds consistentes para diferentes serviços. Micro Deploy é um sistema de build integrado para todos os tipos de serviços no Uber. Python com Tornado? JavaScript com Node.js? Go, Java com Docker e sem containers? Sim. O sistema μDeploy build lida com muitas linguagens de programação e máquinas com diferentes características de software. Nosso sistema de build integrado padroniza a implantação de serviços de produção.
  • Tempo de inatividade zero para upgrades. O sistema de deploy global gradual do Micro Deploy faz deploy da mesma versão do software para vários data centers de diferentes funções e configurações. Deploys totalmente automatizados permitem a qualquer engenheiro voltar à versão anterior em seus próprios serviços em nível mundial. Nós podemos estar sozinhos, juntos.
  • Detecção antecipada e automatizada de erro. O Micro Deploy integra sistemas de monitoramento que detectam anomalias muito rapidamente. Os humanos não têm que prestar atenção na degradação significativa do desempenho de I/O, exceções não pegas, erros no código HTTP, ou problemas com o pedido de transferência de carga do servidor. μDeploy usa esses dados de monitoramento para garantir que o sistema permanece estável durante o lançamento de uma nova versão.
  • Prevenção de interrupção. O Micro Deploy usa os dados de monitoramento para parar e reverter um deploy de uma versão estável, no caso de uma anomalia. Nós ocasionalmente vemos falsos positivos, mas é melhor prevenir do que remediar. Rollback é automático e muitas vezes ocorre muito antes de todos os hosts terem a nova versão. Idealmente, a reversão ocorre em uma área canary, onde um lote pequeno o suficiente de máquinas serve de salvaguarda para eventuais falhas que podem ter impacto externo. Temos que manter essas adições indisciplinadas contidas antes de tornar o nosso curta de cinco minutos sobre o mais recente teste de desenvolvimento em um filme sobre o controle de danos e as máquinas frustrando tudo o que estávamos trabalhando.
  • Rollouts de confiança. O fluxo de trabalho altamente configurável do Micro Deploy orquestra as várias fases dos upgrades. Como um sistema distribuído, o μDeploy pode sobreviver ao desligamento inesperado de qualquer servidor ou rack (incluindo os hosts executando o fluxo de trabalho) durante essas atualizações.
  • Fácil de usar. O aplicativo baseado na web do Micro Deploy expõe todas essas características em uma interface de usuário muito rica. Qualquer engenheiro pode acessar o μDeploy via browser e fazer deploy de seus serviços em produção imediatamente.
  • API REST para uma integração mais profunda. A API REST do Micro Deploy permite que ferramentas de terceiros interajam com suas características.

De missão para comissionamento

Nós projetamos o Micro Deploy para evitar processos de deploy desnecessários e criar a confiança de que o rollout pode ocorrer corretamente. Caso contrário, o sistema pega o bug ocasional da atualização rapidamente, com consequências mínimas para a produção. Dessa forma, se cometermos um erro casual, nós estamos apenas trabalhando no sistema. Como muitas outras iniciativas importantes da engenharia no Uber, o μDeploy foi concebido, implementado na sua forma inicial, e lançado em produção em vários meses bem divertidos.

Depois de dois meses de desenvolvimento, nós colocamos os primeiros serviços do Uber no Micro Deploy, e 50% de todos os serviços estavam usando o μDeploy em seus primeiros cinco meses de produção. Isso é produtividade!

Em meados de 2016, o backend do Uber está em uma mudança constante, um sistema maciçamente distribuído por vários data centers. Nossos engenheiros estão agora espalhados por uma dúzia de escritórios em vários países e continentes. Noventa e nove por cento de todos os envios de software do Uber são feitos com o μDeploy; isso é um A+! O Micro Deploy dá aos nossos engenheiros em todos os lugares velocidade, autonomia e poder final. Engenheiros escrevem o código, analisam, testam e colocam em produção no mesmo dia.

O Micro Deploy tem impactado significativamente nossa engenharia, e estamos animados em continuar a adicionar melhorias à medida que aprendemos sobre como outras empresas de tecnologia distribuem seus deploys. Builders, continuem com os builds!

***

Este artigo é do Uber Engineering. Ele foi escrito por Mathias Schwarz, engenheiro de software no escritório de engenharia Aarhus do Uber. A tradução foi feita pela Redação iMasters com autorização. Você pode conferir o original em: https://eng.uber.com/micro-deploy/