Configurer des emplacements de réplication à l'aide de l'opérateur Kubernetes AlloyDB Omni

Ce document explique comment créer des emplacements de réplication logiques dans AlloyDB Omni. La réplication logique dans AlloyDB Omni permet de diffuser en continu des modifications de données spécifiques de la base de données source (éditeur) vers d'autres bases de données ou applications (abonnés). Les modifications diffusées peuvent être des mises à jour, des insertions ou des suppressions de lignes individuelles. Les abonnés se connectent à l'éditeur via un emplacement de réplication unique qui garantit une connexion persistante. Une connexion persistante maintient l'état de streaming des données. Par conséquent, en cas d'interruption, le streaming reprend là où il s'était arrêté.

Pour en savoir plus sur la réplication logique dans PostgreSQL, consultez Réplication logique.

Configurer le cluster éditeur et abonné

Avant de créer les emplacements de réplication, vous devez créer le cluster d'éditeur et le cluster d'abonné avec la réplication logique activée. Le paramètre wal_level doit être défini sur logical dans les fichiers manifestes respectifs.

Pour créer un cluster de base de données d'éditeur avec la réplication logique activée, créez et appliquez un fichier manifeste DBCluster.

Voici un exemple de fichier manifeste d'éditeur:

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

Pour créer un cluster de base de données d'abonné avec la réplication logique activée, créez et appliquez un fichier manifeste DBCluster.

Voici un exemple de fichier manifeste d'abonné:

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
—

Créer un emplacement de réplication

Une fois que vous avez créé les clusters d'éditeur et d'abonné, vous pouvez créer un emplacement de réplication logique à l'aide de la ressource Replication dans le cluster d'éditeur. Chaque ressource Replication est associée à une ressource de cluster de base de données correspondante. Un cluster de base de données peut être associé à plusieurs ressources de réplication logiques.

Pour configurer un emplacement de réplication dans votre cluster d'éditeur, appliquez le fichier manifeste suivant:

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

Remplacez les éléments suivants :

  • REPLICATION_NAME: nom de cette ressource Replication (par exemple, replication-1).
  • NAMESPACE: espace de noms Kubernetes de cette ressource Replication. Il doit correspondre à l'espace de noms du cluster de base de données.
  • DB_CLUSTER_NAME: nom de votre cluster de base de données, que vous avez attribué lors de sa création.
  • DECODER_PLUGIN: défini sur le plug-in de décodage, tel que pgoutput, que vous souhaitez utiliser pour la réplication logique. Pour en savoir plus sur les différents plug-ins de décodage, consultez la section Plug-ins de sortie.
  • DATABASE_NAME: défini sur le nom de la base de données dont vous souhaitez diffuser les modifications vers l'emplacement de réplication. Assurez-vous que la base de données est déjà créée dans le cluster de l'éditeur.
  • APPLICATION_NAME (facultatif): défini sur le nom de l'application qui se connectera à l'emplacement de réplication. Ce champ est obligatoire lorsque le mode de streaming est défini sur "synchrone".
  • REPLICATION_MODE (facultatif): défini sur false pour la réplication asynchrone. Si vous souhaitez activer la réplication synchrone, mais au détriment de la vitesse, définissez cette valeur sur true. Si ce nombre n'est pas défini explicitement, la valeur par défaut est false.
  • REPLICATION_SLOT_NAME: nom de l'emplacement de réplication qui sera créé et utilisé par l'abonné.
  • REPLICATION_USER (facultatif): nom de l'utilisateur qui se connecte à l'emplacement de réplication. Si vous définissez l'utilisateur de réplication, vous devez également définir le nom du secret, l'espace de noms et le mot de passe.
  • USER_PASSWORD_SECRET_NAME (facultatif): nom du secret Kubernetes de l'utilisateur de l'application. Obligatoire si l'utilisateur de l'application est défini.
  • USER_PASSWORD_SECRET_NAMESPACE (facultatif): espace de noms dans lequel se trouve le secret Kubernetes de l'utilisateur de l'application. Obligatoire si l'utilisateur de l'application est défini.
  • BASE64_ENCODED_PASSWORD (facultatif): mot de passe de l'utilisateur de l'application encodé en base64. Obligatoire si l'utilisateur de l'application est défini.

Accorder des autorisations à l'utilisateur de réplication

Pour accorder des autorisations de réplication et de publication à l'utilisateur de réplication dans le cluster de l'éditeur, procédez comme suit:

  1. Connectez-vous au pod principal du cluster de l'éditeur à l'aide de psql:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    Remplacez les éléments suivants :

    • IP_ADDRESS: adresse IP du pod principal du cluster de l'éditeur.
    • USERNAME: utilisateur postgres de la base de données.
    • DATABASE_NAME: base de données à laquelle l'abonné souhaite s'abonner.
  2. Accordez les autorisations:

    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;
    

Créer une publication et un abonnement

Créer une publication

Pour créer une publication dans le cluster des éditeurs, procédez comme suit:

  1. Connectez-vous au pod principal du cluster de l'éditeur à l'aide de psql:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    Remplacez les éléments suivants :

    • IP_ADDRESS: adresse IP du pod principal du cluster de l'éditeur.
    • USERNAME: utilisateur postgres de la base de données.
    • DATABASE_NAME: base de données à laquelle l'abonné souhaite s'abonner.
  2. Créez une publication en exécutant la commande suivante:

    CREATE PUBLICATION PUBLICATION_NAME;
    ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
    

    Remplacez les éléments suivants :

    • PUBLICATION_NAME: nom de la publication que l'abonné utilisera pour s'abonner.
    • TABLE_NAME: table à laquelle l'abonné souhaite s'abonner.

Créer un abonnement

Pour créer un abonnement dans le cluster d'abonnés, procédez comme suit:

  1. Connectez-vous au pod principal du cluster abonné à l'aide de psql:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    Remplacez les éléments suivants :

    • IP_ADDRESS: adresse IP du pod principal du cluster d'abonné.
    • USERNAME: utilisateur postgres de la base de données.
    • DATABASE_NAME: base de données à laquelle l'abonné souhaite s'abonner.
  2. Créez un abonnement en exécutant la commande suivante:

    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 ;
    

    Remplacez les éléments suivants :

    • SUBSCRIPTION_NAME: nom de l'abonnement.
    • IP_ADDRESS: adresse IP du pod principal du cluster de l'éditeur.

Toutes les modifications apportées à la table dans le cluster de l'éditeur sont répliquées dans la table du cluster de l'abonné.

Afficher l'état de l'emplacement de réplication

Pour afficher l'état des emplacements de réplication, exécutez la commande suivante:

kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml

Le champ status, ainsi que d'autres informations, sont inclus dans la réponse:

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 affiche l'adresse IP que vous utilisez pour vous connecter à la base de données. L'état TRUE dans la colonne READY indique que l'emplacement est prêt à diffuser. Lorsque l'application se connecte à l'emplacement de réplication, l'état de la colonne HEALTHY passe à TRUE.

Limites

  • Les mises à jour de la configuration de l'emplacement de réplication ne sont pas acceptées. Pour mettre à jour la configuration, supprimez l'emplacement de réplication, puis recréez-le avec la configuration mise à jour.

    Pour supprimer l'emplacement de réplication, exécutez la commande suivante : kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE

  • Vous ne pouvez configurer l'emplacement de réplication logique que dans la base de données de l'éditeur. Les configurations d'abonné ne sont pas acceptées.

  • Si le cluster de base de données référencé par l'objet de réplication est configuré pour la haute disponibilité, l'emplacement de réplication logique est recréée sur le standby promu après un basculement. Une fois l'emplacement de réplication recréé, la position du flux dans l'emplacement n'est plus disponible, et toutes les applications qui s'y abonnent doivent se reconnecter et le lire à nouveau.

Étape suivante