Il est recommandé aux utilisateurs de ClickHouse Cloud d’utiliser ClickPipes pour répliquer PostgreSQL vers ClickHouse. Cela prend en charge nativement la capture des changements de données (CDC) haute performance pour PostgreSQL.
MaterializedPostgreSQL crée un snapshot de la base de données PostgreSQL et charge les tables requises. Les tables requises peuvent inclure n’importe quel sous-ensemble de tables issu de n’importe quel sous-ensemble de schémas de la base de données spécifiée. En plus du snapshot, le moteur de base de données récupère le LSN et, une fois le dump initial des tables effectué, il commence à extraire les mises à jour depuis le WAL. Une fois la base de données créée, les tables ajoutées par la suite à la base de données PostgreSQL ne sont pas automatiquement ajoutées à la réplication. Elles doivent être ajoutées manuellement avec la requête ATTACH TABLE db.table.
La réplication s’appuie sur le protocole de réplication logique de PostgreSQL, qui ne permet pas de répliquer le DDL, mais permet de savoir si des changements incompatibles avec la réplication se sont produits (modification du type de colonne, ajout/suppression de colonnes). Ces changements sont détectés et les tables concernées cessent alors de recevoir des mises à jour. Dans ce cas, vous devez utiliser les requêtes ATTACH/ DETACH PERMANENTLY pour recharger entièrement la table. Si le DDL ne casse pas la réplication (par exemple, en renommant une colonne), la table continuera à recevoir des mises à jour (l’insertion se fait par position).
Ce moteur de base de données est expérimental. Pour l’utiliser, définissez
allow_experimental_database_materialized_postgresql sur 1 dans vos fichiers de configuration ou à l’aide de la commande SET :Créer une base de données
host:port— endpoint du serveur PostgreSQL.database— nom de la base de données PostgreSQL.user— utilisateur PostgreSQL.password— mot de passe de l’utilisateur.
Exemple d’utilisation
Ajout dynamique de nouvelles tables à la réplication
MaterializedPostgreSQL créée, elle ne détecte pas automatiquement les nouvelles tables de la base de données PostgreSQL correspondante. Ces tables peuvent être ajoutées manuellement :
Retrait dynamique de tables de la réplication
Schéma PostgreSQL
- Un schéma pour un moteur de base de données
MaterializedPostgreSQL. Nécessite l’utilisation du paramètrematerialized_postgresql_schema. Les tables sont accessibles uniquement par leur nom :
- Un nombre quelconque de schémas avec un ensemble donné de tables pour un moteur de base de données
MaterializedPostgreSQL. Nécessite l’utilisation du paramètrematerialized_postgresql_tables_list. Chaque table est spécifiée avec son schéma. Les tables sont accessibles en utilisant à la fois le nom du schéma et celui de la table :
materialized_postgresql_tables_list doivent être indiquées avec leur nom de schéma.
Nécessite materialized_postgresql_tables_list_with_schema = 1.
Avertissement : dans ce cas, les points ne sont pas autorisés dans le nom de la table.
- Un nombre quelconque de schémas avec l’ensemble complet des tables pour un moteur de base de données
MaterializedPostgreSQL. Nécessite l’utilisation du paramètrematerialized_postgresql_schema_list.
Prérequis
-
Le paramètre wal_level doit être défini sur
logical, et le paramètremax_replication_slotsdoit avoir une valeur d’au moins2dans le fichier de configuration de PostgreSQL. - Chaque table répliquée doit avoir l’une des identités de réplica suivantes :
- clé primaire (par défaut)
- index
La réplication des valeurs TOAST n’est pas prise en charge. La valeur par défaut de ce type de données sera utilisée.
Paramètres
materialized_postgresql_tables_list
materialized_postgresql_schema
materialized_postgresql_schema_list
materialized_postgresql_max_block_size
- Entier positif.
65536.
materialized_postgresql_replication_slot
materialized_postgresql_snapshot.
materialized_postgresql_snapshot
materialized_postgresql_replication_slot.
materialized_postgresql_tables_list. Pour mettre à jour la liste des tables de ce paramètre, utilisez la requête ATTACH TABLE.
materialized_postgresql_use_unique_replication_consumer_identifier
0.
Si cette valeur est définie sur 1, elle permet de configurer plusieurs tables MaterializedPostgreSQL pointant vers la même table PostgreSQL.
Remarques
Basculement du slot de réplication logique
materialized_postgresql_replication_slot, et celui-ci devra être exporté avec l’option EXPORT SNAPSHOT. L’identifiant du snapshot devra être transmis via le paramètre materialized_postgresql_snapshot.
Notez que cette solution ne doit être utilisée qu’en cas de besoin réel. S’il n’y a pas de nécessité avérée ni de compréhension claire de la raison pour laquelle elle est requise, il est préférable de laisser le moteur de table créer et gérer son propre slot de réplication.
Exemple (de @bchrobot)
-
Configurez le slot de réplication dans PostgreSQL.
-
Attendez que le slot de réplication soit prêt, puis démarrez une transaction et exportez l’identifiant du snapshot de transaction :
-
Dans ClickHouse, créez la base de données :
-
Terminez la transaction PostgreSQL une fois la réplication vers la base de données ClickHouse confirmée. Vérifiez que la réplication continue après le basculement :
Autorisations requises
- CREATE PUBLICATION — privilège CREATE.
- CREATE_REPLICATION_SLOT — privilège de réplication.
- pg_drop_replication_slot — privilège de réplication ou superutilisateur.
-
DROP PUBLICATION — propriétaire de la publication (
usernamedans le moteur MaterializedPostgreSQL lui-même).
2 et 3, et donc de ne pas avoir besoin de ces autorisations. Utilisez les paramètres materialized_postgresql_replication_slot et materialized_postgresql_snapshot, mais avec une grande prudence.
Accès aux tables :
- pg_publication
- pg_replication_slots
- pg_publication_tables