Postgres vs ClickHouse : concepts équivalents et différences
INSERT, UPDATE et DELETE. Bien que les mêmes résultats puissent s’appliquer à la réplication physique, elle offre davantage de flexibilité pour cibler des tables et des opérations spécifiques, ainsi que pour effectuer des transformations de données et prendre en charge différentes versions de Postgres.
À l’inverse, dans ClickHouse, les shards et les répliques sont deux concepts clés liés à la distribution des données et à la redondance. Les répliques ClickHouse peuvent être considérées comme analogues aux répliques Postgres, bien que la réplication soit à cohérence éventuelle, sans notion de primaire. Le sharding, contrairement à Postgres, est pris en charge nativement.
Un shard est une portion des données de votre table. Vous avez toujours au moins un shard. Le partitionnement des données sur plusieurs serveurs peut être utilisé pour répartir la charge si vous dépassez la capacité d’un seul serveur, tous les shards étant utilisés pour exécuter une requête en parallèle. Vous pouvez créer manuellement des shards pour une table sur différents serveurs et y insérer directement des données. Sinon, une table distribuée peut être utilisée avec une clé de sharding définissant vers quel shard les données sont acheminées. La clé de sharding peut être aléatoire ou provenir du résultat d’une fonction de hachage. Il est important de noter qu’un shard peut être constitué de plusieurs répliques.
Une réplique est une copie de vos données. ClickHouse a toujours au moins une copie de vos données, et le nombre minimum de répliques est donc de un. L’ajout d’une deuxième réplique de vos données apporte de la tolérance aux pannes et potentiellement une capacité de calcul supplémentaire pour traiter davantage de requêtes (Parallel Replicas peut également être utilisé pour répartir la capacité de calcul d’une seule requête, réduisant ainsi la latence). Les répliques sont obtenues avec le moteur de table ReplicatedMergeTree, qui permet à ClickHouse de maintenir synchronisées plusieurs copies des données sur différents serveurs. La réplication est physique : seules les parties compressées sont transférées entre les nœuds, pas les requêtes.
En résumé, une réplique est une copie des données qui fournit redondance et fiabilité (et potentiellement du traitement distribué), tandis qu’un shard est un sous-ensemble de données qui permet le traitement distribué et l’équilibrage de charge.
ClickHouse Cloud utilise une seule copie des données sauvegardée dans S3 avec plusieurs répliques de calcul. Les données sont accessibles à chaque nœud réplique, chacun disposant d’un cache Local SSD. Cela repose uniquement sur la réplication des métadonnées via ClickHouse Keeper.
Cohérence éventuelle
Implications pour les utilisateurs
Recommandations
Routage cohérent
ClickHouse Cloud
Contactez le support pour obtenir l’accès aux endpoints sticky.
ClickHouse OSS
session_id ou user_id. Les paramètres prefer_localhost_replica=0, load_balancing=in_order doivent être définis au niveau de la requête. Cela garantit que les répliques locales des shards sont privilégiées ; sinon, les répliques sont préférées dans l’ordre indiqué dans la configuration, à condition qu’elles aient le même nombre d’erreurs. En cas de nombre d’erreurs plus élevé, le basculement se fera par sélection aléatoire. load_balancing=nearest_hostname peut également être utilisé comme alternative pour cette sélection déterministe du shard.
Lors de la création d’une table Distributed, vous spécifiez un cluster. Cette définition du cluster, indiquée dans config.xml, liste les shards (et leurs répliques), ce qui permet aux utilisateurs de contrôler l’ordre dans lequel ils sont utilisés depuis chaque nœud. Vous pouvez ainsi garantir une sélection déterministe.
Cohérence séquentielle
- Lire/écrire sur le même nœud - Si vous utilisez le protocole natif, ou une session pour effectuer vos écritures/lectures via HTTP, vous devez alors être connecté à la même réplique : dans ce cas, vous lisez directement depuis le nœud sur lequel vous écrivez, votre lecture sera donc toujours cohérente.
- Synchroniser manuellement les répliques - Si vous écrivez sur une réplique et lisez depuis une autre, vous pouvez utiliser
SYSTEM SYNC REPLICA LIGHTWEIGHTavant la lecture. - Activer la cohérence séquentielle - via le paramètre de requête
select_sequential_consistency = 1. En OSS, le paramètreinsert_quorum = 'auto'doit également être spécifié.
Voir ici pour plus de détails sur l’activation de ces paramètres.
L’utilisation de la cohérence séquentielle imposera une charge plus importante à ClickHouse Keeper. Cela peut entraîner des inserts et des lectures plus lents. Avec SharedMergeTree, utilisé dans ClickHouse Cloud comme principal moteur de table, la cohérence séquentielle entraîne moins de surcharge et passe mieux à l’échelle. En OSS, vous devez utiliser cette approche avec prudence et mesurer la charge sur Keeper.
Prise en charge transactionnelle (ACID)
Compression
Query (Postgres)
Query (ClickHouse)
Response