Les rollbacks de transaction sont-ils répliqués dans ClickHouse ?
Puis-je conserver les données dans ClickHouse plus longtemps que dans mon Postgres source ?
Comment enrichir les données lorsqu’elles transitent de Postgres vers ClickHouse ?
Puis-je répliquer depuis plusieurs instances Postgres vers un ou plusieurs services ClickHouse ?
Comment la mise en veille affecte-t-elle mon ClickPipe Postgres CDC ?
Comment les colonnes TOAST sont-elles prises en charge dans ClickPipes for Postgres ?
Comment les colonnes générées sont-elles prises en charge dans ClickPipes for Postgres ?
Les tables doivent-elles avoir des clés primaires pour être incluses dans Postgres CDC ?
- Clé primaire : l’approche la plus simple consiste à définir une clé primaire sur la table. Cela fournit un identifiant unique pour chaque ligne, ce qui est essentiel pour suivre les mises à jour et les suppressions. Dans ce cas, vous pouvez définir REPLICA IDENTITY sur
DEFAULT(comportement par défaut). - Identité de réplication : si une table n’a pas de clé primaire, vous pouvez définir une identité de réplication. L’identité de réplication peut être définie sur
FULL, ce qui signifie que la ligne entière sera utilisée pour identifier les modifications. Vous pouvez également la configurer pour utiliser un index unique s’il en existe un sur la table, puis définir REPLICA IDENTITY surUSING INDEX index_name. Pour définir l’identité de réplication sur FULL, vous pouvez utiliser la commande SQL suivante :
REPLICA IDENTITY FULL permet également de répliquer les colonnes TOAST inchangées. Plus d’informations à ce sujet ici.
Notez que l’utilisation de REPLICA IDENTITY FULL peut avoir des conséquences sur les performances, ainsi qu’accélérer la croissance du WAL, en particulier pour les tables sans clé primaire et faisant l’objet de mises à jour ou de suppressions fréquentes, car cela nécessite de journaliser davantage de données pour chaque modification. En cas de doute ou si vous avez besoin d’aide pour configurer des clés primaires ou des identités de réplication pour vos tables, veuillez contacter notre équipe de support.
Il est important de noter que si aucune clé primaire ni aucune identité de réplication n’est définie, ClickPipes ne pourra pas répliquer les modifications de cette table, et vous risquez de rencontrer des erreurs pendant le processus de réplication. Il est donc recommandé de vérifier les schémas de vos tables et de vous assurer qu’ils respectent ces exigences avant de configurer votre ClickPipe.
Les tables partitionnées sont-elles prises en charge avec Postgres CDC ?
Puis-je connecter des bases de données Postgres qui n’ont pas d’adresse IP publique ou qui se trouvent sur des réseaux privés ?
Comment gérer les UPDATE et les DELETE ?
_peerdb_) dans ClickHouse. Le table engine ReplacingMergeTree effectue périodiquement une déduplication en arrière-plan en fonction de la clé de tri (colonnes ORDER BY), en ne conservant que la ligne dont la version _peerdb_ est la plus récente.
Les DELETE de Postgres sont propagés sous forme de nouvelles lignes marquées comme supprimées (à l’aide de la colonne _peerdb_is_deleted). Comme le processus de déduplication est Asynchronous, vous pouvez voir temporairement des doublons. Pour y remédier, vous devez gérer la déduplication au niveau de la query.
Notez également que, par défaut, Postgres n’envoie pas les valeurs des colonnes qui ne font pas partie de la primary key ou de l’identité de réplication lors des opérations DELETE. Si vous souhaitez capturer l’intégralité des données de la ligne lors des DELETE, vous pouvez définir REPLICA IDENTITY sur FULL.
Pour plus de détails, consultez :
- Bonnes pratiques du table engine ReplacingMergeTree
- Article de blog sur les internals du CDC de Postgres vers ClickHouse
Puis-je mettre à jour les colonnes de clé primaire dans PostgreSQL ?
Les changements de schéma sont-ils pris en charge ?
Quels sont les coûts de ClickPipes for Postgres CDC ?
La taille de mon slot de réplication augmente ou ne diminue pas ; quel peut être le problème ?
-
Pics soudains d’activité de la base de données
- D’importantes mises à jour par lot, des insertions en masse ou des modifications de schéma significatives peuvent rapidement générer un grand volume de données WAL.
- Le slot de réplication conserve ces enregistrements WAL jusqu’à ce qu’ils soient consommés, ce qui provoque une hausse temporaire de sa taille.
-
Transactions longues
- Une transaction ouverte oblige Postgres à conserver tous les segments WAL générés depuis le début de la transaction, ce qui peut augmenter considérablement la taille du slot.
- Définissez
statement_timeoutetidle_in_transaction_session_timeoutsur des valeurs raisonnables afin d’éviter que des transactions restent ouvertes indéfiniment :Utilisez cette query pour identifier les transactions anormalement longues.
-
Opérations de maintenance ou utilitaires (par ex.,
pg_repack)- Des outils comme
pg_repackpeuvent réécrire des tables entières, générant de grandes quantités de données WAL en peu de temps. - Planifiez ces opérations pendant les périodes de moindre trafic ou surveillez de près votre consommation de WAL pendant leur exécution.
- Des outils comme
-
VACUUM et VACUUM ANALYZE
- Bien qu’indispensables à la bonne santé de la base de données, ces opérations peuvent générer du trafic WAL supplémentaire, en particulier si elles analysent de grandes tables.
- Envisagez d’ajuster les paramètres d’autovacuum ou de planifier des opérations VACUUM manuelles pendant les heures creuses.
-
Le consommateur de réplication ne lit pas activement le slot
- Si votre pipeline CDC (par exemple, ClickPipes) ou un autre consommateur de réplication s’arrête, se met en pause ou plante, les données WAL s’accumuleront dans le slot.
- Assurez-vous que votre pipeline fonctionne en continu et vérifiez les logs pour détecter d’éventuelles erreurs de connectivité ou d’authentication.
Comment les types de données de Postgres sont-ils mappés dans ClickHouse ?
Puis-je définir mon propre mapping de types de données lors de la réplication des données de Postgres vers ClickHouse ?
Comment les colonnes json et jsonb sont-elles répliquées depuis Postgres ?
json et jsonb sont répliquées dans ClickHouse en tant que type String, en raison d’incompatibilités avec le type JSON natif. Par exemple :
- PostgreSQL autorise toute valeur JSON valide au niveau supérieur (chaînes, nombres, tableaux), tandis que le type JSON de ClickHouse ne prend en charge que les objets.
- Les clés contenant des points (par ex. “app.kubernetes.io/name”) sont également interprétées comme des chemins imbriqués par le type JSON de ClickHouse, ce qui peut modifier la structure des données.
Que se passe-t-il pour les insertions lorsqu’un mirror est en pause ?
- Pour sync, si l’opération est annulée en cours d’exécution, le confirmed_flush_lsn dans Postgres n’est pas avancé. Le sync suivant repartira donc de la même position que celui qui a été interrompu, ce qui garantit la cohérence des données.
- Pour normalize, l’ordre d’insertion de ReplacingMergeTree gère la déduplication.
La création d’un ClickPipe peut-elle être automatisée ou effectuée via l’API ou la CLI ?
Comment accélérer mon chargement initial ?
snapshot number of tables in parallel ou spécifier une colonne de partitionnement indexée personnalisée pour les grandes tables.
Comment définir le périmètre de mes publications lors de la configuration de la réplication ?
REPLICA IDENTITY FULL. Si vous avez des tables sans clé primaire, créer une publication pour toutes les tables entraînera l’échec des opérations DELETE et UPDATE sur ces tables.
Pour identifier les tables sans clé primaire dans votre base de données, vous pouvez utiliser cette requête :
-
Exclure de ClickPipes les tables sans clé primaire :
Créez la publication en n’incluant que les tables ayant une clé primaire :
-
Inclure dans ClickPipes les tables sans clé primaire :
Si vous souhaitez inclure des tables sans clé primaire, vous devez modifier leur identité de réplication en
FULL. Cela garantit le bon fonctionnement des opérations UPDATE et DELETE :
Paramètres recommandés pour max_slot_wal_keep_size
- Au minimum : définissez
max_slot_wal_keep_sizede manière à conserver au moins deux jours de données WAL. - Pour les grandes bases de données (volume élevé de transactions) : conservez au moins 2 à 3 fois le pic quotidien de génération de WAL.
- Pour les environnements soumis à des contraintes de stockage : ajustez ce paramètre avec prudence pour éviter de saturer le disque tout en garantissant la stabilité de la réplication.
Comment calculer la valeur appropriée
Pour PostgreSQL 10 et versions ultérieures
Pour PostgreSQL 9.6 et les versions antérieures :
- Exécutez la requête ci-dessus à différents moments de la journée, en particulier pendant les périodes de forte activité transactionnelle.
- Calculez la quantité de WAL générée sur une période de 24 heures.
- Multipliez cette valeur par 2 ou 3 afin de garantir une rétention suffisante.
- Définissez
max_slot_wal_keep_sizesur la valeur obtenue, en Mo ou en Go.
Exemple
Je vois une erreur ReceiveMessage EOF dans les logs. Qu’est-ce que cela signifie ?
ReceiveMessage est une fonction du protocole de décodage logique de Postgres qui lit les messages du flux de réplication. Une erreur EOF (End of File) indique que la connexion au serveur Postgres a été interrompue de manière inattendue lors de la lecture du flux de réplication.
Il s’agit d’une erreur récupérable, sans gravité. ClickPipes tentera automatiquement de se reconnecter et de reprendre le processus de réplication.
Cela peut se produire pour plusieurs raisons :
- Problèmes réseau : Des perturbations réseau temporaires peuvent entraîner une interruption de la connexion.
- Redémarrage du serveur Postgres : Si le serveur Postgres redémarre ou plante, la connexion sera perdue.
Mon slot de réplication est invalidé. Que dois-je faire ?
max_slot_wal_keep_size trop faible sur votre base de données PostgreSQL (par exemple, quelques gigaoctets). Nous vous recommandons d’augmenter cette valeur. Consultez cette section pour savoir comment ajuster max_slot_wal_keep_size. Idéalement, cette valeur devrait être définie à au moins 200GB afin d’éviter l’invalidation du slot de réplication.
Dans de rares cas, nous avons constaté que ce problème se produisait même lorsque max_slot_wal_keep_size n’était pas configuré. Cela peut être dû à un bug rare et complexe dans PostgreSQL, bien que la cause reste incertaine.
Je rencontre des erreurs de mémoire insuffisante (OOM) sur ClickHouse pendant l’ingestion de données par mon ClickPipe. Pouvez-vous m’aider ?
-
Une technique d’optimisation courante pour les
JOINs’applique lorsque vous avez unLEFT JOINdont la table de droite est très volumineuse. Dans ce cas, réécrivez la requête pour utiliser unRIGHT JOINet déplacer la table la plus volumineuse du côté gauche. Cela permet au planificateur de requêtes d’utiliser la mémoire plus efficacement. -
Une autre optimisation pour les
JOINconsiste à filtrer explicitement les tables au moyen desubqueriesou deCTEs, puis à effectuer leJOINsur ces sous-requêtes. Cela donne au planificateur des indications pour filtrer efficacement les lignes et exécuter leJOIN.
Je vois une erreur invalid snapshot identifier pendant le chargement initial. Que dois-je faire ?
invalid snapshot identifier survient lorsqu’il y a une perte de connexion entre ClickPipes et votre base de données Postgres. Cela peut être dû à des timeouts de passerelle, à des redémarrages de la base de données ou à d’autres problèmes temporaires.
Nous vous recommandons de ne pas effectuer d’opérations perturbatrices, comme des mises à niveau ou des redémarrages, sur votre base de données Postgres pendant le chargement initial, et de vous assurer que la connexion réseau à votre base de données est stable.
Pour résoudre ce problème, vous pouvez déclencher une resynchronisation depuis l’interface utilisateur de ClickPipes. Cela relancera le processus de chargement initial depuis le début.
Que se passe-t-il si je supprime une publication dans Postgres ?
- Créez une nouvelle publication avec le même nom et les tables requises dans Postgres
- Cliquez sur le bouton ‘Resync tables’ dans l’onglet Settings de votre ClickPipe
Que faire si je vois des erreurs Unexpected Datatype ou Cannot parse type XX ... ?
Je vois des erreurs comme invalid memory alloc request size <XXX> lors de la réplication/de la création du slot
Je dois conserver un historique complet dans ClickHouse, même lorsque les données sont supprimées de la base de données source Postgres. Puis-je ignorer complètement les opérations DELETE et TRUNCATE de Postgres dans ClickPipes ?
Pourquoi ne puis-je pas répliquer ma table si son nom contient un point ?
Le chargement initial est terminé, mais il n’y a pas de données / il manque des données dans ClickHouse. Quel peut être le problème ?
- Que l’utilisateur dispose des permissions nécessaires pour lire les tables source.
- Qu’il n’existe pas de politiques de lignes côté ClickHouse susceptibles de filtrer certaines lignes.
ClickPipe peut-il créer un slot de réplication avec le basculement activé ?
Advanced Settings lors de la création du ClickPipe. Notez que votre version de Postgres doit être 17 ou supérieure pour utiliser cette fonctionnalité.
Si la source est configurée en conséquence, le slot est conservé après un basculement vers une réplique de lecture Postgres, ce qui garantit une réplication continue des données. Pour en savoir plus, consultez ce lien.
J’observe des erreurs comme Internal error encountered during logical decoding of aborted sub-transaction
ReorderBufferPreserveLastSpilledSnapshot, cela indique que le décodage logique ne parvient pas à lire le snapshot écrit sur disque. Il peut être utile d’essayer d’augmenter la valeur de logical_decoding_work_mem.
J’obtiens des erreurs telles que error converting new tuple to map ou error parsing logical message pendant la réplication CDC
Puis-je inclure des colonnes que j’avais initialement exclues de la réplication ?
Je constate que mon ClickPipe est passé à l’état Snapshot, mais aucune donnée n’arrive : quel pourrait être le problème ?
La prise d’instantanés en parallèle prend du temps pour récupérer les partitions
La création du slot de réplication est bloquée par une transaction
CREATE_REPLICATION_SLOT bloquée dans l’état Lock. Cela peut être dû à une autre transaction qui maintient des verrous sur des objets que Postgres utilise pour créer des slots de réplication.
Pour voir les requêtes bloquantes, vous pouvez exécuter la requête ci-dessous sur votre source Postgres :