- 一、clickhouse实现二分片双备份案例如下
- 1、配置metrika.xml
- 2、数据测试
true node1 9000 default 123456 true node2 9000 default 123456 true true node3 9000 default 123456 true node4 9000 default 123456 true node1 2181 node2 2181 node3 2181 30000 10000 01 rep_1_1
以上宏变量四台机器配置分别为:
node1
01 rep_1_1
node2
01 rep_1_2
node3
02 rep_2_1
node4
02 rep_2_2
参数解读
-
通过分布式表的方式实现数据副本时,写入我们配置的分布式表时,分布式表会往shard下的所有replica都写入一份数据.如果我们这里的replicaTest表改成ReplicatedMergeTree引擎,那么我们就只需要分布式表选择一个replica写入即可,由ReplicatedMergeTree完成数据同步,而不需要每个replica都要写入,这项配置需要添加
true true ...... -
权重配置
2
weight默认为1,既node1 node2 node3 都为1,那么总的权重为3,每个分片通过分布式表第四个参数sharding_key分配到数据的概率是一样.
至此,最适合生产的分片与副本机制就配置好了
--创建本地ReplicatedMergeTree表(shard、replica为宏变量中的相应值),单台机器创建后回同步至其它机器
CREATE TABLE default.replicaTest2 on cluster test_ck_cluster(`id` Int32,`name` String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard_name}/replicaTest', '{replica_name}') ORDER BY id
--创建分布式表
create table dis_replicaTest2 on cluster test_ck_cluster(`id` Int32,`name` String) engine = Distributed(test_ck_cluster, default, replicaTest2, rand());
--分布式表插入数据
insert into dis_replicaTest2 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu');
--分别查询分布式表以及本地表
分布式表中包含所有数据
node1:
SELECt *
FROM dis_replicaTest2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
┌─id─┬─name───┐
│ 2 │ lisi │
│ 3 │ wangwu │
SELECt *
FROM replicaTest2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
node2:
SELECt *
FROM dis_replicaTest2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
┌─id─┬─name───┐
│ 2 │ lisi │
│ 3 │ wangwu │
SELECt *
FROM replicaTest2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
node3:
SELECt *
FROM dis_replicaTest2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
┌─id─┬─name───┐
│ 2 │ lisi │
│ 3 │ wangwu │
SELECt *
FROM replicaTest2
┌─id─┬─name───┐
│ 2 │ lisi │
│ 3 │ wangwu │
└────┴────────┘
node4:
SELECt *
FROM dis_replicaTest2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
┌─id─┬─name───┐
│ 2 │ lisi │
│ 3 │ wangwu │
SELECt *
FROM replicaTest2
┌─id─┬─name───┐
│ 2 │ lisi │
│ 3 │ wangwu │
└────┴────────┘
以上可以看出,三条数据分为了两个分片
node1、node2为1分片互为副本存储
┌─id─┬─name─────┐ │ 1 │ zhangsan │ └────┴──────────┘
node3、node4为2分片互为副本存储
┌─id─┬─name───┐ │ 2 │ lisi │ │ 3 │ wangwu │ └────┴────────┘
停止node1、node3服务访问数据能够正常访问分布式表中的所有数据:
SELECt *
FROM dis_replicaTest2
┌─id─┬─name─────┐ │ 1 │ zhangsan │ └────┴──────────┘ ┌─id─┬─name───┐ │ 2 │ lisi │ │ 3 │ wangwu │



