副本(Replica)

副本是指在分布式系统中,将相同的数据存储在不同物理节点上的技术实现。其核心思想是通过数据冗余来提升系统的可靠性。

核心优势

  1. 高可用性保障:当某个节点发生硬件故障、网络分区或软件崩溃时,其他副本节点可以立即接管服务
  2. 负载均衡能力:读请求可以智能路由到不同的副本节点
  3. 数据安全防护:防范单点数据丢失风险

技术实现

在 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 replicaON CLUSTER 未执行到补 CREATE … ON CLUSTER
ZooKeeper session expiredZK/Keeper 抖动排查网络/提高超时
Too many parts小分片过多提大批量、调合并阈值
Not enough quorums to writeinsert_quorum 要求过高下调 insert_quorum
Readonly replica磁盘满/只读清理磁盘/解除只读