Como projetar sistemas resilientes

Neste documento, você conhecerá as práticas recomendadas para projetar sistemas robustos no Compute Engine. Ele inclui orientações gerais e aborda alguns recursos no Compute Engine para você diminuir a inatividade da instância e se preparar quando as instâncias de máquina virtual (VM, na sigla em inglês) tiverem uma falha inesperada.

Um sistema robusto é aquele que resiste a uma determinada quantidade de falhas ou interrupções sem interromper o serviço ou afetar a experiência dos usuários na utilização do serviço. O Compute Engine conta com diversos recursos para evitar essas interrupções, mas determinados eventos são imprevisíveis, e é melhor se preparar para eles.

Tipos de falhas

Em algum momento, uma ou mais instâncias podem ser perdidas devido a falhas de sistema ou de hardware. A lista a seguir contém alguns tipos de cenários de falha que podem ser atenuados:

  • Falha inesperada em uma única VM

    As falhas inesperadas em uma única VM ocorrem devido a uma falha de hardware ou sistema. É possível atenuar esses eventos usando discos permanentes e scripts de inicialização para salvar os dados e reativar o software depois da reinicialização da VM.

  • Reinicialização inesperada de uma única VM

    Em algum momento, poderá ocorrer uma falha inesperada na VM e sua reinicialização. Ao contrário de uma falha inesperada em uma única VM, o Compute Engine reinicializa automaticamente a VM depois que ela falha. Para atenuar esses eventos, faça backup dos dados, use discos permanentes e utilize scripts de inicialização para reconfigurar o software rapidamente.

  • Falhas de zona ou região

    As falhas de zona e região são raras e podem fazer com que todas as VMs em uma determinada zona ou região fiquem inacessíveis ou apresentem falha. Para atenuar essas falhas, crie regiões e zonas diferentes e implemente o balanceamento de carga. Também é preciso fazer backup dos dados ou replicar os discos permanentes em várias zonas.

Dicas para projetar sistemas resilientes

Para atenuar falhas de VM, crie o aplicativo para ser resistente a falhas, interrupções de rede e desastres inesperados. Um sistema resiliente lida normalmente com falhas, por exemplo, redirecionando o tráfego de uma VM inacessível para uma VM ativa ou automatizando tarefas na reinicialização.

Aqui estão algumas dicas gerais para ajudar a projetar um sistema robusto contra falhas.

Usar migração ao vivo

O Google realiza periodicamente manutenção na infraestrutura corrigindo sistemas com o software mais recente, realizando testes de rotina e manutenção preventiva e garantindo de maneira geral de que nossa infraestrutura seja a mais rápida e eficiente possível. O Compute Engine emprega migração ao vivo para garantir que essa manutenção da infraestrutura seja transparente por padrão às VMs.

Migração em tempo real é uma tecnologia que afasta as VMs em execução dos sistemas que estão prestes a passar por trabalhos de manutenção. O Compute Engine faz isso automaticamente.

Durante a migração ao vivo, a VM pode sofrer uma diminuição no desempenho por um curto período de tempo. Para VMs que exigem um desempenho máximo constante, é possível usar uma configuração em que elas são interrompidas e reiniciadas em um host não envolvido em um evento de manutenção. Essa opção é adequada para aplicativos gerais que também são criados para lidar com reinicializações ou falhas de VM.

Para configurar as VMs para migração em tempo real ou defini-las para serem reiniciadas em vez de migrar, consulte Como configurar opções de programação da instância.

Distribuir VMs

Crie VMs em mais de uma região e zona. Dessa maneira, você tem VMs alternativas para apontar se uma zona ou região que contém uma das VMs for interrompida. Se você hospedar todas as VMs na mesma zona ou região, não será possível acessar nenhuma dessas VMs se essa zona ou região ficar inacessível.

Usar nomes DNS internos específicos da zona

Se você usa nomes DNS internos ou nomes de VM para indicar as VMs na rede interna do Compute Engine, utilize os nomes DNS zonais. Os servidores DNS internos estão distribuídos em todas as zonas. Assim, você conta com os nomes DNS zonais na solução de problemas mesmo que haja falhas em outros locais. O nome de domínio interno totalmente qualificado (FQDN) de uma VM tem os formatos a seguir:

  • VMs usando o DNS zonal: [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal
  • VMs usando DNS global: [INSTANCE_NAME].c.[PROJECT_ID].internal

onde:

  • em que [INSTANCE_NAME] é o nome da VM.
  • [ZONE]: a zona em que a VM está localizada.
  • [PROJECT_ID] é o projeto que contém a instância.

Para verificar se uma VM usa nomes DNS zonais ou globais, consulte Como determinar o nome DNS interno de uma instância de VM.

Se o projeto usa nomes DNS globais, prepare os aplicativos para nomes DNS zonais e caminhos de pesquisa. Para mais informações, consulte Como migrar para nomes DNS zonais.

Criar grupos de VMs

Use grupos de instâncias gerenciadas para criar grupos homogêneos de VMs. Dessa maneira, os balanceadores de carga podem direcionar o tráfego para mais de uma VM, caso uma única VM perca a integridade.

Os grupos de instâncias gerenciadas também oferecem recursos como dimensionamento automático e recuperação automática. O escalonamento automático permite lidar com picos de tráfego escalonando o número de VMs para mais ou para menos com base em sinais específicos. A recuperação automática executa uma verificação de integridade e, se necessário, recria automaticamente VMs não íntegras.

Os MIGs também estão disponíveis para regiões. Dessa maneira, você cria um grupo de VMs distribuídas em várias zonas em uma única região. Para mais informações, consulte Como criar e gerenciar MIGs regionais.

Usar balanceamento de carga

O Google Cloud oferece um serviço de balanceamento de carga que ajuda a lidar com os períodos de tráfego intenso para que as VMs não fiquem sobrecarregadas. Com o Cloud Load Balancing, é possível fazer o seguinte:

  • Implantar o aplicativo em VMs dentro de várias zonas usando MIGs regionais. Depois, é possível configurar uma regra de encaminhamento capaz de espalhar o tráfego por todas as VMs em todas as zonas da região. Cada regra de encaminhamento define um ponto de entrada para o aplicativo por meio de um endereço IP externo.

  • Implantar VMs em várias regiões usando o balanceamento de carga global. Com o balanceamento de carga HTTP(S), o tráfego entra no sistema do Google Cloud no local mais próximo do cliente. O balanceamento de carga entre regiões fornece redundância para que, se uma região ficar inacessível, o tráfego seja automaticamente desviado para outra região. Dessa forma, seu serviço permanece acessível usando o mesmo endereço IP externo.

  • Usar o escalonamento automático para adicionar ou excluir VMs automaticamente de um MIG com base em aumentos ou reduções de carga.

Além disso, o Cloud Load Balancing oferece uma verificação de integridade da VM para detectar e processar falhas.

Usar scripts de inicialização e encerramento

O Compute Engine oferece scripts de inicialização e desligamento executados quando uma VM é iniciada ou desligada, respectivamente. Scripts de inicialização e desligamento podem automatizar tarefas como instalar software, executar atualizações, fazer backups e gerar registros de dados.

Os scripts de inicialização e desligamento são uma forma eficiente e inestimável de inicializar ou desligar as VMs de maneira limpa. Em vez de configurar as VMs usando imagens personalizadas, é útil configurá-las com scripts de inicialização.

Eles são executados sempre que a VM é reiniciada devido a falhas e usados para instalar softwares e atualizações. Também é possível usar scripts de inicialização para garantir que os serviços sejam executados na VM. Codificar as alterações para configurar uma VM em um script de inicialização é geralmente mais fácil do que tentar descobrir quais arquivos ou bytes foram alterados em uma imagem personalizada.

Scripts de desligamento são executados quando a VM é encerrada, intencionalmente ou não. Eles podem realizar tarefas de última hora, como fazer backup de dados, salvar registros e encerrar conexões normalmente antes de interromper uma VM.

Para mais informações, consulte Como executar scripts de inicialização e Como executar scripts de encerramento.

Fazer backup dos dados

Faça backup dos dados regularmente e em vários locais. É possível fazer upload dos arquivos para o Cloud Storage, criar snapshots de discos permanentes ou replicar os dados em um disco permanente em outra região ou zona.