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 que podem ajudar a reduzir a inatividade da instância e se preparar para momentos em que as instâncias do Compute Engine falharem inesperadamente.

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 de computação podem ser perdidas devido a falhas no sistema ou no hardware. A lista a seguir contém alguns tipos de cenários de falha que podem ser atenuados:

  • Falha inesperada em uma única instância

    Falhas inesperadas de instância única podem ocorrer devido a uma falha de hardware ou de sistema. É possível atenuar esses eventos usando discos permanentes e scripts de inicialização para salvar os dados e reativar o software depois de reiniciar a 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 ajudar a atenuar esses eventos, faça backup dos dados, use Hyperdisk ou Disco permanente 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 instâncias em uma determinada zona ou região fiquem inacessíveis ou apresentem falha. Para atenuar essas falhas, crie diversidade entre regiões e zonas e implemente o balanceamento de carga. Também é preciso fazer backup dos dados ou replicar os discos entre várias zonas.

Dicas para projetar sistemas resilientes

Para atenuar as falhas de instâncias de computação, projete 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 instância inacessível para uma 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 Cloud 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 a migração em tempo real para garantir que essa manutenção da infraestrutura seja transparente por padrão às instâncias de computação.

A migração em tempo real é uma tecnologia que afasta as instâncias em execução dos sistemas que estão prestes a passar por trabalhos de manutenção. O Compute Engine faz isso automaticamente para os tipos de instância com suporte.

Durante a migração em tempo real, a instância pode sofrer uma diminuição no desempenho por um curto período. Para instâncias que exigem um desempenho máximo constante, é possível configurar as instâncias para serem reiniciadas em outro host em vez de passar por uma migração em tempo real. Se você escolher essa opção, o Compute Engine vai interromper a instância e reiniciá-la em um host que não esteja envolvido em um evento de manutenção. A interrupção e a reinicialização da instância são adequadas para aplicativos gerais que também são criados para lidar com falhas ou reinicializações de instâncias.

Para configurar as instâncias para migração em tempo real ou para que elas sejam reiniciadas em vez de migradas, consulte Definir a política de manutenção do host para uma instância.

Distribuir as instâncias

Crie instâncias em mais de uma região e zona. Dessa maneira, você tem instâncias de computação alternativas para apontar se uma zona ou região que contiver uma das instâncias for interrompida. Se você criar todas as instâncias na mesma zona ou região, não será possível acessar nenhuma delas se essa zona ou região ficar inacessível.

Usar nomes DNS internos específicos da zona

Defina o tipo de DNS interno padrão do projeto ou da organização como o DNS zonal. Nos aplicativos, use nomes DNS zonais ao acessar outras instâncias de computação. 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 DNS global é menos resiliente devido a falhas de ponto único. O DNS zonal reduz o risco de interrupções entre regiões. O DNS zonal não exige exclusividade com relação ao nome da instância em todas as regiões de um projeto, o que permite uma criação mais rápida da instância.

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

Se o projeto usar nomes DNS globais, será possível alternar para o uso de nomes DNS zonais. Para mais informações, consulte Usar DNS zonal para o tipo de DNS interno.

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 instâncias de computação 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 instância é iniciada ou desligada, respectivamente. Os scripts de inicialização e desligamento podem automatizar tarefas como instalar software, executar atualizações, fazer backups e registrar dados.

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

Eles são executados sempre que a instância é reiniciada devido a falhas e podem ser 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 instância. Codificar as mudanças para configurar uma instância em um script de inicialização é mais fácil do que tentar descobrir quais arquivos ou bytes foram alterados em uma imagem personalizada.

Os scripts de desligamento são executados quando a instância é 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 instância.

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

Fazer backup de 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 disco ou replicar os dados em um disco em outra zona usando a replicação síncrona ou outra região usando a replicação assíncrona.