Configurar a replicação ativa-ativa para as instâncias de banco de dados do RDS para PostgreSQL
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.
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.
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.
-
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
-
Crie um banco de dados na instância do RDS para PostgreSQL usando o seguinte comando:
postgres=>
CREATE DATABASEapp
; -
Alterne a conexão para o novo banco de dados usando o seguinte comando:
\c
app
-
Crie e preencha uma tabela de exemplo usando a seguinte instrução SQL:
-
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); -
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'); -
Verifique se os dados existem na tabela usando a declaração SQL a seguir.
app=>
SELECT count(*) FROM inventory.products;count ------- 3
-
-
Crie uma extensão
pgactive
no banco de dados existente.app=>
CREATE EXTENSION pgactive; -
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 como1
. -
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.
-
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
-
Crie um banco de dados na segunda instância de banco de dados do RDS para PostgreSQL usando o seguinte comando:
postgres=>
CREATE DATABASEapp
; -
Alterne a conexão para o novo banco de dados usando o seguinte comando:
\c
app
-
Crie a extensão
pgactive
no banco de dados existente.app=>
CREATE EXTENSION pgactive; -
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
. -
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. -
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
-
Execute o seguinte comando para inserir novos valores:
app=>
INSERT INTO inventory.products (id, product_name) VALUES (4, 'lotion'); -
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:
-
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
']); -
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); -
Descarte a extensão usando o seguinte comando:
app=>
DROP EXTENSION pgactive;