En este documento, se describe cómo crear ranuras de replicación lógica en AlloyDB Omni. La replicación lógica en AlloyDB Omni se usa para transmitir continuamente cambios de datos específicos de la base de datos de origen (publicador) a otras bases de datos o aplicaciones (suscriptores). Los cambios transmitidos pueden ser actualizaciones, inserciones o eliminaciones de filas individuales. Los suscriptores se conectan al publicador a través de un espacio de replicación único que garantiza una conexión persistente. Una conexión persistente mantiene el estado de transmisión de datos, por lo que, si se produce una interrupción, la transmisión se reanuda desde donde se detuvo.
Para obtener más información sobre la replicación lógica en PostgreSQL, consulta Replicación lógica.
Configura el clúster de publicador y suscriptor
Antes de crear los intervalos de replicación, debes crear el clúster de publicador y suscriptor con la replicación lógica habilitada. El parámetro wal_level
debe establecerse como logical
en los manifiestos correspondientes.
Para crear un clúster de bases de datos de publicador con la replicación lógica habilitada, crea y aplica un manifiesto DBCluster
.
El siguiente es un ejemplo de manifiesto del publicador:
apiVersion: v1
kind: Secret
metadata:
name: db-pw-mydbc
type: Opaque
data:
mydbc: "Q2hhbmdlTWUxMjM="
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: mydbc
spec:
databaseVersion: "15.7.0"
spec:
availability:
numberOfStandbys: 1
primarySpec:
parameters:
wal_level: "logical"
adminUser:
passwordRef:
name: db-pw-mydbc
resources:
cpu: 1
memory: 8Gi
disks:
- name: DataDisk
size: 10Gi
Para crear un clúster de bases de datos de suscriptores con la replicación lógica habilitada, crea y aplica un manifiesto DBCluster
.
El siguiente es un ejemplo de manifiesto de suscriptor:
apiVersion: v1
kind: Secret
metadata:
name: db-pw-subscriber
type: Opaque
data:
subscriber: "Q2hhbmdlTWUxMjM=" #ChangeMe123
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: subscriber
spec:
databaseVersion: "15.7.0"
primarySpec:
parameters:
wal_level: "logical"
adminUser:
passwordRef:
name: db-pw-subscriber
resources:
memory: 10Gi
cpu: 1
disks:
- name: DataDisk
size: 40Gi
—
Crea una ranura de replicación
Después de crear los clústeres de publicador y suscriptor, puedes crear un espacio de replicación lógico con el recurso Replication
en el clúster de publicador. Cada recurso Replication
está asociado con 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ógicos asociados.
Para configurar un espacio de replicación en tu clúster de publicador, aplica el siguiente manifiesto:
apiVersion: v1
kind: Secret
metadata:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
data:
rep-user-pw: BASE64_ENCODED_PASSWORD
---
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
Reemplaza lo siguiente:
- REPLICATION_NAME: Es un nombre para este recurso
Replication
, por ejemplo,replication-1
. - NAMESPACE: El espacio de nombres de Kubernetes para este recurso
Replication
. Debe coincidir con el espacio de nombres del clúster de bases de datos. - DB_CLUSTER_NAME: Es el nombre del clúster de bases de datos que asignaste cuando lo creaste.
- DECODER_PLUGIN: Establece el complemento de decodificación, como
pgoutput
, que deseas usar para la replicación lógica. Para obtener más información sobre los diversos complementos de decodificación, consulta Complementos de salida. - DATABASE_NAME: Se establece en el nombre de la base de datos cuyos cambios deseas transmitir al espacio de réplica. Asegúrate de que la base de datos ya se haya creado en el clúster del publicador.
- APPLICATION_NAME (opcional): Establece el nombre de la aplicación que se conectará a la ranura de replicación. Este campo es obligatorio cuando el modo de transmisión se establece en síncrono.
- REPLICATION_MODE (opcional): Se establece en
false
para la replicación asíncrona. Si deseas habilitar la replicación síncrona, pero a costa de la velocidad, establece este valor comotrue
. El valor predeterminado esfalse
, si no se configura de forma explícita. - REPLICATION_SLOT_NAME: Es el nombre del espacio de réplica que se creará y que usará el suscriptor.
- REPLICATION_USER (opcional): Es el nombre del usuario que se conecta al espacio de replicación. Si configuras el usuario de replicación, debes configurar el nombre, el espacio de nombres y la contraseña del secreto.
- USER_PASSWORD_SECRET_NAME (opcional): Es el nombre del Secret de Kubernetes del usuario de la aplicación. Obligatorio si se configura el usuario de la aplicación.
- USER_PASSWORD_SECRET_NAMESPACE (opcional): Es el espacio de nombres en el que se encuentra el secreto de Kubernetes para el usuario de la aplicación. Obligatorio si se configura el usuario de la aplicación.
- BASE64_ENCODED_PASSWORD (opcional): La contraseña codificada en base64 del usuario de la aplicación. Obligatorio si se configura el usuario de la aplicación.
Otorga permisos al usuario de replicación
Para otorgar permisos de replicación y publicación al usuario de replicación en el clúster del publicador, sigue estos pasos:
Conéctate al pod principal en el clúster del publicador con
psql
:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
Reemplaza lo siguiente:
- IP_ADDRESS: Es la dirección IP del pod principal del clúster del publicador.
- USERNAME: Es el usuario postgres de la base de datos.
- DATABASE_NAME: Es la base de datos a la que se quiere suscribir el suscriptor.
Otorga 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;
Crea una publicación y una suscripción
Cómo crear una publicación
Para crear una publicación en el clúster del publicador, sigue estos pasos:
Conéctate al pod principal en el clúster del publicador con
psql
:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
Reemplaza lo siguiente:
- IP_ADDRESS: Es la dirección IP del pod principal del clúster del publicador.
- USERNAME: Es el usuario postgres de la base de datos.
- DATABASE_NAME: Es la base de datos a la que se quiere suscribir el suscriptor.
Ejecuta el siguiente comando para crear la publicación:
CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
Reemplaza lo siguiente:
- PUBLICATION_NAME: Es el nombre de la publicación que usará el suscriptor para suscribirse.
- TABLE_NAME: Es la tabla a la que el suscriptor desea suscribirse.
Crear suscripción
Para crear una suscripción en el clúster de suscriptores, sigue estos pasos:
Conéctate al pod principal en el clúster de suscriptores con
psql
:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
Reemplaza lo siguiente:
- IP_ADDRESS: Es la dirección IP del pod principal del clúster de suscriptores.
- USERNAME: Es el usuario postgres de la base de datos.
- DATABASE_NAME: Es la base de datos a la que se quiere suscribir el suscriptor.
Ejecuta el siguiente comando para crear una suscripción:
CREATE SUBSCRIPTION SUBSCRIPTION_NAME CONNECTION 'host=IP_ADDRESS port=PORT user=REPLICATION_USER dbname=DATABASE_NAME password=PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name=REPLICATION_SLOT_NAME, create_slot=false); alter subscription SUBSCRIPTION_NAME refresh publication ;
Reemplaza lo siguiente:
- SUBSCRIPTION_NAME: Es el nombre de la suscripción.
- IP_ADDRESS: Es la dirección IP del pod principal del clúster del publicador.
Todas las actualizaciones de la tabla en el clúster del publicador se replican en la tabla del clúster del suscriptor.
Consulta el estado del espacio de replicación
Para ver el estado de los intervalos 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
DATABASE_ENDPOINT
muestra la dirección IP que usas para conectarte a la base de datos. El estado TRUE
en la columna READY
indica que el espacio está listo para transmitir. Cuando la aplicación se conecta al espacio de replicación, el estado en la columna HEALTHY
cambia a TRUE
.
Limitaciones
No se admiten actualizaciones de la configuración del espacio de replicación. Para actualizar la configuración, descarta el espacio de replicación y vuelve a crearlo con la configuración actualizada.
Para descartar el espacio de réplica, ejecuta el siguiente comando: kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
Solo puedes configurar la ranura de replicación lógica en la base de datos del publicador. No se admiten las configuraciones de suscriptores.
Si el clúster de bases de datos al que hace referencia el objeto de replicación está configurado para la alta disponibilidad, el espacio de replicación lógica se vuelve a crear en el estado de espera promovido después de una conmutación por error. Después de que se vuelva a crear la ranura de replicación, la posición de la transmisión en la ranura ya no estará disponible, y las aplicaciones que se suscriban a la transmisión deberán volver a conectarse y reproducirla.