Este documento fornece exemplos que mostram como criar e configurar manualmente um cluster de assinantes. Um cluster de assinante é um cluster de banco de dados que recebe dados replicados de um cluster de editores.
Os snippets de código nesta página são exemplos que você pode usar como modelos, substituindo os valores pelos seus recursos do AlloyDB Omni.
Antes de começar
- Instalar o Omni Operator no Kubernetes.
- Crie um slot de replicação, um cluster de editores e uma publicação. Para mais informações, consulte Criar slots de replicação e publicação.
Criar e configurar o cluster de assinantes
Crie um cluster de assinantes.
$ cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: db-pw-DB_CLUSTER_NAME type: Opaque data: DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: subscriber spec: databaseVersion: "15.7.0" primarySpec: adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: memory: MEMORY_SIZE cpu: CPU_COUNT disks: - name: DataDisk size: DISK_SIZE EOF
Substitua:
DB_CLUSTER_NAME
: o nome desse cluster de banco de dados, por exemplo,subscriber-cluster
.ENCODED_PASSWORD
: a senha de login do banco de dados para a função de usuáriopostgres
padrão, codificada como uma string base64. Por exemplo,Q2hhbmdlTWUxMjM=
paraChangeMe123
.CPU_COUNT
: o número de CPUs disponíveis para cada instância de banco de dados neste cluster de banco de dados.MEMORY_SIZE
: a quantidade de memória por instância do banco de dados deste cluster de banco de dados. Recomendamos definir esse valor como 8 gigabytes por CPU. Por exemplo, se você definircpu
como2
anteriormente neste manifesto, recomendamos definirmemory
como16Gi
.DISK_SIZE
: o tamanho do disco por instância do banco de dados, por exemplo,10Gi
.
Encontre o pod necessário.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
Faça login no pod do banco de dados do cluster de assinantes.
$ kubectl get pod NAME READY STATUS RESTARTS AGE al-2bce-publisher-0 3/3 Running 0 20h $ kubectl exec -ti SUBSCRIBER_POD_NAME -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-3513-subscriber-0:/$
Substitua
SUBSCRIBER_POD_NAME
pelo nome do pod do assinante.Encontre o endereço IP do balanceador de carga no DBcluster do editor, como
10.116.14.190
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE al-publisher-rw-ilb ClusterIP 10.116.14.190 <none> 5432/TCP 21h
Faça um backup do esquema do editor como uma cópia inicial dos dados publicados no banco de dados do editor. A replicação lógica não oferece suporte à replicação de DDL. Um esquema ou uma tabela que você planeja replicar precisa existir no destino (cluster de assinantes) antes do início da replicação lógica.
postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
Substitua
PUBLISHER_IP_ADDRESS
pelo endereço IP do balanceador de carga no DBcluster do editor.Aplique o backup no banco de dados de assinantes.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
Opcional: verifique se não há dados na tabela.
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
Crie uma assinatura para o banco de dados. Verifique se a publicação já foi criada no DBCluster do editor.
postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
Substitua:
- REPLICATION_USER: o nome do usuário que se conecta ao slot de replicação.
- DATABASE_NAME: definido como o nome do banco de dados com as alterações que você quer transmitir do slot de replicação.
- PUBLISHER_CLUSTER_PASSWORD: a senha de login do banco de dados para o usuário
postgres
do DBCluster do editor. - PUBLICATION_NAME: o nome da publicação em que o assinante se inscreveu.
- REPLICATION_SLOT_NAME: o nome do slot de replicação criado no DBCluster do editor.
Opcional: verifique a replicação no cluster de assinantes.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from public.company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
No cluster do editor, adicione uma linha à tabela.
# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
Substitua TABLE_NAME pelo nome da tabela no DBCluster do editor em que o assinante está inscrito.
No cluster de assinantes, verifique se a linha adicionada à tabela no cluster de editores foi replicada para a tabela no cluster de assinantes.
# On the subscriber database, data is synced. postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 6 | Alex | 39 | 100000 (6 rows)
Criar manualmente outras tabelas
A replicação lógica não sincroniza automaticamente as mudanças de DDL, ao contrário do
replicate_ddl_command
em pglogical
. Embora a ferramenta de código aberto
pgl_ddl_deploy
ofereça uma solução, também é possível executar comandos DDL manualmente no
inquilino.
Para ilustrar isso, crie uma nova tabela chamada
finance
no banco de dadoscustomer
no cluster de editores.# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# insert into finance values ('critical data'); INSERT 0 1 customer=# ALTER PUBLICATION pub_customer ADD TABLE finance; ALTER PUBLICATION
Quando uma nova tabela é adicionada ao cluster do editor, você aplica manualmente o DDL (criação de tabela) no assinante e, em seguida, verifica a replicação executando o seguinte no cluster do assinante.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION; ALTER SUBSCRIPTION customer=# select * from finance; row --------------- critical data (1 row)