美文网首页
ClickHouse Replication

ClickHouse Replication

作者: 白奕新 | 来源:发表于2019-09-29 00:35 被阅读0次

0、一个重要参数:internal_replication

internal_replication:是否只写入所有replica中的一台。

  • true:代表了只写入shard内的一台,与ZooKeeper配合进行复制
  • false:代表了写入shard内所有的replica,与分布式表配合进行复制

1、依赖ZooKeeper进行复制

SQL
CREATE TABLE table_name
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')
PARTITION BY EventDate
ORDER BY (CounterID, EventDate, intHash32(UserID)
SETTINGS index_granularity = 8192;
item

(1)/clickhouse/tables/{layer}-{shard}/table_name:代表的是这张表在zk上的路径,如果要配置复制则需要配置相同的路径。即配置在相同shard里面的不同replica的机器需要配置相同的路径,不同shard的路径不同。
(2){replica}:分片的名称,可以理解是机器名,即需要每台机器都不同
(3)集群的配置,{layer}{shard}{replica}配置在配置文件的中

<?xml version="1.0"?>
<yandex>
    <remote_servers>
        <common>
            <shard>
                <weight>1</weight>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>CH-IP1</host>
                    <port>53090</port>
                </replica>
                <replica>
                    <host>CH-IP2</host>
                    <port>53090</port>
                </replica>
            </shard>
            <shard>
                <weight>1</weight>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>CH-IP3</host>
                    <port>53090</port>
                </replica>
                <replica>
                    <host>CH-IP4</host>
                    <port>53090</port>
                </replica>
            </shard>
        </common>
    </remote_servers>


    <zookeeper>
        <node index="1">
            <host>IP1</host>
            <port>50000</port>
        </node>
        <node index="2">
            <host>IP2</host>
            <port>50000</port>
        </node>
        <node index="3">
            <host>IP3</host>
            <port>50000</port>
        </node>
    </zookeeper>

    <macros replace="replace">
        <shard>p1</shard>
        <replica>CH-IP1</replica>
    </macros>
</yandex>

(4)ZooKeeper version:3.4.5 or later
(5)internal_replication配置为true
(6)使用ZooKeeper以及复制不会影响SELECT的性能
(7)数据会被发送到写入的那台服务器,再异步同步到其他Replica上。如果replica在当时不可用,会等到可用的时候再写入。

2、写分布式表进行复制

区别于使用ZooKeeper进行复制,写分布式表进行复制类似于ClickHouse帮你进行多张复制表的多写
(1)local表只需要配置为MergeTree即可,不需要配置为复制表
(2)配置<internal_replication>false</internal_replication>
(3)写分布式表

3、两种复制方式的比较

image.png

使用写分布式表的缺点:
(1)使用写分布式表进行复制,则可能出现多写一边成功一边失败的情况,数据的一致性不可控
(2)在一台服务器宕机一阵子以后,再恢复过来则这个时间段里面的数据不能自动恢复从另外的replica恢复过来。

4、其他

  • 在删表以后,ch会把zk上最后那个znode删掉。即我们的zk path是“/clickhouse/tables/xxx/yyy/ddd”,则会把ddd节点删掉,保留/clickhouse/tables/xxx/yyy
  • 在同个shard的replica1上删除replicated表,在replica2上的表不会被删除。
  • 在replica1上删除/增加column,在replica2上的表会随着变动。
  • 在replica1上修改sorting key,replica2上的表也会变动。
  • 一次Batch写入的过程和Zookeeper交互的次数不下10次。
  • 节点commit临时part以后,生成同步日志到zk超时会怎么办?CH依旧会commit,但是会把这个part放入检查队列中,检查是否可以注册到zk上。没有实在不行再移除这个part。
  • 新写入的Data Part只有同步到全部副本节点后才可以参与merge。
  • 每个节点上都有清理线程,清理zk上过期数据。
  • 数据的merge是由主节点(zk上leader_election对应的replica)来决定的,发布merge策略到zk上,副节点再根据这个merge策略进行merge。

相关文章

网友评论

      本文标题:ClickHouse Replication

      本文链接:https://www.haomeiwen.com/subject/nxuxpctx.html