Esta página mostra as etapas para replicar dados entre o Google Cloud AlloyDB
e o AlloyDB Omni usando a extensão pglogical
.
Para ter uma visão geral de pglogical
no AlloyDB Omni, seus benefícios e limitações, consulte Sobre a extensão pglogical.
Principais componentes de pglogical
Os principais componentes da extensão pglogical
são:
- Nó: referência fornecida para o banco de dados em um cluster do PostgreSQL.
A extensão
pglogical
é instalada e funciona em qualquer número de bancos de dados no cluster, e cada um deles atua como um nó pglogical distinto. Cada nó pode ser um provedor, também conhecido como origem de replicação, ou um assinante, também conhecido como destino de replicação, ou ambos simultaneamente. Apenas um nó é permitido por banco de dados. - Conjunto de replicação: definido no banco de dados do provedor como um agrupamento lógico de
tabelas e sequências a serem migradas e as instruções SQL, como
INSERT, UPDATE, DELETE, TRUNCATE
, que precisam ser replicadas. É possível atribuir tabelas a mais de um conjunto de replicação. Por padrão, três conjuntos de replicação pré-configurados, comodefault
,default_insert_only
eddl_sql
, são fornecidos, e você pode adicionar quantos conjuntos de replicação quiser para atender às suas necessidades. - Assinatura: fornece detalhes das mudanças replicadas dos bancos de dados do provedor
e das mudanças replicadas dos bancos de dados do provedor no banco de dados do
assinante. A assinatura especifica o banco de dados do provedor usando uma
string de conexão e, opcionalmente, quais conjuntos de replicação desse provedor
precisam ser copiados. Além disso, você também pode especificar se vai usar
apply delay
ao criar a assinatura.
Nesta implantação, o serviço AlloyDB do Google Cloud é o provedor, e o AlloyDB Omni local é o assinante. A configuração oposta também é possível.
Métodos de autenticação compatíveis
É necessário considerar a rede e a segurança entre os nós de replicação
antes de implementar a extensão pglogical
no AlloyDB Omni.
Os dois principais métodos de autenticação
usados com a extensão pglogical
são métodos de autenticação de senha e
confiança.
O método de autenticação recomendado é a autenticação de confiança porque, no
método de autenticação de senha, as senhas são armazenadas no formato de texto simples
em tabelas de banco de dados pertencentes a pglogical
. Essas senhas ficam visíveis em texto simples para qualquer pessoa com permissões de banco de dados para consultar essas tabelas, em backups não binários e nos arquivos de registro do PostgreSQL.
Se você estiver usando o método de autenticação de confiança, faça entradas específicas
no arquivo de autenticação baseado em host, pg_hba.conf
, para ter a máxima segurança. É possível
restringir o acesso especificando os bancos de dados de destino, permitindo apenas a opção de
replicação ou bancos de dados específicos, o usuário de replicação e apenas do endereço IP
específico do assinante.
Antes de começar
É possível instalar o pglogical
como uma extensão em um determinado banco de dados.
Antes de implementar a extensão pglogical
no AlloyDB Omni, confirme
se você atende aos seguintes requisitos do sistema:
- Um cluster do Google Cloud AlloyDB e acesso de leitura/gravação à instância principal como administrador do Cloud AlloyDB. Para instruções sobre como provisionar um cluster do AlloyDB no Google Cloud , consulte Criar e se conectar a um banco de dados.
- Um servidor do AlloyDB Omni, instalado e configurado. Para instruções sobre como instalar o AlloyDB Omni, consulte Instalar o AlloyDB Omni.
- Os endereços IP da instância primária do Google Cloud AlloyDB's e do servidor host do AlloyDB Omni.
- Uma rede estabelecida e protegida entre o Google Cloud AlloyDB e o servidor host do AlloyDB Omni. É necessária conectividade TCP na porta padrão do PostgreSQL 5432.
Ajustar parâmetros no provedor do AlloyDB no Google Cloud
A extensão pglogical
requer um conjunto mínimo de ajustes de parâmetros no cluster de provedordo Google Cloud do AlloyDB. Defina o parâmetro wal_level
como logical
e anexe pglogical
ao parâmetro shared_preload_libraries
no arquivo postgresql.conf
.
cp postgresql.conf postgresql.bak
sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
sed -r -i "s|',|'|" postgresql.conf
No serviço AlloyDB do Google Cloud , é possível ajustar parâmetros definindo as flags de cluster adequadas.
É necessário ajustar os parâmetros para as seguintes flags do AlloyDB do Google Cloud :
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
Para informações sobre como definir flags de banco de dados no Google Cloud AlloyDB, consulte Configurar flags de banco de dados de uma instância.
Para os outros parâmetros de banco de dados do nó do provedor, defina os valores padrão do Google Cloud AlloyDB da seguinte maneira:
max_worker_processes
: um por banco de dados do provedor e pelo menos um por nó de assinante. O padrão para esse parâmetro é de pelo menos 10.max_replication_slots
: um por nó nos nós do provedor.max_wal_senders
: um por nó nos nós do provedor.track_commit_timestamp
: definido comoon
se a última ou a primeira atualização vencer a resolução de conflitos.listen_addresses
: precisa incluir o endereço IP do AlloyDB Omni ou mencionar um bloco CIDR de cobertura.
É possível verificar esses parâmetros usando qualquer ferramenta de consulta, como psql
.
Ajustar parâmetros no cluster de assinantes do AlloyDB Omni
A extensão pglogical
também exige um conjunto mínimo de ajustes de parâmetro no
assinante do AlloyDB Omni. Anexe pglogical
ao parâmetro shared_preload_libraries
no arquivo
DATA_DIR/postgresql.conf
. Se algum banco de dados no cluster funcionar como um banco de dados do provedor, faça
as mudanças de parâmetro necessárias para bancos de dados do provedor.
Substitua DATA_DIR pelo caminho do sistema de arquivos para o diretório de dados, por exemplo, /home/$USER/alloydb-data
.
Ajuste os parâmetros:
sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
Verifique se o parâmetro está definido corretamente:
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
Reinicie o AlloyDB Omni para que a mudança de parâmetro entre em vigor:
Docker
docker container restart CONTAINER_NAME
Substitua
CONTAINER_NAME
pelo nome que você atribuiu ao contêiner AlloyDB Omni quando ele foi instalado.Podman
podman container restart CONTAINER_NAME
Substitua
CONTAINER_NAME
pelo nome que você atribuiu ao contêiner AlloyDB Omni quando ele foi instalado.Defina os valores padrão do AlloyDB Omni para outros parâmetros de banco de dados do provedor:
max_worker_processes
: um por banco de dados do provedor e um por nó de assinante.track_commit_timestamp
: defina comoon
se a resolução de conflito de vitória da última ou da primeira atualização for necessária.
Confirme se todos os valores dos parâmetros estão definidos corretamente:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;"
Ajustes de autenticação baseada em host no cluster de assinantes do AlloyDB Omni
O pglogical
faz conexões TCP locais com o banco de dados de assinantes do AlloyDB Omni. Portanto, adicione o endereço IP do servidor host do assinante ao
arquivo DATA_DIR/pg_hba.conf
do AlloyDB Omni.
Adicione uma entrada de autenticação de confiança para o servidor local, específica para um novo usuário
pglogical_replication
, ao arquivoDATA_DIR/pg_hba.conf
:echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
Verifique se a entrada está correta:
tail -2 DATA_DIR/pg_hba.conf
Reinicie o AlloyDB Omni para que a mudança de autenticação entre em vigor:
Docker
docker container restart CONTAINER_NAME
Podman
podman container restart CONTAINER_NAME
Criar um usuário pglogical
em clusters de provedor e assinante
Você precisa criar um novo usuário no cluster do provedor e do assinante.
pglogical
exige que o usuário tenha as permissões
superuser
e replication
.
No cluster do provedor do AlloyDB no Google Cloud , crie o usuário e conceda o papel
alloydbsuperuser
:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; GRANT alloydbsuperuser TO pglogical_replication;
No cluster de assinantes do AlloyDB Omni, crie o usuário e conceda os atributos
replication
esuperuser
:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
Adicionar pglogical
e nós ao banco de dados do provedor Google Cloud AlloyDB
Conceda os privilégios necessários.
É necessário instalar a extensão
pglogical
em cada banco de dados e conceder a permissãousage
ao usuário do banco de dados pglogical. No Google Cloud AlloyDB, é necessário conceder privilégios no esquemapglogical
.Por exemplo, se o banco de dados for
my_test_db
, execute o comando abaixo no banco de dados do provedor Google Cloud AlloyDB:\c my_test_db; CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication; -- For Google Cloud AlloyDB we also need to manually grant privileges: GRANT ALL PRIVILEGES ON ALL tables IN SCHEMA pglogical TO pglogical_replication;
Crie um nó
pglogical
para os bancos de dados do provedor. Onode_name
é arbitrário, e a stringdsn
precisa ser uma conexão TCP válida de volta ao mesmo banco de dados. No Google Cloud AlloyDB, a parte do host dodsn
é o endereço IP fornecido para a instância principal.No Google Cloud AlloyDB, a autenticação de confiança não é permitida, e o argumento de senha precisa ser incluído no
dsn
. no parâmetro maxSurge.Por exemplo, para o banco de dados
my_test_db
, execute o seguinte comando:SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
Criar uma tabela e adicioná-la ao conjunto de replicação padrão
Crie uma tabela e adicione ao conjunto de replicação padrão no banco de dados do provedor do AlloyDB no Google Cloud.
Crie uma tabela de teste chamada
test_table_1
no banco de dados do provedor:CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
Conceda
SELECT
nas tabelas individuais ou execute o comandoGRANT SELECT ON ALL TABLES
. Todas as tabelas que fizerem parte de um conjunto de replicação precisam ter permissão de consulta concedida ao usuário de replicação,pglogical_replication
.GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
Adicione manualmente a tabela de teste ao conjunto de replicação padrão. É possível criar conjuntos de replicação pglogical personalizados ou usar os conjuntos de replicação padrão. Vários conjuntos de replicação padrão, como
default
,default_insert_only
eddl_sql
, foram criados quando você criou a extensão. É possível adicionar tabelas e sequências aos conjuntos de replicação individualmente ou todas de uma vez para um esquema especificado.-- Add the specified table to the default replication set: SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table;
(Opcional) Adicione todas as tabelas em um esquema especificado, como
public
:-- Add all "public" schema tables to the default replication set: SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table; -- Add all "public" schema sequences to the default replication: SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']); -- Check which sequences have been added to all replication sets: SELECT * FROM pglogical.replication_set_seq;
Remova a tabela do conjunto de replicação
default
. Se houver tabelas no esquema que não têm uma chave primária, você poderá configurá-las para a replicação somente INSERT ou definir as colunas que identificam exclusivamente a linha usando o recursoREPLICA IDENTITY
usado com o comandoALTER TABLE
. Se você adicionou essas tabelas ao conjunto de replicaçãodefault
automaticamente usando a funçãoreplication_set_add_all_tables
, remova-as manualmente desse conjunto de replicação e adicione-as ao conjuntodefault_insert_only
.-- Remove the table from the **default** replication set: SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
-- Manually add to the **default_insert_only** replication set: SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
Se quiser adicionar as tabelas recém-criadas ao conjunto de replicação de forma automática, adicione o gatilho
pglogical_assign_repset
conforme sugerido na origempglogical
.
Copiar o banco de dados para o cluster de assinantes do AlloyDB Omni
Crie um backup somente de esquema do banco de dados de origem usando o utilitário
pg_dump
.Execute o comando
pg_dump
do servidor de assinantes do AlloyDB Omni usando o endereço IP da instância principal do Google Cloud AlloyDB.pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
Importe o backup para o banco de dados do assinante no servidor AlloyDB Omni:
Docker
docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Podman
podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Ignore erros como alloydbsuperuser not existing
. Essa função é específica para
Google Cloud AlloyDB.
Isso cria o banco de dados e o esquema, sem nenhum dado de linha. Os dados de linha são replicados pela extensão pglogical
. Copie ou recrie manualmente outros usuários ou funções necessários.
Criar um nó e uma assinatura no banco de dados de assinantes do AlloyDB Omni
Crie um nó no banco de dados de assinantes do AlloyDB Omni:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
Crie uma assinatura no banco de dados do assinante, apontando de volta para a instância principal do banco de dados do provedor doGoogle Cloud AlloyDB.
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
Com base no tamanho da tabela e nos dados a serem replicados, o tempo de replicação pode variar de segundos a minutos. Depois disso, os dados iniciais precisam ser replicados do provedor para o assinante:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1;"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1;"
Outras linhas adicionadas ao banco de dados do provedor também são replicadas em segundos.
Outras considerações sobre a implantação do pglogical
A extensão pglogical
tem muitos recursos avançados que não são abordados neste documento.
Muitos desses recursos são aplicáveis à sua implementação. Considere os
seguintes recursos avançados:
- Resolução de conflitos
- Replicação bidirecional e multimestre
- Inclusão de sequências
- Procedimentos de alternância e failover
A seguir
- Replicar dados entre o AlloyDB Omni e outros bancos de dados
- Troca e failover com replicação
pglogical