暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

高性价比OLAP列式数据库—Clickhouse(副本机制)

迷三张 2025-02-18
368

    ClickHouse 的副本机制(Replication)是其分布式架构中的一个重要特性,用于实现数据的高可用性和容错能力通过副本机制,ClickHouse 可以在多个节点上存储相同的数据副本即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据。


副本机制核心概念

  •  分片(Shard)

    一个分片是一个逻辑上的数据分区,包含整个数据集的一部分。

    每个分片可以分布在不同的物理节点上。

    数据通常按照某种规则(如哈希值或范围)分配到不同的分片中。

  • 副本(Replica)

    副本是分片的一个拷贝,存储在不同的节点上。

    每个分片可以有多个副本,副本之间通过同步机制保持数据一致性。

    副本的主要作用是提高数据的可靠性和查询性能。

  • ZooKeeper

    ClickHouse 使用 Apache ZooKeeper 来管理副本之间的元数据和同步状态。

    ZooKeeper 是副本机制的核心组件,负责协调副本之间的数据同步、写入顺序和故障检测。


副本机制工作原理


  • 数据写入流程

     当客户端向 ClickHouse 写入数据时,数据首先被写入到主副本(Leader Replica)。
    主副本将写入操作记录到 ZooKeeper 中,确保其他副本可以看到该操作。
    其他副本从 ZooKeeper 获取写入日志,并异步地将数据应用到本地存储。
    一旦所有副本都完成了数据同步,写入操作才算完成。
  • 数据读取流程

    查询可以发送到任意副本。

    如果某个副本不可用,查询会自动路由到其他可用的副本。
    ClickHouse 支持负载均衡,可以在多个副本之间分配查询请求,从而提高查询性能
  • 故障恢复
    如果某个副本发生故障(如节点宕机),ZooKeeper 会检测到并标记该副本为不可用。
    当故障节点恢复后,它会从其他副本同步丢失的数据,重新加入集群

副本机制流程

注意:ZooKeeper 是核心协调器,负责同步主副本和从副本之间的数据。


配置步骤


            要启用 ClickHouse 的副本机制,需要在表引擎中使用支持副本的引擎(如 ReplicatedMergeTree
),并在配置文件中设置 ZooKeeper 的相关信息。

  • 创建表

    CREATE TABLE test_replicated 
    (
        id UInt64,
        name String,
        timestamp DateTime
    )
    ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/my_table''{replica}')
    PARTITION BY toYYYYMM(timestamp)
    ORDER BY id;
    1. /clickhouse/tables/{shard}/my_table:ZooKeeper 中的路径,用于存储该表的元数据。

    2. {shard} 和 {replica}:占位符,分别表示分片 ID 和副本 ID,ClickHouse 会根据配置文件自动替换这些值。

    3. 副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表。

    • 配置 ZooKeeper

           在 ClickHouse 的配置文件(通常是 config.xml
       或 metrika.xml
      )中,添加 ZooKeeper 的配置:

          <yandex>
              <zookeeper>
                  <node index="1">
                      <host>zookeeper1</host>
                      <port>2181</port>
                  </node>
                  <node index="2">
                      <host>zookeeper2</host>
                      <port>2181</port>
                  </node>
                  <node index="3">
                      <host>zookeeper3</host>
                      <port>2181</port>
                  </node>
              </zookeeper>
          </yandex> 
          • 配置分片和副本

              在 metrika.xml
           文件中定义分片和副本的拓扑结构:

            <yandex>
                <remote_servers>
                    <my_cluster>
                        <shard>
                            <internal_replication>true</internal_replication>
                            <replica>
                                <host>node1</host>
                                <port>9000</port>
                            </replica>
                            <replica> 
                                <host>node2</host>
                                <port>9000</port>
                            </replica>
                        </shard>
                        <shard>
                            <internal_replication>true</internal_replication>
                            <replica>
                                <host>node3</host>
                                <port>9000</port>
                            </replica>
                            <replica>
                                <host>node4</host>
                                <port>9000</port>
                            </replica>
                        </shard>
                    </my_cluster>
                </remote_servers>
            </yandex>
            到此我们执行语句去查询node1,node2,node3中的test_replicated表中的数据,如果三个节点都可查到则说明副本正确。

            监控副本状态


            • 查看副本信息

            可以通过 system.replicas
             表查看副本的状态:

              SELECT database, table, is_leader, is_readonly, last_queue_update 
              FROM system.replicas 
              WHERE is_session_expired = 0;
              • 查看同步延迟

              可以通过 system.metrics
               表查看同步延迟:

                SELECT metric, value 
                FROM system.metrics 
                WHERE metric = 'ReplicatedFetch';
                • 查看合并操作

                可以通过 system.merges
                 表查看合并操作的状态:

                  SELECT metric, value 
                  FROM system.metrics 
                  WHERE metric = 'ReplicatedFetch';


                  常见问题及解决方法


                  • 数据不同步

                  原因 
                      ZooKeeper 出现问题(如网络中断、节点故障)。
                      某些副本长时间离线,导致数据丢失。
                  解决方法 
                      检查 ZooKeeper 的状态,确保其正常运行。
                      使用 SYSTEM SYNC REPLICA
                   命令手动触发数据同步。
                  • 查询性能下降

                  原因 
                      副本之间的网络延迟较高。
                      某些副本负载过高,导致查询响应变慢。
                  解决方法 
                      优化网络环境,减少节点之间的延迟。
                      在查询时指定优先使用的副本(如通过 load_balancing
                   参数)。
                  • 磁盘空间不足

                  原因 

                        副本数量过多,导致磁盘占用增加。
                    解决方法 
                        调整副本数量,避免过度冗余。
                        定期清理旧数据(如使用 TTL 功能)。


                    https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication

                    clickhouse-数据副本机制参考官方地址

                    文章转载自迷三张,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论