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:

  1. Configurar o externo (editor) PostgreSQL wal_level=logical.
  2. Todas as tabelas selecionadas para replicação precisam conter uma chave primária ou ter REPLICA IDENTITY definida.
  3. 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.
  4. O servidor de dados ( PostgreSQL ) do qual você está replicando precisa ter o recurso " TLS " / " SSL " habilitado.
  5. 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.

  1. É necessário criar um banco de dados em sua implementação com o mesmo nome do banco de dados que você pretende replicar.
  2. 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_dump para 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.

  1. Edite o arquivo local pg_hba.conf e adicione o seguinte.

    hostssl    replication            replicator         0.0.0.0/0      md5
    hostssl    all                    replicator         0.0.0.0/0      md5
    

    O campo "replicator" é o usuário que você configurou com o privilégio " PostgreSQL " REPLICATION.

  2. Edite o arquivo local postgresql.conf com a configuração de replicação lógica necessária. Configure wal_level como 'lógico' e listen_addresses='*' para aceitar as conexões de qualquer host.

    listen_addresses='*'
    wal_level = logical
    
  3. Reinicie seu servidor PostgreSQL.

Agora é possível definir um publicador no banco de dados e incluir as tabelas que você deseja replicar no assinante.

  1. Efetue login no banco de dados do qual você deseja publicar com seu usuário de replicação.

    psql -U replicator -d exampledb
    
  2. Crie o canal de publicação.

    exampledb=> CREATE PUBLICATION my_publication;
    
  3. 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.

  1. Efetue login no banco de dados criado para replicação com o usuário admin.

    psql -U admin -d exampledb
    
  2. Execute a consulta a seguir para chamar a função create_subscription e 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;