Il s’agit de la Partie 1 d’un guide sur la migration de PostgreSQL vers ClickHouse. À l’aide d’un exemple concret, ce guide montre comment mener efficacement cette migration à l’aide d’une approche de réplication en temps réel (CDC). Bon nombre des concepts abordés s’appliquent également aux transferts manuels de données en masse de PostgreSQL vers ClickHouse.
Jeu de données
post, vote, user, comment et badge de Stack Overflow de 2008 à avril 2024. Le schéma PostgreSQL de ces données est présenté ci-dessous :
Les commandes DDL permettant de créer les tables dans PostgreSQL sont disponibles ici.
Ce schéma, sans être nécessairement le plus optimal, exploite plusieurs fonctionnalités populaires de PostgreSQL, notamment les clés primaires, les clés étrangères, le partitionnement et les index.
Nous migrerons chacun de ces concepts vers leurs équivalents dans ClickHouse.
Pour les utilisateurs qui souhaitent charger ce jeu de données dans une instance PostgreSQL afin de tester les étapes de migration, nous fournissons les données au format pg_dump en téléchargement avec le DDL, et les commandes de chargement correspondantes sont indiquées ci-dessous :
Bien que les résultats de notre exemple s’appuient sur le jeu de données complet pour illustrer les différences de performances entre Postgres et ClickHouse, toutes les étapes décrites ci-dessous fonctionnent exactement de la même manière avec le sous-ensemble plus restreint. Les utilisateurs qui souhaitent charger le jeu de données complet dans Postgres peuvent consulter ce lien. En raison des contraintes de clé étrangère imposées par le schéma ci-dessus, le jeu de données complet pour PostgreSQL ne contient que les lignes respectant l’intégrité référentielle. Une version Parquet, sans ces contraintes, peut facilement être chargée directement dans ClickHouse si nécessaire.
Migration des données
Réplication en temps réel (CDC)
users est créée dans ClickHouse à l’aide de ClickPipes.
Chargement en masse manuel avec des mises à jour périodiques
- Fonctions de table - Utiliser la fonction de table Postgres dans ClickHouse pour
SELECTles données depuis Postgres et lesINSERTdans une table ClickHouse. Cette approche convient pour des chargements en masse portant sur des jeux de données allant jusqu’à plusieurs centaines de Go. - Exportations - Exporter les données vers des formats intermédiaires comme CSV ou un fichier de script SQL. Ces fichiers peuvent ensuite être chargés dans ClickHouse soit depuis le client via la clause
INSERT FROM INFILE, soit en utilisant le stockage d’objets et les fonctions associées, par ex. s3, gcs.
DESCRIBE avec la fonction de table Postgres. La commande suivante décrit la table posts dans PostgreSQL ; adaptez-la à votre environnement :
Query
Query
INSERT INTO SELECT, en lisant les données depuis PostgresSQL et en les insérant dans ClickHouse :
Query
WHERE peut être appliquée au SELECT. Cette approche peut également être utilisée pour prendre en charge les mises à jour s’il est garanti qu’elles modifient toujours la même colonne. La prise en charge des suppressions nécessitera toutefois un rechargement complet, ce qui peut être difficile à réaliser à mesure que la table s’agrandit.
Nous illustrons un chargement initial et un chargement incrémentiel à l’aide de CreationDate (en supposant que cette valeur est mise à jour lorsque des lignes sont mises à jour)..
ClickHouse appliquera au serveur PostgreSQL les clausesWHEREsimples telles que=,!=,>,>=,<,<=et IN. Les chargements incrémentiels peuvent ainsi être plus efficaces si un index existe sur les colonnes utilisées pour identifier le jeu de modifications.
Une méthode possible pour détecter les opérations UPDATE lors de l’utilisation de la réplication des requêtes consiste à utiliser la colonne systèmeCliquez ici pour la partie 2XMIN(identifiants de transaction) comme watermark - une modification de cette colonne indique qu’un changement a eu lieu et peut donc être répercutée sur la table de destination. Les utilisateurs qui adoptent cette approche doivent savoir que les valeursXMINpeuvent reboucler et que les comparaisons nécessitent un parcours complet de la table, ce qui complique le suivi des modifications.