En este documento se describe cómo crear ranuras de replicación lógica en AlloyDB Omni. En PostgreSQL, la replicación lógica es un método para copiar los cambios de datos de una base de datos de publicación a uno o varios suscriptores, que pueden ser bases de datos u otras aplicaciones. Puedes habilitar y configurar la replicación lógica en los clústeres que crees con el operador de Kubernetes de AlloyDB Omni.
Los cambios transmitidos pueden ser actualizaciones, inserciones o eliminaciones de filas concretas. Los suscriptores se conectan al editor a través de un espacio de replicación único que asegura una conexión persistente. Una conexión persistente mantiene el estado de la transmisión de datos, por lo que, si se produce una interrupción, la transmisión se reanuda desde el punto en el que se detuvo.
Para obtener más información sobre la replicación lógica en PostgreSQL, consulta Replicación lógica.
Los fragmentos de código de esta página son ejemplos que puedes usar como modelos. Para ello, sustituye los valores por los de tus recursos de AlloyDB Omni.
Antes de empezar
Crear un clúster de editores
Antes de crear las ranuras de replicación, debes crear el clúster de editores con la replicación lógica habilitada. Debe asignar el valor logical
al parámetro wal_level
en el archivo de manifiesto DBCluster
.
Para crear un clúster de base de datos de editor con la replicación lógica habilitada, aplica el siguiente manifiesto:
apiVersion: v1
kind: Secret
metadata:
name: db-pw-DB_CLUSTER_NAME
namespace: DB_CLUSTER_NAMESPACE
type: Opaque
data:
DB_CLUSTER_NAME: "ENCODED_PASSWORD"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
namespace: DB_CLUSTER_NAMESPACE
spec:
databaseVersion: "ALLOYDB_OMNI_VERSION"
spec:
availability:
numberOfStandbys: 1
primarySpec:
parameters:
wal_level: "logical"
adminUser:
passwordRef:
name: db-pw-DB_CLUSTER_NAME
resources:
cpu: CPU_COUNT
memory: MEMORY_SIZE
disks:
- name: DataDisk
size: DISK_SIZE
Haz los cambios siguientes:
DB_CLUSTER_NAME
: el nombre de este clúster de base de datos. Por ejemplo,publisher
.DB_CLUSTER_NAMESPACE
(Opcional): el espacio de nombres en el que quieres crear el clúster de bases de datos. Por ejemplo,publisher-namespace
.ENCODED_PASSWORD
: la contraseña de inicio de sesión de la base de datos del rol de usuariopostgres
predeterminado, codificada como una cadena base64. Por ejemplo,Q2hhbmdlTWUxMjM=
paraChangeMe123
.ALLOYDB_OMNI_VERSION
: la versión de AlloyDB Omni,15.7.0
o posterior.CPU_COUNT
: número de CPUs disponibles para cada instancia de base de datos de este clúster de bases de datos.MEMORY_SIZE
: la cantidad de memoria por instancia de base de datos de este clúster de bases de datos. Recomendamos que este valor sea de 8 gigabytes por CPU. Por ejemplo, si has definidocpu
como2
en este manifiesto, te recomendamos que definasmemory
como16Gi
.DISK_SIZE
: el tamaño del disco por instancia de base de datos. Por ejemplo,10Gi
.
Crear una ranura de replicación
Después de crear el clúster de editores, puedes crear un slot de replicación lógica mediante el recurso Replication
en el clúster de editores. Cada recurso Replication
está asociado a un recurso de clúster de base de datos correspondiente. Un clúster de bases de datos puede tener varios recursos de replicación lógica asociados.
Para configurar un espacio de replicación en tu clúster de editores, aplica el siguiente manifiesto:
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: REPLICATION_NAME
namespace: NAMESPACE
spec:
dbcluster:
name: DB_CLUSTER_NAME
upstream:
logicalReplication:
pluginName: DECODER_PLUGIN
databaseName: DATABASE_NAME
applicationName: APPLICATION_NAME
replicationSlotName: REPLICATION_SLOT_NAME
synchronous: "REPLICATION_MODE"
username: APPLICATION_USER
password:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
EOF
Haz los cambios siguientes:
- REPLICATION_NAME: un nombre para este recurso
Replication
. Por ejemplo,replication-1
. - NAMESPACE: el espacio de nombres de Kubernetes de este
Replication
recurso. Debe coincidir con el espacio de nombres del clúster de la base de datos. - DB_CLUSTER_NAME: el nombre del clúster de tu base de datos, que asignaste al crearlo.
- DECODER_PLUGIN: se asigna al complemento de decodificación, como
pgoutput
, que quieras usar para la replicación lógica. Para obtener más información sobre los distintos complementos de decodificación, consulta Complementos de salida. - DATABASE_NAME: se asigna al nombre de la base de datos cuyos cambios quieres transmitir al espacio de replicación. Asegúrate de que la base de datos ya se haya creado en el clúster de editores.
- APPLICATION_NAME (Opcional): se asigna al nombre de la aplicación que se conectará al espacio de replicación. Este campo es obligatorio cuando el modo de streaming es síncrono.
- REPLICATION_MODE (Opcional): asigna el valor
false
para la replicación asíncrona. Si quieres habilitar la réplica síncrona, pero a costa de la velocidad, define este valor comotrue
. El valor predeterminado esfalse
si no se define explícitamente. - REPLICATION_SLOT_NAME: el nombre del espacio de réplica que se creará y que usará el suscriptor. Por ejemplo,
logicalrepltestslot
. - REPLICATION_USER (Opcional): nombre del usuario que se conecta a la ranura de replicación. Si define el usuario de replicación, deberá indicar el nombre del secreto, el espacio de nombres y la contraseña.
- USER_PASSWORD_SECRET_NAME (Opcional): nombre del secreto de Kubernetes del usuario de la aplicación. Obligatorio si se ha definido el usuario de la aplicación.
- USER_PASSWORD_SECRET_NAMESPACE (Opcional): el espacio de nombres donde se encuentra el secreto de Kubernetes del usuario de la aplicación. Obligatorio si se ha definido el usuario de la aplicación.
Ver el estado de la ranura de réplica
Para ver el estado de las ranuras de replicación, ejecuta el siguiente comando:
kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml
El campo status
, junto con otros detalles, se incluye en la respuesta:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: REPLICATION_NAME
namespace: NAMESPACE
...
...
status:
conditions:
- lastTransitionTime: "2025-01-25T06:49:25Z"
message: Ready for replication
reason: Ready
status: "True"
type: Ready
- lastTransitionTime: "2025-01-25T06:49:25Z"
message: Replication slot is not being used
reason: Unhealthy
status: "False"
type: Healthy
observedGeneration: 2
upstream:
host: DATABASE_ENDPOINT
password:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
port: DATABASE_PORT
replicationSlotName: REPLICATION_SLOT_NAME
username: APPLICATION_USER
En DATABASE_ENDPOINT
se muestra la dirección IP que usas para conectarte a la base de datos. El estado TRUE
de la columna READY
indica que el espacio está listo para transmitir. Cuando el clúster de bases de datos o la aplicación suscriptores se conectan al espacio de replicación, el estado de la columna HEALTHY
cambia a TRUE
.
Configurar el clúster de editores
Busca el pódcast que necesites.
$ 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"
Conéctate al pod principal del clúster de editores mediante
psql
:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
Haz los cambios siguientes:
- IP_ADDRESS: la dirección IP del pod principal del clúster de editores.
- USERNAME: el usuario postgres de la base de datos.
- DATABASE_NAME: la base de datos a la que quiere suscribirse el suscriptor.
Si el
DATABASE_NAME
especificado en el recurso de replicación no existe, crea una base de datos.CREATE DATABASE DATABASE_NAME;
Opcional: Para hacer pruebas, añade una tabla a la base de datos e inserta algunos datos. Puede usar estos datos para observar la replicación de datos del editor al suscriptor.
$ psql -h localhost -U postgres DATABASE_NAME customer=# CREATE TABLE TABLE_NAME( customer(# ID INT PRIMARY KEY NOT NULL, customer(# NAME TEXT NOT NULL, customer(# AGE INT NOT NULL, customer(# SALARY REAL customer(# ); CREATE TABLE customer=# INSERT INTO TABLE_NAME (ID,NAME,AGE,SALARY) VALUES customer-# (1, 'Quinn', 25, 65000.00), customer-# (2, 'Kim', 22, 72250.00), customer-# (3, 'Bola', 31, 53000.00), customer-# (4, 'Sasha', 33, 105000.00), customer-# (5, 'Yuri', 27, 85000.00); INSERT 0 5 customer=# \dt List of relations Schema | Name | Type | Owner --------+---------+-------+---------- public | company | table | postgres (1 row) 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 (5 rows)
Sustituye TABLE_NAME por una tabla en la que quieras almacenar los datos y a la que se suscriba el suscriptor.
Concede los permisos:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER; GRANT USAGE ON SCHEMA public TO REPLICATION_USER; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO REPLICATION_USER;
Para crear una publicación, ejecuta el siguiente comando:
CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
Haz los cambios siguientes:
- PUBLICATION_NAME: el nombre de la publicación que usará el suscriptor para suscribirse.
Después de crear la publicación, puedes configurar tu clúster de suscriptores para la replicación lógica o configurar tu aplicación para que empiece a replicarse.
Limitaciones
No se admiten las actualizaciones de la configuración de la ranura de replicación. Para actualizar la configuración, elimina el espacio de replicación y vuelve a crearlo con la configuración actualizada.
Para eliminar el espacio de replicación, ejecuta el siguiente comando:
kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
Solo puedes configurar el espacio de replicación lógica en la base de datos de publicación. La API de replicación no admite aplicaciones ni clústeres de bases de datos de suscriptores de replicación lógica.
Si el clúster de base de datos al que hace referencia el objeto de replicación está configurado para ofrecer alta disponibilidad, la ranura de replicación lógica se vuelve a crear en la instancia en espera ascendida después de una conmutación por error. Una vez que se haya recreado el espacio de replicación, la posición del flujo en el espacio ya no estará disponible y las aplicaciones que se suscriban al flujo deberán volver a conectarse y reproducir el flujo.