Postgres 与 ClickHouse:对应概念与差异
INSERT、UPDATE 和 DELETE 操作流式传输变更。虽然物理复制在某些情况下也能达到类似效果,但逻辑复制在针对特定表和操作、进行数据转换以及支持不同 Postgres 版本方面提供了更高的灵活性。
相比之下,ClickHouse 的分片和副本是与数据分布和冗余相关的两个关键概念。ClickHouse 副本可以类比为 Postgres 副本,不过其复制是最终一致的,并且没有主节点这一概念。与 Postgres 不同,ClickHouse 原生支持分片。
分片是表数据的一部分。你始终至少有一个分片。如果单台服务器的容量不足,可以将数据分片到多台服务器上以分摊负载,并在执行查询时让所有分片并行工作。你可以在不同服务器上手动为某个表创建分片,并将数据直接插入其中。或者,也可以使用分布式表,并通过分片键定义数据应路由到哪个分片。分片键可以是随机的,也可以是某个哈希函数的输出。重要的是,一个分片可以包含多个副本。
副本是数据的一个拷贝。ClickHouse 始终至少保留一份数据副本,因此副本的最小数量为 1。为数据增加第二个副本可以提供容错能力,并可能增加用于处理更多查询的计算资源 (还可以使用 并行副本 将单个查询的计算资源分布到多个副本上,从而降低延迟) 。副本通过 ReplicatedMergeTree 表引擎 实现,它使 ClickHouse 能够在不同服务器之间保持多份数据副本同步。复制是物理层面的:节点之间传输的只有压缩后的 parts,而不是查询。
总之,副本是数据的拷贝,用于提供冗余和可靠性 (以及潜在的分布式处理能力) ;而分片则是数据的一个子集,用于实现分布式处理和负载均衡。
ClickHouse Cloud 使用存储在 S3 中的单份数据,并配备多个计算副本。每个副本节点都可以访问这些数据,并且各自都拥有本地 SSD 缓存。这仅依赖通过 ClickHouse Keeper 进行的元数据复制。
最终一致性
对用户的影响
建议
一致性路由
ClickHouse Cloud
联系支持团队以获取粘性端点的访问权限。
ClickHouse OSS
session_id 或 user_id。应在查询中设置 prefer_localhost_replica=0 和 load_balancing=in_order。这样可以确保优先选择各分片的本地副本;否则,在错误数相同的情况下,会优先按照配置中列出的顺序选择副本——如果错误数更高,则会随机选择并执行故障转移。也可以使用 load_balancing=nearest_hostname 作为这种确定性分片选择的替代方案。
创建分布式表时,你需要指定一个 cluster。这个在 config.xml 中定义的 cluster 会列出各个分片 (及其副本) ,从而让用户可以控制每个节点使用它们的顺序。利用这一点,你可以确保选择具有确定性。
顺序一致性
- 在同一节点上读/写 - 如果你使用 native protocol,或者使用 session 通过 HTTP 执行写入/读取,那么你应当连接到同一个副本:在这种情况下,你直接从写入所在的节点读取,因此读取结果始终是一致的。
- 手动同步副本 - 如果你写入一个副本,却从另一个副本读取,可以在读取前执行
SYSTEM SYNC REPLICA LIGHTWEIGHT。 - 启用顺序一致性 - 通过查询设置
select_sequential_consistency = 1。在 OSS 中,还必须指定设置insert_quorum = 'auto'。
有关如何启用这些设置的更多详细信息,请参见此处。
使用顺序一致性会给 ClickHouse Keeper 带来更高负载。结果可能是 插入和读取速度变慢。作为 ClickHouse Cloud 中主要 table engine 的 SharedMergeTree,顺序一致性带来的额外开销更低,扩展性也更好。在 OSS 中,你应谨慎使用这种方式,并衡量 Keeper 负载。
事务 (ACID) 支持
压缩
Query (Postgres)
Query (ClickHouse)
Response
数据类型映射
| Postgres 数据类型 | ClickHouse 类型 |
|---|---|
DATE | Date |
TIMESTAMP | DateTime |
REAL | Float32 |
DOUBLE | Float64 |
DECIMAL, NUMERIC | Decimal |
SMALLINT | Int16 |
INTEGER | Int32 |
BIGINT | Int64 |
SERIAL | UInt32 |
BIGSERIAL | UInt64 |
TEXT, CHAR, BPCHAR | String |
INTEGER | Nullable(Int32) |
ARRAY | Array |
FLOAT4 | Float32 |
BOOLEAN | Bool |
VARCHAR | String |
BIT | String |
BIT VARYING | String |
BYTEA | String |
NUMERIC | Decimal |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
INET | IPv4, IPv6 |
MACADDR | String |
CIDR | String |
HSTORE | Map(K, V), Map(K,Variant) |
UUID | UUID |
ARRAY<T> | ARRAY(T) |
JSON | String, Variant, Nested, Tuple |
JSONB | String |