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 surtrue
. Si ce nombre n'est pas défini explicitement, la valeur par défaut estfalse
. - 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:
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.
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:
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.
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:
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.
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.