A interrupção do Braze em 29 de abril: o que aconteceu, por que ocorreu e como estamos respondendo

Publicados: 2024-05-04

Na segunda-feira, 29 de abril de 2024, os clusters da plataforma Braze nos EUA sofreram uma interrupção quase total que persistiu total ou parcialmente por quase 11 horas, impactando o acesso do cliente ao nosso painel, bem como o processamento de dados e envio de mensagens. Nos 13 anos de história da Braze, este é o primeiro e único incidente desta magnitude que já tivemos. Nosso relacionamento com os clientes é baseado na confiança e sempre tivemos um enorme orgulho em construir sistemas resilientes que permitiram que nossa plataforma permanecesse disponível e com bom desempenho, mesmo sob cargas de trabalho exigentes. Durante esta interrupção, não cumprimos essa promessa e lamentamos profundamente o impacto que isso teve em cada um dos nossos clientes.

Para ajudá-lo a entender melhor o que aconteceu e por quê, fornecerei um contexto importante em torno de nossa arquitetura, descreverei as causas da interrupção em detalhes, orientarei você nas alterações que já fizemos e delinearemos no que estaremos trabalhando. implementar no curto prazo e no futuro.

Compreendendo a arquitetura de serviços da plataforma Braze

A Braze mantém conjuntos separados de servidores para cada um dos nossos oito clusters nos EUA. Os clusters Braze US 01 a 07 estão hospedados na Amazon Web Services (AWS), enquanto o cluster Braze US 08 está hospedado no Microsoft Azure. Em cada um desses ambientes, o Braze utiliza múltiplas zonas de disponibilidade e possui redundâncias para cada parte do nosso sistema. No caso de uma falha na zona de disponibilidade, desabilitamos de forma rotineira e transparente o roteamento e o processamento das zonas de disponibilidade prejudicadas. Isso nos permite manter de forma confiável a capacidade de entrega do serviço durante uma interrupção do provedor de serviços em nuvem.

Com poucas exceções, cada um dos clusters dos EUA tem a sua própria infraestrutura dedicada e, exceto por alguns componentes que são usados ​​em todos os ambientes de uma determinada região de nuvem, esses clusters são fortemente isolados uns dos outros, a fim de reduzir o risco. que uma interrupção em um cluster afetará outros clusters.

Devido à intensidade da carga de trabalho de processamento em tempo real da plataforma Braze, desde 2013 complementamos nosso uso de AWS e Azure com uma parceria com a Rackspace para hospedar hardware configurado de forma personalizada para executar bancos de dados MongoDB. Nossos ambientes AWS e Azure são configurados com conectores de nuvem privada AWS Direct Connect e Azure ExpressRoute, conectando o ambiente de nuvem à nossa rede interna mantida nos data centers da Rackspace por meio de um cabo de fibra óptica dedicado. Essa conexão criptografada, que é alimentada por links de rede que suportam múltiplas interfaces, enviando mais de 100 gigabits de tráfego de rede por segundo, fornece acesso de alto desempenho entre nossa nuvem e os ambientes da Rackspace.

Nosso ambiente personalizado na Rackspace abriga centenas de servidores físicos mantidos em gabinetes dedicados ao Braze. Esta configuração inclui fontes de alimentação redundantes e switches redundantes no topo do rack. Os switches top-of-rack são dispositivos de rede que ficam em um rack de servidor e conectam os dispositivos e servidores no mesmo rack de servidor. Esses switches são testados pelo menos uma vez por ano para failover sem impacto; o teste do ano passado foi realizado com sucesso em 3 de agosto de 2023. Neste ambiente personalizado, mantemos dezenas de milhares de contêineres virtualizados para bancos de dados MongoDB. Semelhante aos nossos ambientes de nuvem, mantemos altos níveis de isolamento físico entre contêineres em diferentes clusters nos EUA para minimizar interrupções e reduzir o risco de que um contêiner possa afetar outros contêineres em nossos bancos de dados.

A causa da interrupção de 29 de abril e como respondemos

A falha parcial inicial do switch

Em 29 de abril, às 09h15 UTC, houve uma falha parcial em um switch de rede Cisco Nexus primário conectado aos nossos gabinetes de servidor Rackspace. O switch com defeito falhou de uma forma que não ativou automaticamente o switch de rede secundário por meio de um failover e, em vez disso, manteve o switch com defeito como primário.

Os switches de rede roteiam o tráfego encaminhando pacotes de rede – chamados de “frames” – para seu destino. Para fazer isso de forma eficiente, esses switches mantêm uma compreensão da topologia de rede que conecta os dispositivos. É comum que as rotas de rede mudem dinamicamente em resposta a falhas ou lentidão de componentes individuais. Quando essas alterações ocorrem, os switches e outros dispositivos de rede se comunicam entre si para manter um entendimento preciso da topologia da rede.

Em grandes redes, muitas vezes existirá mais de um caminho entre os dispositivos, o que pode causar "loops" de roteamento (ou seja, uma condição em que os pacotes não param no destino pretendido e, em vez disso, retornam ao local de origem). Os loops podem criar “tempestades de transmissão”, onde o tráfego acaba circulando indefinidamente, saturando os links da rede e causando interrupções. Para evitar que isso aconteça, os switches são programados para enviar mensagens que ajudam a identificar links redundantes. Essas mensagens são chamadas de unidades de dados de protocolo de ponte spanning tree (BPDUs) e fazem parte de um protocolo de rede chamado Spanning Tree Protocol (STP). Os switches então usam essas informações para bloquear portas de tráfego, a fim de evitar a ocorrência de loops quando eles roteiam o tráfego. Se um link físico ou switch falhar, o STP ajuda a fornecer redundância, pois pode ser usado para identificar outros links físicos pelos quais o tráfego pode ser enviado e promover o link anteriormente passivo (ou seja, bloqueado) para ativo, a fim de manter as conexões.

No início do incidente de 29 de abril, quando o switch começou a funcionar mal, ele começou a encaminhar continuamente notificações de alteração de topologia e BPDUs, inundando a rede com esses avisos de alteração. Esses pacotes se propagaram para switches de distribuição e outros switches, causando um loop de comutação spanning tree que resultou em uma interrupção completa da rede. Embora o STP esteja em vigor para reduzir loops de rede, bloqueando portas de rede onde o loop é detectado, durante o incidente de 29 de abril, o tráfego de spanning tree encaminhado incorretamente do switch com defeito fez com que outros switches na rede reanalisassem suas topologias de spanning tree. Então, como esses outros switches detectaram que um pacote BPDU de alta prioridade vinha do switch com defeito, os switches de distribuição começaram a encaminhar em portas anteriormente bloqueadas e resultaram em um loop de comutação que sobrecarregou a rede e a desligou.

A correção da Rackspace

Como resultado dessa atividade, os engenheiros do data center da Rackspace receberam alertas aproximadamente às 09h20 UTC sobre problemas inesperados de conectividade de rede e começaram a resolver o problema. Entre 09h39 e 10h03 UTC, os engenheiros do data center da Rackspace suspenderam o switch de rede, desligaram e ligaram o switch primário e forçaram as placas de interface de rede (NIC) no gabinete do servidor a fazer failover para o switch secundário. Após o failover da NIC, a conectividade foi restaurada aos servidores físicos no ambiente Braze.

Como funcionam os bancos de dados Braze MongoDB

Os bancos de dados MongoDB usados ​​pelo Braze permitem que os dados sejam armazenados em vários servidores de banco de dados conhecidos como “fragmentos”. O MongoDB fornece um serviço de roteamento chamado “mongoS”, que processa consultas dos serviços da plataforma Braze, determina a localização dos dados relevantes em um cluster fragmentado e, em seguida, roteia uma consulta para o banco de dados MongoDB apropriado. Braze possui centenas de bancos de dados MongoDB distintos, compreendendo mais de 15.000 processos “mongoD”, que são os programas que executam o banco de dados e armazenam dados para um determinado fragmento do MongoDB.

Cada fragmento de banco de dados consiste em um processo mongoD primário e pelo menos dois processos mongoD secundários, o que fornece alta disponibilidade em caso de falha. Cada servidor mongoS mantém uma conexão de rede com cada mongoD para o qual pode rotear consultas. Esses processos mongoD também se conectam aos primários e secundários em sua configuração; isso é conhecido como conjunto de réplicas. Se um mongoS não conseguir se conectar a um determinado mongoD, ele marcará esse processo como offline e agendará uma nova tentativa. Da mesma forma, se um mongoD não puder se conectar a outros membros mongoD de seu conjunto de réplicas dentro de um segundo, ele atingirá o tempo limite, marcará esses processos como offline e agendará uma nova tentativa.

O impacto do loop de rede em nossos processos MongoDB e como respondemos

Durante o loop de rede, como nossos processos do MongoDB não conseguiram se conectar normalmente, cada um marcou todos os seus processos associados como offline. Ou seja, cada processo mongoS marcou todos os seus processos mongoD associados como offline e cada processo mongoD marcou seus membros do conjunto de réplicas relacionados como offline. No entanto, mesmo depois que a conectividade de rede foi restaurada aos nossos servidores físicos pela Rackspace, nem os processos mongoS nem mongoD restabeleceram todas as conexões com os outros processos que haviam sido marcados como offline.

Neste ponto, para ajudar nos esforços de correção da equipe de administradores de banco de dados (DBA) da Rackspace, as equipes Braze DevOps começaram a depurar e testar rapidamente métodos para restaurar essa conectividade. Nossa investigação determinou que a única opção disponível era reiniciar cada um dos quase 16.000 processos mongoD e mais de 6.000 processos mongoS em seus contêineres virtualizados. Dada a enorme escala desse empreendimento e o fato de que não existia automação para reiniciar tantos contêineres rapidamente, os engenheiros da Rackspace escreveram um novo código durante o incidente para criar capacidade de automação dinâmica.

Infelizmente, à medida que o processo de reinicialização se acelerou, surgiu outro problema no sistema DNS (Domain Name System). À medida que os processos mongoS e mongoD ficam online, eles solicitam informações dos resolvedores de DNS em um processo conhecido como pesquisa de DNS. Com as pesquisas contínuas de DNS impulsionadas pela velocidade das reinicializações, os servidores DNS ficaram sob carga pesada, levando a tempos limites de conectividade nas camadas mongoS à medida que se reconectavam aos processos mongoD. Para acomodar essa carga crescente, nossa equipe da Rackspace aumentou a capacidade da CPU do DNS, mas foi forçada a reiniciar a camada mongoS uma segunda vez para criar conexões íntegras de cada mongoS com seus processos mongoD associados.

Por volta das 17h05 UTC, o processo de reinicialização permitiu que alguns clusters começassem a ficar online novamente. À medida que o desempenho do banco de dados se recuperou e os clusters se estabilizaram, a Braze continuou a aumentar a capacidade de processamento de dados e envio de mensagens; no entanto, esse esforço foi complicado pelo enorme atraso resultante da indisponibilidade anterior.

Dada a escala e a sofisticação do nosso ambiente de banco de dados Rackspace, que consiste em centenas de bancos de dados distintos, a duração da interrupção e o volume resultante do nosso backlog (representando bilhões de mensagens e bilhões de pontos de dados ingeridos), o processo de recuperação necessário em -adaptação imediata dos nossos processos normais de recuperação. Isto foi necessário para garantir que os recursos da base de dados permanecessem em equilíbrio com as exigências de processamento contínuas, incluindo a introdução de uma enorme capacidade de processamento global.

No entanto, ao fazer isso, o Braze atingiu um limite da AWS no número de CPUs virtuais que conseguimos provisionar, impedindo-nos de adicionar qualquer capacidade adicional de servidor. A equipe Braze escalou rapidamente essa circunstância com nossa equipe AWS e recebeu um aumento, permitindo que nossos engenheiros aumentassem a capacidade de processamento de nosso servidor para um nível recorde, que era mais de 50% superior à nossa capacidade máxima anterior, que havia sido alcançada no Black. Sexta-feira de 2023.

Às 20h30 UTC, todos os nossos clusters nos EUA, exceto US 01, US 03 e US 08, haviam concluído o processamento de suas pendências, e os clusters restantes estavam processando nas taxas de pico ou acima do dia anterior ao incidente. Em poucas horas, todos os clusters voltaram ao processamento em tempo real e declaramos o incidente resolvido.

Como o Braze comunica atualizações durante incidentes

Uma comunicação clara e frequente durante incidentes como este é essencial. Embora os problemas técnicos em geral sejam ocorrências raras, e um problema desta magnitude nunca tenha sido ouvido pela Braze, sempre fazemos o nosso melhor para nos comunicarmos com as partes afetadas com clareza e rapidez.

Em situações como esta, os princípios orientadores que norteiam a nossa estratégia de comunicação são a honestidade, a transparência e a confiança. Sabemos que só temos uma oportunidade de sermos honestos e francos sobre o que está a acontecer, e que a transparência sobre os incidentes – tanto no momento como após a sua resolução – é essencial para manter a confiança. No final das contas, queremos que nossos clientes tenham certeza de que a Braze sempre fará tudo ao nosso alcance para explicar, remediar e prevenir a recorrência de qualquer incidente.

Durante incidentes, usamos nossa página de status para gerenciar comunicações e fornecer atualizações regulares sobre a situação; Eu recomendo fortemente que os clientes se inscrevam para receber atualizações dessa página para se manterem atualizados. Durante a interrupção de 29 de abril, complementamos essas atualizações frequentes da página de status com um e-mail de meu colega cofundador e CEO, Bill Magnuson. Essa mensagem foi enviada a todos os usuários do painel Braze e fornecida às nossas equipes de conta para compartilhar com outras partes interessadas do cliente, conforme necessário.

Como Braze acompanhou o incidente e planos de prevenção futuros

Antes deste incidente, a nossa experiência levou-nos a acreditar que a nossa rede era resiliente, devido aos nossos switches de rede redundantes. No entanto, a interrupção revelou que a nossa topologia de rede – que nos deu um bom suporte durante mais de uma década – era vulnerável a falhas catastróficas. Agora está claro que deve ser melhorado no futuro.

Desde o incidente, a Braze e a Rackspace trocaram e substituíram o switch com defeito, e a equipe de engenharia da Rackspace concluiu uma auditoria completa da infraestrutura de rede da qual dependem os serviços da Braze. Embora as falhas de hardware sejam incrivelmente difíceis de prever, especialmente com equipamentos dentro da garantia, existe monitoramento para detectar anormalidades e garantir uma resposta rápida. Ambas as equipes estão colaborando agora para fazer mudanças que evitarão futuros loops de rede, mesmo no caso de mau funcionamento do equipamento. Algumas alterações de rede levarão tempo para serem implementadas, pois planejamos fazer alterações significativas em nossa topologia de rede para melhorar ainda mais a proteção contra loops. Também abrimos tickets de suporte com Cisco e MongoDB para entender melhor os cenários de falha que enfrentamos e para melhorar a capacidade dos processos mongoD e mongoS de se auto-curarem após falhas de rede.

Temos estado em contato diário com a Rackspace desde o incidente para tomar medidas em relação às mudanças de curto prazo e realizar um aprimoramento maior da rede, e continuaremos a fazê-lo até termos confiança de que um design de rede melhorado e mais resiliente foi alcançado.

Quero pedir desculpas novamente por esse incidente e pelo impacto que ele teve em seus negócios e no relacionamento com seus clientes. A quantidade de tempo que o Braze ficou indisponível é inaceitável. Nossa liderança de engenharia e equipe executiva estão totalmente comprometidas em fazer todas as mudanças necessárias para identificar e resolver vulnerabilidades de interrupção da maneira mais rápida e eficiente possível, para que possamos mais uma vez ganhar sua confiança como um parceiro confiável e de alto desempenho.

-Jon