Configura los ranuras de replicación con el operador de Kubernetes de AlloyDB Omni

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 como true. El valor predeterminado es false, 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:

  1. 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.
  2. 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:

  1. 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.
  2. 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:

  1. 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.
  2. 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.

¿Qué sigue?