副本(Replica)
副本是指在分布式系统中,将相同的数据存储在不同物理节点上的技术实现。其核心思想是通过数据冗余来提升系统的可靠性。
核心优势
- 高可用性保障:当某个节点发生硬件故障、网络分区或软件崩溃时,其他副本节点可以立即接管服务
- 负载均衡能力:读请求可以智能路由到不同的副本节点
- 数据安全防护:防范单点数据丢失风险
技术实现
在 ClickHouse 中,副本机制通过以下组件协作实现:
- ReplicatedMergeTree引擎:基础表引擎,内置副本同步逻辑
- ZooKeeper/Keeper协调服务:存储副本元数据和同步状态
配置示例
<!-- config.xml -->
<remote_servers>
<cluster_3shards_3replicas>
<shard>
<replica>
<host>ch01</host>
<port>9000</port>
</replica>
</shard>
</cluster_3shards_3replicas>
</remote_servers>
创建复制表:
CREATE TABLE metrics (
timestamp DateTime,
value Float64
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/metrics',
'{replica}'
)
ORDER BY timestamp;
Distributed 表
Distributed 表是一种特殊的表类型,它不直接存储数据,而是将查询转发到多个分片或副本表中。
Distributed(cluster_name, database, table [, sharding_key])
分片、副本与 Distributed 表的组合
- 分片:通过分片,集群可以水平扩展
- 副本:通过副本,集群能够实现高可用性
- 查询策略:查询通常会通过 Distributed 表执行,ClickHouse 会自动选择一个副本来读取数据
配置文件
<yandex>
<remote_servers>
<perftest_3shards_1replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>h121.wzk.icu</host>
<port>9000</port>
<user>default</user>
<password>clickhouse@wzk.icu</password>
</replica>
</shard>
</perftest_3shards_1replicas>
</remote_servers>
<zookeeper-servers>
<node index="1">
<host>h121.wzk.icu</host>
<port>2181</port>
</node>
</zookeeper-servers>
<macros>
<shard>01</shard>
<replica>h121.wzk.icu</replica>
</macros>
</yandex>
案例演示
创建本地表
CREATE TABLE test_tiny_log(
id UInt16,
name String
) ENGINE = TinyLog;
创建分布式表
CREATE TABLE dis_table(
id UInt16,
name String
) ENGINE = Distributed(perftest_3shards_1replicas, default, test_tiny_log, id);
插入数据
INSERT INTO dis_table SELECT * FROM test_tiny_log;
查询数据
select count() from dis_table;
错误速查
| 症状/报错 | 常见根因 | 快速修复 |
|---|---|---|
| Table doesn’t exist on replica | ON CLUSTER 未执行到 | 补 CREATE … ON CLUSTER |
| ZooKeeper session expired | ZK/Keeper 抖动 | 排查网络/提高超时 |
| Too many parts | 小分片过多 | 提大批量、调合并阈值 |
| Not enough quorums to write | insert_quorum 要求过高 | 下调 insert_quorum |
| Readonly replica | 磁盘满/只读 | 清理磁盘/解除只读 |