

# Configurar a replicação ativa-ativa para as instâncias de banco de dados do RDS para PostgreSQL
<a name="Appendix.PostgreSQL.CommonDBATasks.pgactive.setup-replication"></a>

O procedimento a seguir mostra como iniciar a replicação ativa-ativa entre dois clusters de banco de dados do duas instâncias de banco de dados do RDS para PostgreSQL em que `pgactive` está disponível. Para executar o exemplo de alta disponibilidade multirregional, você precisa implantar instâncias do Amazon RDS para PostgreSQL em duas regiões diferentes e configurar o emparelhamento de VPC. Para obter mais informações, consulte [Emparelhamento de VPC](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html).

**nota**  
O envio de tráfego entre várias regiões pode gerar custos adicionais.

Estas etapas pressupõem que a instância de banco de dados do RDS para PostgreSQL foi habilitada com a extensão `pgactive`. Para obter mais informações, consulte [Inicializar o recurso de extensão pgactive](Appendix.PostgreSQL.CommonDBATasks.pgactive.basic-setup.md). 

**Como configurar a primeira instância de banco de dados do RDS para PostgreSQL com a extensão `pgactive`**

O exemplo a seguir ilustra como o grupo `pgactive` é criado e mostra outras etapas necessárias para criar a extensão `pgactive` na instância de banco de dados do RDS para PostgreSQL.

1. Use `psql` ou outra ferramenta cliente para se conectar à primeira instância de banco de dados do RDS para PostgreSQL.

   ```
   psql --host=firstinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password=PASSWORD --dbname=postgres
   ```

1. Crie um banco de dados na instância do RDS para PostgreSQL usando o seguinte comando:

   ```
   postgres=> CREATE DATABASE app;
   ```

1. Alterne a conexão para o novo banco de dados usando o seguinte comando:

   ```
   \c app
   ```

1. Crie e preencha uma tabela de exemplo usando a seguinte instrução SQL:

   1. Crie uma tabela de exemplo usando a declaração SQL a seguir.

      ```
      app=> CREATE SCHEMA inventory;
      CREATE TABLE inventory.products (
      id int PRIMARY KEY, product_name text NOT NULL,
      created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP);
      ```

   1. Preencha a tabela com alguns dados de amostra usando a instrução SQL a seguir.

      ```
      app=> INSERT INTO inventory.products (id, product_name)
      VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');
      ```

   1. Verifique se os dados existem na tabela usando a declaração SQL a seguir.

      ```
       app=>SELECT count(*) FROM inventory.products;
      
       count
      -------
       3
      ```

1. Crie uma extensão `pgactive` no banco de dados existente.

   ```
   app=> CREATE EXTENSION pgactive;
   ```

1. Para criar e inicializar com segurança o grupo da pgactive, use os seguintes comandos:

   ```
   app=>
   -- connection info for endpoint1
   CREATE SERVER pgactive_server_endpoint1
       FOREIGN DATA WRAPPER pgactive_fdw
       OPTIONS (host '<endpoint1>', dbname 'app');
   CREATE USER MAPPING FOR postgres
       SERVER pgactive_server_endpoint1
       OPTIONS (user 'postgres', password '<password>');
         -- connection info for endpoint2
   CREATE SERVER pgactive_server_endpoint2
       FOREIGN DATA WRAPPER pgactive_fdw
       OPTIONS (host '<endpoint2>', dbname 'app');
   CREATE USER MAPPING FOR postgres
       SERVER pgactive_server_endpoint2
       OPTIONS (user 'postgres', password '<password>');
   ```

   Agora você pode inicializar o grupo de replicações e adicionar esta primeira instância:

   ```
   SELECT pgactive.pgactive_create_group(
       node_name := 'endpoint1-app',
       node_dsn := 'user_mapping=postgres pgactive_foreign_server=pgactive_server_endpoint1'
   
   );
   ```

   Use os seguintes comandos como um método alternativo, mas menos seguro, para criar e inicializar o grupo da pgactive:

   ```
   app=> SELECT pgactive.pgactive_create_group(
       node_name := 'node1-app',
       node_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD');
   ```

   node1-app é o nome atribuído para identificar de maneira exclusiva um nó no grupo `pgactive`.
**nota**  
Para realizar essa etapa com êxito em uma instância de banco de dados acessível ao público geral, você deve ativar o parâmetro `rds.custom_dns_resolution` definindo-o como `1`.

1. Para verificar se a instância de banco de dados está pronta, use o seguinte comando:

   ```
   app=> SELECT pgactive.pgactive_wait_for_node_ready();
   ```

   Se o comando for bem-sucedido, você verá o seguinte resultado:

   ```
   pgactive_wait_for_node_ready 
   ------------------------------ 
   (1 row)
   ```

**Como configurar a segunda instância do RDS para PostgreSQL e juntá-la ao grupo `pgactive`**

O exemplo a seguir mostra como juntar uma instância de banco de dados do RDS para PostgreSQL ao grupo `pgactive`, bem como outras etapas necessárias para criar a extensão `pgactive` na instância de banco de dados.

Estas etapas pressupõem que as instâncias de banco de dados do RDS para PostgreSQL tenham sido configuradas com a extensão `pgactive`. Para obter mais informações, consulte [Inicializar o recurso de extensão pgactive](Appendix.PostgreSQL.CommonDBATasks.pgactive.basic-setup.md). 

1. Use `psql` para se conectar à instância em que você deseja receber atualizações do editor.

   ```
   psql --host=secondinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password=PASSWORD --dbname=postgres
   ```

1. Crie um banco de dados na segunda instância de banco de dados do RDS para PostgreSQL usando o seguinte comando:

   ```
   postgres=> CREATE DATABASE app;
   ```

1. Alterne a conexão para o novo banco de dados usando o seguinte comando:

   ```
   \c app
   ```

1. Crie a extensão `pgactive` no banco de dados existente.

   ```
   app=> CREATE EXTENSION pgactive;
   ```

1. Junte a segunda instância de banco de dados do RDS para PostgreSQL ao grupo do `pgactive` de uma forma mais segura usando os seguintes comandos:

   ```
   -- connection info for endpoint1
   CREATE SERVER pgactive_server_endpoint1
       FOREIGN DATA WRAPPER pgactive_fdw
       OPTIONS (host '<endpoint1>', dbname 'app');
   CREATE USER MAPPING FOR postgres
       SERVER pgactive_server_endpoint1
       OPTIONS (user 'postgres', password '<password>');
   
   -- connection info for endpoint2
   CREATE SERVER pgactive_server_endpoint2
       FOREIGN DATA WRAPPER pgactive_fdw
       OPTIONS (host '<endpoint2>', dbname 'app');
   CREATE USER MAPPING FOR postgres
       SERVER pgactive_server_endpoint2
       OPTIONS (user 'postgres', password '<password>');
   ```

   ```
   SELECT pgactive.pgactive_join_group(
       node_name := 'endpoint2-app',
       node_dsn := 'user_mapping=postgres pgactive_foreign_server=pgactive_server_endpoint2',
       join_using_dsn := 'user_mapping=postgres pgactive_foreign_server=pgactive_server_endpoint1'
   );
   ```

   Use os comandos a seguir como um método alternativo, mas menos seguro, para juntar a segunda instância de banco de dados do RDS for PostgreSQL ao grupo da `pgactive`:

   ```
   app=> SELECT pgactive.pgactive_join_group(
   node_name := 'node2-app',
   node_dsn := 'dbname=app host=secondinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD',
   join_using_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD');
   ```

   node2-app é o nome atribuído para identificar de maneira exclusiva um nó no grupo `pgactive`.

1. Para verificar se a instância de banco de dados está pronta, use o seguinte comando:

   ```
   app=> SELECT pgactive.pgactive_wait_for_node_ready(); 
   ```

   Se o comando for bem-sucedido, você verá o seguinte resultado:

   ```
   pgactive_wait_for_node_ready 
   ------------------------------ 
   (1 row)
   ```

   Se o primeiro banco de dados RDS para PostgreSQL for relativamente grande, você poderá ver `pgactive.pgactive_wait_for_node_ready()` emitindo o relatório de progresso da operação de restauração. A saída será semelhante à seguinte:

   ```
   NOTICE:  restoring database 'app', 6% of 7483 MB complete
   NOTICE:  restoring database 'app', 42% of 7483 MB complete
   NOTICE:  restoring database 'app', 77% of 7483 MB complete
   NOTICE:  restoring database 'app', 98% of 7483 MB complete
   NOTICE:  successfully restored database 'app' from node node1-app in 00:04:12.274956
    pgactive_wait_for_node_ready 
   ------------------------------ 
   (1 row)
   ```

   Deste ponto em diante, `pgactive` sincroniza os dados entre as duas instâncias de banco de dados.

1. Você pode usar o comando a seguir para verificar se o banco de dados da segunda instância de banco de dados tem os dados:

   ```
   app=> SELECT count(*) FROM inventory.products;
   ```

   Se os dados forem sincronizados com sucesso, você verá a seguinte saída:

   ```
    count
   -------
    3
   ```

1. Execute o seguinte comando para inserir novos valores:

   ```
   app=> INSERT INTO inventory.products (id, product_name) VALUES (4, 'lotion');
   ```

1. Conecte-se ao banco de dados da primeira instância de banco de dados e execute a seguinte consulta:

   ```
   app=> SELECT count(*) FROM inventory.products;
   ```

   Se a replicação ativa-ativa for inicializada, a saída será semelhante à seguinte:

   ```
   count
   -------
    4
   ```

**Como desanexar e remover uma instância de banco de dados do grupo `pgactive`**

É possível desanexar e remover uma instância de banco de dados do grupo `pgactive` usando estas etapas:

1. Você pode separar a segunda instância de banco de dados da primeira instância de banco de dados usando o seguinte comando:

   ```
   app=> SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app']);
   ```

1. Remova a extensão `pgactive` da segunda instância de banco de dados usando o seguinte comando:

   ```
   app=> SELECT * FROM pgactive.pgactive_remove();
   ```

   Para remover a extensão forçosamente:

   ```
   app=> SELECT * FROM pgactive.pgactive_remove(true);
   ```

1. Descarte a extensão usando o seguinte comando:

   ```
   app=> DROP EXTENSION pgactive;
   ```