Os fragmentos de código nesta página são exemplos que pode usar como modelos, substituindo os valores por valores dos seus recursos do AlloyDB Omni.
Antes de começar
- Instale o Omni Operator no Kubernetes.
- Certifique-se de que cria um espaço de replicação, um cluster de publicadores e uma publicação. Para mais informações, consulte o artigo Crie slots de replicação e publicação.
Crie e configure o cluster de subscritores
Crie um cluster de subscritores.
$ 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 o seguinte:
DB_CLUSTER_NAME
: o nome deste cluster de base de dados, por exemplo,subscriber-cluster
.ENCODED_PASSWORD
: a palavra-passe de início de sessão na base de dados para a função de utilizadorpostgres
predefinida, codificada como uma string base64, por exemplo,Q2hhbmdlTWUxMjM=
paraChangeMe123
.CPU_COUNT
: o número de CPUs disponíveis para cada instância da base de dados neste cluster de base de dados.MEMORY_SIZE
: a quantidade de memória por instância da base de dados deste cluster de base de dados. Recomendamos que defina esta opção para 8 gigabytes por CPU. Por exemplo, se definircpu
como2
anteriormente neste manifesto, recomendamos que definamemory
como16Gi
.DISK_SIZE
: o tamanho do disco por instância da base de dados, por exemplo,10Gi
.
Encontre o pod de que precisa.
$ 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"
Inicie sessão no pod da base de dados do cluster de subscritores.
$ 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 grupo de subscritores.Encontre o endereço IP do balanceador de carga no DBcluster do publicador, 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
Fazer uma cópia de segurança do esquema do publicador como uma cópia inicial dos dados publicados na base de dados do publicador. A replicação lógica não suporta a replicação de DDL. Um esquema ou uma tabela que planeia replicar tem de existir no destino (cluster de subscrição) antes de a replicação lógica ser iniciada.
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 equilibrador de carga no DBcluster do publicador.Aplique a cópia de segurança na base de dados de subscritores.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
Opcional: verifique se não existem dados na tabela.
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
Crie uma subscrição para a base de dados. Certifique-se de que a publicação já foi criada no DBCluster do publicador.
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 o seguinte:
- REPLICATION_USER: o nome do utilizador que se liga ao espaço de replicação.
- DATABASE_NAME: definido como o nome da base de dados cujas alterações quer transmitir a partir do espaço de replicação.
- PUBLISHER_CLUSTER_PASSWORD: a palavra-passe de início de sessão na base de dados
para o utilizador
postgres
do DBCluster do publicador. - PUBLICATION_NAME: o nome da publicação que o subscritor subscreve.
- REPLICATION_SLOT_NAME: o nome do espaço de replicação criado no DBCluster do publicador.
Opcional: valide a replicação no cluster do subscritor.
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 publicador, 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 publicador ao qual o subscritor está subscrito.
No cluster de subscrição, verifique se a linha adicionada à tabela no cluster de publicação foi replicada para a tabela no cluster de subscrição.
# 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)
Crie manualmente tabelas adicionais
A replicação lógica não sincroniza automaticamente as alterações de DDL, ao contrário da replicação física no pglogical
.replicate_ddl_command
Embora a ferramenta de código aberto
pgl_ddl_deploy
ofereça uma solução, também pode executar comandos DDL manualmente no
subscritor.
Para ilustrar isto, crie uma nova tabela denominada
finance
na base de dadoscustomer
no cluster do publicador.# 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 é adicionada uma nova tabela ao cluster do publicador, aplica manualmente o DDL (criação de tabelas) no subscritor e, em seguida, valida a replicação executando o seguinte no cluster do subscritor.
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)