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

Dicas para projetar sistemas resilientes

Para atenuar falhas de instância de computação, 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 instância inacessível para uma instância ativa ou automatizando tarefas na reinicialização.

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

Segregar instâncias que executam código não confiável em projetos dedicados

Se o sistema funciona com código não confiável, por exemplo, executando scripts gerados por IA ou realizando tarefas de build em nome de um usuário externo, como um sistema de CI, coloque essas instâncias de worker em um projeto dedicado.

O Compute Engine tem vários mecanismos de detecção de cota e abuso que ajudam a aplicar políticas, como a Política de uso aceitável. O abuso detectado pode resultar na limitação da capacidade disponível, limites de taxa mais rigorosos ou instâncias sendo encerradas no projeto. A segregação das instâncias em projetos dedicados garante que os mecanismos antiabuso não afetem suas cargas de trabalho principais. Essa prática está alinhada ao modelo de responsabilidade compartilhada para conteúdo e uso de infraestrutura como serviço (IaaS) no Google Cloud.

Usar migração em tempo real

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 adota 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 tipos de instância compatíveis.

Durante a migração em tempo real, a instância pode sofrer uma diminuição no desempenho por um curto período de tempo. 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 pela 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 está envolvido em um evento de manutenção. Encerrar e reiniciar a instância é adequado para aplicativos gerais que também são criados para lidar com falhas ou reinicializações de instância.

Para configurar as instâncias para migração em tempo real ou defini-las para serem reiniciadas em vez de migrar, consulte Definir a política de manutenção do host para uma instância de computação.

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 as quais 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 sã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 seu 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

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 Google Cloud sistema 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.

Cloud DNS

O Cloud DNS é um serviço de Sistema de Nome de Domínio (DNS, na sigla em inglês) global, resiliente e de alto desempenho que permite armazenar endereços IP e outros dados e, em seguida, pesquisá-los por nome. Com o Cloud DNS, você publica zonas e registros no DNS sem precisar gerenciar os próprios servidores e software de DNS. O Cloud DNS usa anycast para atender às zonas gerenciadas de diversos locais no mundo todo.

Para ter alta disponibilidade, implante vários balanceadores de carga de aplicativo externos regionais individuais nas regiões que melhor oferecem suporte ao tráfego do aplicativo e use uma política de roteamento de geolocalização do Cloud DNS para rotear o tráfego para dois ou mais balanceadores de carga em regiões diferentes. As solicitações são automaticamente encaminhadas para o local mais próximo, o que reduz a latência e melhora o desempenho das consultas de nomes autorizados para seus usuários.

Para mais informações, consulte Alta disponibilidade para balanceadores de carga de aplicativo externos regionais.

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. 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 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 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 é geralmente mais fácil do que criar e gerenciar uma imagem personalizada não compatível.

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