Databases for PostgreSQL como um destino de replicação lógica
IBM Cloud® Databases for PostgreSQL suporta replicação lógica, na qual você pode criar um subcriador ou um editor. Você também pode configurar seu banco de dados externo PostgreSQL como editor e sua instância do Databases for PostgreSQL como assinante, e replicar seus dados de um banco de dados externo para sua instância.
A Replicação lógica está disponível apenas em implementações que executam o PostgreSQL 10 ou mais recente. Os links para a documentação do PostgreSQL redirecionam você para a versão atual do PostgreSQL. Se você precisar da documentação de uma versão específica, poderá encontrar links para as diferentes versões do PostgreSQL na página de documentação do PostgreSQL.
Configurando o publicador
A instância externa do PostgreSQL é o publicador e precisa ser configurada para que sua implementação do Databases for PostgreSQL se conecte e seja capaz de extrair os dados corretamente.
Funções do editor
create_publisher
Em cada banco de dados, você pode criar várias publicações para publicar as alterações em um subcritério diferente.
Arguments:
publisher_name The Unique name of publisher.
for table To publish single/list of tables
for all table To publish all tables, along with future tables.
for all tables in schema To publish all tables in schema, along wth future tables.
Usage:
exampledb=> CREATE PUBLICATION my_publication;
CREATE PUBLICATION
list_publisher
Liste o número de publicações em execução em cada banco de dados.
Usage:
exampledb=# select * from pg_publication;
oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate
-------+----------------+----------+--------------+-----------+-----------+-----------+-------------
16401 | my_publication | 10 | t | t | t | t | t
alter_publisher
Modificar a definição da publicação.
Syntax:
ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_object [, ...]
ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )
ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION name RENAME TO new_name
Usage:
exampledb=# ALTER PUBLICATION my_publication RENAME TO my_publication_new;
ALTER PUBLICATION
drop_publisher
Solte/retire a publicação que não estiver sendo usada.
Usage:
exampledb=# drop publication my_publication_new;
DROP PUBLICATION
Considere o seguinte como pré-requisito:
- Configurar o externo (editor) PostgreSQL
wal_level=logical. - Todas as tabelas selecionadas para replicação precisam conter uma chave primária ou ter
REPLICA IDENTITYdefinida. - Seu PostgreSQL externo (editor) precisa ter um usuário de replicação que tenha o privilégio PostgreSQL
REPLICATION, e esse usuário precisa ter privilégios SELECT e USAGE nos bancos de dados, além de privilégios REPLICATION. - O servidor de dados ( PostgreSQL ) do qual você está replicando precisa ter o recurso " TLS " / " SSL " habilitado.
- Fornecer privilégios BYPASSRLS ao usuário externo (editor) da replicação PostgreSQL, se a segurança de nível de linha estiver ativada.
Existem limitações inerentes e algumas restrições à replicação lógica descritas na documentação do PostgreSQL. Analise-os antes de decidir se a replicação lógica é apropriada para seu caso de uso.
Configurando o assinante
Para configurar sua implantação de Databases for PostgreSQL e garantir que seus dados sejam replicados corretamente, verifique o seguinte.
- É necessário criar um banco de dados em sua implementação com o mesmo nome do banco de dados que você pretende replicar.
- A Replicação lógica funciona no nível de tabela, portanto, toda tabela selecionada para publicação precisará ser criada no assinante antes de iniciar o processo de replicação lógica. (Você pode usar
pg_dumppara ajudar.) A tabela no assinante não precisa ser idêntica à sua contraparte do publicador. No entanto, a tabela no assinante deve conter pelo menos cada coluna presente na tabela no publicador. As colunas adicionais presentes no assinante não devem ter NOT NULL ou outras restrições. Se tiverem, a replicação falhará.
Os comandos nativos de assinatura do PostgreSQL exigem privilégios de superusuário, os quais não estão disponíveis em implantações do Databases for PostgreSQL. Em vez disso, sua implementação inclui um conjunto de funções
que podem ser usadas para configurar e gerenciar a replicação lógica da assinatura.
Apenas o usuário administrativo fornecido pelo Databases for PostgreSQL tem permissões para executar os comandos de replicação a seguir, que permitem assinar e replicar o conteúdo de um publicador PostgreSQL externo.
Funções do assinante
create_subscription
Arguments:
subscription_name Unique name to create the subscription channel with
host_ip Publisher hostname or public IP address
port Port number publisher is running on
password Password of the `admin` user on the publisher
username `admin` user created on the publisher
db_name The name of the database to be replicated
publisher_name The name of publisher channel on the publisher
These additional configuration options are only supported in PostgreSQL 17 and later.
copy_data The copy_data parameter (true or false, default: true)
determines whether the initial data from the publication
should be copied to the subscriber when the subscription
is created.
origin The origin parameter (ANY or NONE, default: NONE) allows
filtering of changes based on their origin. It helps exclude
or include changes coming from specific nodes in multi-node or
cascading replication setups.
failover The failover parameter (true or false, default: false) enables
support for automatic failover of the subscription between replicated
nodes, ensuring continuity during primary node transitions.
Usage:
exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','password','admin','exampledb','my_publication');
PostgreSQL 17 and later
exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','password','admin','exampledb','my_publication' 'true', 'ANY' , 'true');
delete_subscription
Arguments:
subscription_name Name the subscription channel to delete
db_name The name of the replicated database
Usage:
exampledb=> SELECT delete_subscription('subs1', 'exampledb');
list_subscriptions
Arguments:
None
Usage:
exampledb=> SELECT * FROM list_subscriptions();
disable_subscription
Arguments:
subscription_name Name the subscription channel to disable
db_name The name of the replicated database
Usage:
exampledb=> SELECT disable_subscription('subs1','exampledb');
enable_subscription
Arguments:
subscription_name Name the subscription channel to enable
db_name The name of the replicated database
Usage:
exampledb=> SELECT enable_subscription('subs1','exampledb');
subscription_slot_none
Essa função é usada para definir o nome do slot de uma assinatura como NONE. Isso é necessário para excluir uma assinatura, de modo que um slot de replicação remota não possa ser descartado, não exista ou nunca tenha existido.
Arguments:
subscription_name Name the subscription channel to alter
db_name The name of the replicated database
Usage:
exampledb=> SELECT subscription_slot_none('subs1','exampledb');
refresh_subscription
Essa função será usada para atualizar uma assinatura no assinante depois que forem feitas mudanças no publicador, como a inclusão ou a remoção de uma tabela.
Arguments:
subscription_name Name the subscription channel to refresh
db_name The name of the replicated database
Usage:
exampledb=> SELECT refresh_subscription('subs1','exampledb');
Configurando a replicação lógica no publicador
Para configurar seu PostgreSQL externo como um editor, execute as seguintes etapas.
-
Edite o arquivo local
pg_hba.confe adicione o seguinte.hostssl replication replicator 0.0.0.0/0 md5 hostssl all replicator 0.0.0.0/0 md5O campo "replicator" é o usuário que você configurou com o privilégio " PostgreSQL "
REPLICATION. -
Edite o arquivo local
postgresql.confcom a configuração de replicação lógica necessária. Configurewal_levelcomo 'lógico' elisten_addresses='*'para aceitar as conexões de qualquer host.listen_addresses='*' wal_level = logical -
Reinicie seu servidor PostgreSQL.
Agora é possível definir um publicador no banco de dados e incluir as tabelas que você deseja replicar no assinante.
-
Efetue login no banco de dados do qual você deseja publicar com seu usuário de replicação.
psql -U replicator -d exampledb -
Crie o canal de publicação.
exampledb=> CREATE PUBLICATION my_publication; -
Inclua tabelas no publicador.
exampledb=> ALTER PUBLICATION my_publication ADD TABLE my_table;O número de trabalhadores que apoiam a sincronização definida pelo parâmetro de configuração
max_logical_replication_workersé limitado e não pode ser alterado. Portanto, use o menor número possível de publicações e adicione o maior número possível de tabelas em uma única publicação.
Configurando a replicação lógica no assinante
Para configurar sua Databases for PostgreSQL implantação como assinante, execute as seguintes etapas.
-
Efetue login no banco de dados criado para replicação com o usuário
admin.psql -U admin -d exampledb -
Execute a consulta a seguir para chamar a função
create_subscriptione criar o canal do assinante.exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','admin','password','exampledb','my_publication');
Monitorando a replicação
É possível monitorar o status de replicação lógica no publicador e no assinante executando a consulta a seguir em cada um deles.
exampledb=> SELECT * FROM pg_stat_replication;