Replicação lógica com o AlloyDB Omni

1. Introdução

Este codelab mostra como configurar a replicação lógica entre instâncias independentes do AlloyDB Omni. Você vai implantar várias instâncias do AlloyDB Omni em uma única VM do Compute Engine e configurar a replicação entre elas usando a extensão pglogical.

Executar várias instâncias em um único nó é útil para desenvolvimento, teste ou simulação de ambientes de replicação. Ao final deste codelab, você terá uma configuração de replicação funcional com uma instância atuando como provedor e outra como assinante.

Pré-requisitos

  • Acesso a um projeto do Google Cloud e ao Cloud Shell no console do Google Cloud.
  • SDK Google Cloud (gcloud) instalado e configurado. Para detalhes sobre como instalar o gcloud, consulte gcloud-install.

O que você vai aprender

  • Como criar e preparar uma VM do Compute Engine para várias instâncias do AlloyDB Omni usando gcloud.
  • Como instalar RPMs do AlloyDB Omni.
  • Como configurar e inicializar várias instâncias do AlloyDB Omni usando modelos systemd.
  • Como configurar a replicação lógica entre instâncias do AlloyDB Omni usando pglogical.
  • Como verificar a replicação replicando dados do provedor para o assinante.

O que é necessário

  • Receba um link de URL para RPMs do AlloyDB Omni. Os links são enviados para seu e-mail, incluindo um link para o servidor de URL do repositório. Inicialize a seguinte variável de ambiente para manter o URL pronto para uso durante o codelab.
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    
  • Um terminal em funcionamento com acesso ao Google Cloud. Você pode usar o Cloud Shell para essa finalidade.

2. Configuração e requisitos

Configurar o projeto

Criar um projeto do Google Cloud

  1. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto na nuvem do Google Cloud.
  2. Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto.

Iniciar o Cloud Shell

Embora seja possível operar o Google Cloud remotamente em um laptop, neste codelab você vai usar o Google Cloud Shell, um ambiente de linha de comando executado na nuvem.

Ícone para ativar o Cloud Shell

  1. Abra o console do Google Cloud e clique no ícone do Cloud Shell na barra de ferramentas superior à direita.Também é possível abrir o Cloud Shell de uma das seguintes maneiras:
    • Se você estiver usando o console do Google Cloud, pressione G e depois S.
    • Clique neste link.

O provisionamento e a conexão com o ambiente do Cloud Shell geralmente levam alguns instantes. Quando essa operação for concluída, você verá uma saída semelhante a esta:

Terminal do Google Cloud Shell mostrando que o ambiente foi conectado

3. Criar a VM do Compute Engine

Nesta seção, crie uma única máquina virtual (VM) do Compute Engine usando a ferramenta de linha de comando gcloud. Use uma imagem do Rocky Linux 9, que é totalmente compatível com os RPMs do AlloyDB Omni.

  1. Defina variáveis de ambiente para o ID do projeto, o nome da VM, a zona e a região.
    export PROJECT="your-project-id"
    export INSTANCE_NAME="alloydb-omni-multi-vm"
    export ZONE="us-central1-c"
    export REGION="us-central1"
    
  2. Faça login com sua conta do Google Cloud e configure o projeto padrão.
    gcloud auth login
    gcloud config set project $PROJECT
    
  3. Para permitir conexões SSH à sua VM usando o Identity-Aware Proxy (IAP), crie uma regra de firewall.
    gcloud compute firewall-rules create allow-ssh-alloydb-omni \
        --project=$PROJECT \
        --direction=INGRESS \
        --action=allow \
        --rules=tcp:22 \
        --source-ranges="0.0.0.0/0"
    
  4. Como a VM é criada sem um endereço IP público, configure um Cloud Router e um gateway do Cloud NAT para permitir que a VM acesse repositórios de pacotes externos e faça o download do software necessário.
    gcloud compute routers create alloydb-omni-router \
        --project=$PROJECT \
        --network=default \
        --region=$REGION
    
    gcloud compute routers nats create alloydb-omni-nat \
        --project=$PROJECT \
        --router=alloydb-omni-router \
        --region=$REGION \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips
    
  5. Verifique se a rede de nuvem privada virtual (VPC) tem uma rota de gateway de Internet padrão válida. Essa rota é necessária para que o Cloud NAT encaminhe o tráfego de saída para a Internet.
    gcloud compute routes create default-internet-route \
        --project=$PROJECT \
        --network=default \
        --destination-range=0.0.0.0/0 \
        --next-hop-gateway=default-internet-gateway
    
  6. Crie a instância de VM do Compute Engine com as especificações necessárias (16 vCPUs, disco permanente equilibrado de 20 GB, Rocky Linux 9). Para aumentar a segurança, use a flag --no-address e verifique se a VM não recebeu um endereço IP público.
    gcloud compute instances create $INSTANCE_NAME \
        --project=$PROJECT \
        --zone=$ZONE \
        --machine-type=n2-highmem-16 \
        --image-family=rocky-linux-9 \
        --image-project=rocky-linux-cloud \
        --boot-disk-size=20GB \
        --boot-disk-type=pd-balanced \
        --no-address
    
  7. Depois que a VM for criada, verifique o status dela.
    gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
    

4. Preparar VM

Nesta seção, você se conecta à VM recém-criada e prepara o ambiente do sistema operacional.

  1. Conecte-se à VM por SSH usando o IAP. Como a VM não tem um endereço IP público, o gcloud faz o tunelamento automático da conexão SSH pelo IAP.
    gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap
    
  2. Defina uma variável de ambiente para o diretório de dados base.
    export BASE_PGDATA="/var/lib/alloydbomni"
    
  3. Crie o diretório de dados de base.
    sudo mkdir -p $BASE_PGDATA
    
  4. Instale o pacote policycoreutils-python-utils para que a política do SELinux possa ser configurada.
    sudo dnf install -y policycoreutils-python-utils
    

5. Instalar o AlloyDB Omni

Com a VM preparada, agora é possível configurar o repositório de pacotes e instalar o pacote RPM do AlloyDB Omni.

  1. Configure o repositório YUM na VM criando o arquivo de configuração do repositório. Substitua $ALLOYDB_OMNI_REPOSITORY_URL pelo URL que você recebeu.
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF
    [alloydbomni]
    name=alloydbomni
    baseurl=$ALLOYDB_OMNI_REPOSITORY_URL
    enabled=1
    repo_gpgcheck=0
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    EOF
    
  2. Atualize o cache do YUM.
    sudo yum makecache
    
  3. Instale a versão 18 do pacote RPM do AlloyDB Omni.
    sudo dnf install -y alloydbomni18
    

6. Configurar várias instâncias

Nesta seção, configure duas instâncias: inst1 e inst2.

  1. Para oferecer suporte a várias instâncias, crie o arquivo de serviço de modelo alloydbomni18@.service systemd.
    sudo tee /etc/systemd/system/alloydbomni18@.service << EOF
    [Unit]
    Description=AlloyDB Omni Database server instance %I
    After=syslog.target
    After=network-online.target
    
    [Service]
    SyslogIdentifier=alloydbomni-%I
    Type=notify
    
    User=postgres
    Group=postgres
    
    # Load configuration for the instance
    EnvironmentFile=/etc/alloydbomni/%I.conf
    
    OOMScoreAdjust=-1000
    Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
    Environment=PG_OOM_ADJUST_VALUE=0
    
    ExecStartPre=/usr/lib/postgresql/18/bin/alloydbomni18-check-db-dir \${PGDATA}
    ExecStart=/usr/lib/postgresql/18/bin/postgres -D \${PGDATA}
    ExecReload=/bin/kill -HUP \$MAINPID
    
    KillMode=mixed
    KillSignal=SIGINT
    
    TimeoutSec=0
    TimeoutStartSec=0
    TimeoutStopSec=1h
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
  2. Recarregue a configuração do gerenciador systemd para reconhecer o novo serviço de modelo.
    sudo systemctl daemon-reload
    
  3. Crie o diretório de configuração para instâncias do AlloyDB Omni.
    sudo mkdir -p /etc/alloydbomni
    
  4. Configure o diretório de dados para inst1.
    sudo tee /etc/alloydbomni/inst1.conf << EOF
    PGDATA=/var/lib/alloydbomni/inst1
    EOF
    
  5. Configure o diretório de dados para inst2.
    sudo tee /etc/alloydbomni/inst2.conf << EOF
    PGDATA=/var/lib/alloydbomni/inst2
    EOF
    
  6. Defina as permissões adequadas nos arquivos de configuração.
    sudo chmod 640 /etc/alloydbomni/*.conf
    sudo chown postgres:postgres /etc/alloydbomni/*.conf
    
  7. Crie os diretórios de dados para as duas instâncias e defina a propriedade correta.
    sudo mkdir -p /var/lib/alloydbomni/inst1
    sudo mkdir -p /var/lib/alloydbomni/inst2
    sudo chown -R postgres:postgres /var/lib/alloydbomni
    sudo chmod 750 /var/lib/alloydbomni/inst1 /var/lib/alloydbomni/inst2
    
  8. Opcional: defina limites de recursos para cada instância. Isso impede que uma instância consuma todos os recursos da VM. Crie diretórios e arquivos de substituição systemd para ambas as instâncias.Observação:os limites de recursos usados nas configurações a seguir (40%) são valores de exemplo. Ajuste os limites com base na sua carga de trabalho específica e na capacidade da VM.Para inst1:
    sudo mkdir -p /etc/systemd/system/alloydbomni18@inst1.service.d
    sudo tee /etc/systemd/system/alloydbomni18@inst1.service.d/override.conf << EOF
    [Service]
    CPUQuota=40%
    MemoryMax=40%
    EOF
    
    Para inst2:
    sudo mkdir -p /etc/systemd/system/alloydbomni18@inst2.service.d
    sudo tee /etc/systemd/system/alloydbomni18@inst2.service.d/override.conf << EOF
    [Service]
    CPUQuota=40%
    MemoryMax=40%
    EOF
    

7. Inicializar e preparar bancos de dados

Inicialize e prepare cada instância de banco de dados separadamente.

  1. Configure o SELinux para o modo permissivo na configuração.
    sudo setenforce 0
    
    Atenção:definir o SELinux como permissivo desativa a restrição e precisa ser usado com cuidado. Ele é usado neste codelab para simplificar a instalação. Em produção, configure as políticas adequadas do SELinux para que o AlloyDB Omni seja executado no modo de imposição. É possível reativar a aplicação depois da configuração executando sudo setenforce 1.
  2. Defina uma senha forte para o usuário administrador postgres do PostgreSQL. Essa senha é usada para as duas instâncias neste codelab.
    export PGPASSWORD="YourStrongPassword123!"
    
    Observação:o envio de senhas usando variáveis de ambiente na linha de comando (por exemplo, PGPASSWORD=$PGPASSWORD) é usado aqui para simplificar o codelab, mas pode expor a senha em listas de processos. Em produção, use métodos mais seguros, como um arquivo .pgpass ou um gerenciador de secrets.

Configurar inst1

  1. Inicialize o diretório do banco de dados para inst1.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst1 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  2. Configure a instância para detectar a atividade na porta 5433 atualizando o arquivo postgresql.conf dela.
    sudo sed -i \
      "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5433/" \
      /var/lib/alloydbomni/inst1/postgresql.conf
    
  3. Prepare a instância de banco de dados para o AlloyDB Omni.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst1 \
      PGPORT=5433 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    

Configurar inst2

  1. Inicialize o diretório do banco de dados para inst2.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst2 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  2. Configure a instância para detectar a atividade na porta 5434.
    sudo sed -i \
      "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5434/" \
      /var/lib/alloydbomni/inst2/postgresql.conf
    
  3. Prepare a instância de banco de dados.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst2 \
      PGPORT=5434 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    

8. Iniciar os serviços do AlloyDB Omni

Agora você pode iniciar os serviços systemd para as duas instâncias.

  1. Para reconhecer a nova configuração e as substituições, recarregue a configuração do gerenciador systemd.
    sudo systemctl daemon-reload
    
  2. Ative e inicie o serviço para inst1.
    sudo systemctl enable alloydbomni18@inst1
    sudo systemctl start alloydbomni18@inst1
    
  3. Ative e inicie o serviço para inst2.
    sudo systemctl enable alloydbomni18@inst2
    sudo systemctl start alloydbomni18@inst2
    
  4. Verifique se os dois serviços estão ativos e em execução.
    sudo systemctl status alloydbomni18@inst1
    sudo systemctl status alloydbomni18@inst2
    
    Verifique se a saída para ambos indica Active: active (running).

9. Verificar instâncias do AlloyDB Omni

Verifique se as duas instâncias estão funcionando corretamente e são independentes.

  1. Conecte-se a inst1 (porta 5433). Você vai precisar inserir a senha configurada em Inicializar e preparar bancos de dados.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 -U postgres -W
    
  2. Execute uma consulta para verificar a conexão.
    postgres=# SELECT version();
    
  3. Desconecte-se da instância.
    postgres=# \q
    
  4. Conecte-se a inst2 (porta 5434).
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 -U postgres -W
    
  5. Execute uma consulta para verificar a conexão.
    postgres=# SELECT version();
    
  6. Desconecte-se da instância.
    postgres=# \q
    

10. Configurar para replicação pglogical

Configure a replicação lógica entre as duas instâncias usando a extensão pglogical. Nesse cenário, inst1 atua como o provedor e inst2 atua como o assinante.

Observação:este codelab usa o superusuário postgres para as conexões de replicação. Em um ambiente de produção, crie um usuário de replicação dedicado com privilégios REPLICATION e conceda acesso apenas às tabelas que estão sendo replicadas.

Configurar instâncias para pglogical

  1. Ative pglogical em shared_preload_libraries e configure outros parâmetros de replicação em postgresql.conf para inst1.
    # Append pglogical to shared_preload_libraries
    sudo sed -i \
      "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \
      /var/lib/alloydbomni/inst1/postgresql.conf
    
    # Append replication settings
    sudo tee -a /var/lib/alloydbomni/inst1/postgresql.conf << EOF
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    max_worker_processes = 20
    track_commit_timestamp = on
    alloydb.enable_pglogical = on
    alloydb.logical_decoding = on
    EOF
    
  2. Defina as configurações de inst2 que você configurou para inst1.
    # Append pglogical to shared_preload_libraries
    sudo sed -i \
      "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \
      /var/lib/alloydbomni/inst2/postgresql.conf
    
    # Append replication settings
    sudo tee -a /var/lib/alloydbomni/inst2/postgresql.conf << EOF
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    max_worker_processes = 20
    track_commit_timestamp = on
    alloydb.enable_pglogical = on
    alloydb.logical_decoding = on
    EOF
    
  3. Para aplicar as mudanças de configuração, reinicie as duas instâncias.
    sudo systemctl restart alloydbomni18@inst1
    sudo systemctl restart alloydbomni18@inst2
    

Configurar papéis e tabelas de replicação

  1. Em inst1 (provedor, porta 5433), crie uma função de replicação e a tabela a ser replicada.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      DO \$\$
      BEGIN
        IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN
          CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123';
        END IF;
      END
      \$\$;
      GRANT ALL ON SCHEMA public TO app_owner;
      CREATE TABLE IF NOT EXISTS replication_test (
          id SERIAL PRIMARY KEY,
          data TEXT,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      ALTER TABLE replication_test OWNER TO app_owner;
    "
    
  2. Em inst2 (assinante, porta 5434), crie a mesma função e estrutura de tabela.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "
      DO \$\$
      BEGIN
        IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN
          CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123';
        END IF;
      END
      \$\$;
      GRANT ALL ON SCHEMA public TO app_owner;
      CREATE TABLE IF NOT EXISTS replication_test (
          id SERIAL PRIMARY KEY,
          data TEXT,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      ALTER TABLE replication_test OWNER TO app_owner;
    "
    

Configurar nós e assinaturas pglogical

  1. Inicialize o nó do provedor pglogical em inst1.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      CREATE EXTENSION IF NOT EXISTS pglogical;
      SELECT pglogical.create_node(
          node_name := 'provider',
          dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
      SELECT pglogical.replication_set_add_table('default', 'replication_test');
    "
    
  2. Inicialize o nó de assinante da pglogical e crie a assinatura em inst2.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "
      CREATE EXTENSION IF NOT EXISTS pglogical;
      SELECT pglogical.create_node(
          node_name := 'subscriber',
          dsn := 'host=127.0.0.1 port=5434 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
      SELECT pglogical.create_subscription(
          subscription_name := 'test_subscription',
          provider_dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
    "
    
    Observação:depois de criar a assinatura, pode levar um tempo para que a sincronização inicial seja concluída.

11. Verificar a replicação do pglogical

Verifique se a replicação está funcionando como esperado inserindo dados no provedor e consultando-os no assinante.

  1. Verifique se a assinatura está ativa. A transição para replicating pode levar alguns segundos.
    /usr/lib/postgresql/18/bin/psql -t -A -h localhost -p 5434 \
      -U postgres -d postgres -c "
      SELECT status FROM pglogical.show_subscription_status() WHERE subscription_name = 'test_subscription';
      "
    
  2. Confirme se a saída mostra replicating antes de continuar.
  3. Insira uma linha de teste no provedor (inst1).
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      INSERT INTO replication_test (data) VALUES ('Hello from replication provider!');
    "
    
  4. Para verificar se os dados foram replicados, consulte a tabela em inst2.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "SELECT * FROM replication_test;"
    
    Confirme se a linha inserida aparece em inst1.

12. Limpeza

Limpar os recursos. Primeiro, destrua as instâncias do AlloyDB Omni na VM e, em seguida, exclua os recursos do Google Cloud.

Destruir instâncias do AlloyDB Omni

Antes de excluir a VM, você pode limpar as instâncias do AlloyDB Omni interrompendo e desativando os serviços e removendo a configuração e os dados deles.

  1. Interrompa e desative o serviço para inst1 e remova os dados e a configuração dele.
    sudo systemctl stop alloydbomni18@inst1
    sudo systemctl disable alloydbomni18@inst1
    sudo rm -rf /var/lib/alloydbomni/inst1
    sudo rm -f /etc/alloydbomni/inst1.conf
    
  2. Interrompa e desative o serviço para inst2 e remova os dados e a configuração dele.
    sudo systemctl stop alloydbomni18@inst2
    sudo systemctl disable alloydbomni18@inst2
    sudo rm -rf /var/lib/alloydbomni/inst2
    sudo rm -f /etc/alloydbomni/inst2.conf
    
  3. Atualize a configuração do gerenciador systemd e redefina as unidades com falha.
    sudo systemctl daemon-reload
    sudo systemctl reset-failed
    

Limpar recursos do Google Cloud

Depois de limpar as instâncias, exclua a VM do Compute Engine e outros recursos.

  1. Desconecte-se da sessão SSH.
    exit
    
  2. Exclua a instância de VM do Compute Engine.
    gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet
    
  3. Exclua a regra de firewall.
    gcloud compute firewall-rules delete allow-ssh-alloydb-omni --project=$PROJECT --quiet
    
  4. Exclua o Cloud NAT e o roteador.
    gcloud compute routers nats delete alloydb-omni-nat --router=alloydb-omni-router --region=$REGION --project=$PROJECT --quiet
    gcloud compute routers delete alloydb-omni-router --region=$REGION --project=$PROJECT --quiet
    
  5. Exclua a rota padrão da Internet.
    gcloud compute routes delete default-internet-route --project=$PROJECT --quiet
    

13. Parabéns

Você implantou e configurou várias instâncias do AlloyDB Omni em uma única VM do Compute Engine.

O que aprendemos

  • Como provisionar e preparar uma VM do Compute Engine.
  • Como instalar RPMs do AlloyDB Omni.
  • Como configurar modelos systemd para várias instâncias.
  • Como inicializar, configurar e iniciar vários serviços independentes em portas diferentes.
  • Como verificar a independência de cada instância.

Saiba mais