副本的目的主要是保障数据的高可用性与容灾,即使一台ClickHouse节点宕机,那么也可以从其他服务器获得相同的数据。副本数据同步,意思就是在主表上做任何增删改的操作,副本会进行相应的同步操作。而副本的数据则是来源与主表。副本同步只能同步数据,不能同步表结构,所以每台机器上的表需要自己手动创建。
主副本配置
zookeeper可单节点也可以集群,这里采用单节点模式。在主库 /etc/clickhouse-server/config.d/ 的目录中创建metrika.xml配置文件,内容如下
<yandex>
<zookeeper-servers>
<node index="1">
<host>这里可以是zookeepr所在的服务器IP也可以是在hosts中映射好的主机名字</host>
<port>2181</port>
</node>
</zookeeper-servers>
</yandex>
然后在 /etc/clickhouse-server/config.xml 中找到所在行,在它的下方将上面创建的metrika.xml引入进去
然后重启,副本clickhouse-server也做如上同样的操作。完成配置后,就可以建表测试。
在主库上创建如下表:
create table t_order_rep (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/01/t_order_rep','rep_102')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
在副本上创建如下表:
create table t_order_rep (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/01/t_order_rep','rep_103')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
参数解释
ReplicatedMergeTree 中,
第一个参数是分片的zk_path一般按照: /clickhouse/table/{shard}/{table_name} 的格式写,如果只有一个分片就写01即可。
第二个参数是副本名称,相同的分片副本名称不能相同。
然后在主库中执行以下插入语句,这个时候副本也会出现一样的数据
insert into t_order_rep values
(101,'sku_001',1000.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 12:00:00'),
(103,'sku_004',2500.00,'2020-06-01 12:00:00'),
(104,'sku_002',2000.00,'2020-06-01 12:00:00'),
(105,'sku_003',600.00,'2020-06-02 12:00:00');
引用来源:https://www.cnblogs.com/shengyang17/p/14282944.html#_lab2_0_1