概述
Clickhouse支持cluster,支持shard及replication。这里介绍replication。
replication只适用于MergeTree引擎类型table,作用于单个表。而不是整个server。一台server上面可以同时存在replicated表和非replicated表。
基本配置
1.在多台节点上安装clickhouse-server
2.分别在每台server上面配置zookeeper,默认配置文件位置/etc/clickhouse-server/config.xml,示例如下:
<zookeeper>
<node>
<host>10.190.60.230</host>
<port>2181</port>
</node>
<node>
<host>10.190.60.228</host>
<port>2181</port>
</node>
<node>
<host>10.190.60.231</host>
<port>2181</port>
</node>
</zookeeper>
3.在配置文件中配置宏(macro),这里的参数在建表的时候会被引用到。
<macros>
<shard>01</shard>
<replica>02</replica>
</macros>
shard是分片标识,replication模式采用一个分片,不同server分片相同
replica是副本标识,不同副本该值不能相同,可以配置为本机的hostname
4.分别在不同的server上面执行建表语句
CREATE TABLE default.flow_provider_replicated
(
deviceType String,
providerCode String,
thirdCategoryId UInt32,
brandId UInt32,
divisionId String,
browserUniqId String,
pv UInt64,
date Date,
ver UInt32
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/flow', '{replica}', date, (providerCode, date, brandId, thirdCategoryId, divisionId, deviceType, browserUniqId), 8192, ver)
这里有几点说明:
-其中{shard}和{replica}的值会被宏中所配置的值代替
-table engins必须使用MergeTree族,并且加上Replicated前缀,如:ReplicatedReplacingMergeTree
-第一个参数'/clickhouse/tables/{shard}/flow'是表在zookeeper上的路径,第二个参数即副本名称
导入数据
在不同的server建好表以后,就可以往表中写入数据了,可以使用insert方式向replicated表中写入数据,也可以通过clickhouse-client的文件导入方式写入。只需要往其中一台server的replicated表中写数即可,clickhouse会自动将数据同步到其他server上面,同步数据和写入数据的过程是异步的。
其他事项
-clickhouse的cluster环境中,每台server的地位是等价的,即不存在master-slave之说,是multi-master模式
-各replicated表的宿主server上要在hosts里配置其他replicated表宿主server的ip和hostname的映射
-上面描述的是在不同的server上建立全新的replicated模式的表, 如果在某台server上已经存在一张replicated表,并且表中已经有数据,这时在另外的server上执行完replicated建表语句后,已有数据会自动同步到其他server上面
-如果zookeeper挂掉,replicated表会切换成read-only模式,不再进行数据同步,系统会周期性的尝试与zk重新建立连接
-如果在向一张replicated表insert数据的时候zookeeper挂掉,这时候会抛一个异常,等到与zk重新建立连接以后,系统(其他replicated表所在server)会检查本地文件与预期文件(保存在zk上)的差别,如果是轻微的差别,直接同步覆盖,如果发现有数据块损坏或者识别不了,则将这些数据文件移动到“detached”子目录,然后重新根据zk所记录的文件信息进行副本的同步
-drop掉某一台server上的replicated表,不会对其他server上面的replicated表造成影响