一、查看分布式配置
假定4台服务器 10.1.1.1 和 10.1.1.2 和10.1.1.3 和10.1.1.4
设定为 2个分片(s),2个副本(r)
10.1.1.1 是 s1r1 10.1.1.2是s1r2
10.1.1.3是s2r1 10.1.1.4是s2r2
查看本地分片状态位:SELECT *from system
.macros;
二、新建分布式表的本地表
新建分布式表依赖于分布式ddl
分布式ddl指的是在一台服务器上执行sql,其他服务器同步执行,需要借助于cluster,如下方
create table tableName on cluster my_shard (id Int8,name String)engine=xxx ;
上面创建的一张表,除了on cluster my_shard以外就是正常的创建表语句,my_shard我们上面配置过,里面一共包含了10.1.1.1- s1r1 和 10.1.1.2-s1r2 和10.1.1.3-s2r1 和10.1.1.4-s2r2 四个replica,那么在执行的时候,就会到my_shard配置下的所有服务器中执行create table语句.也就是这三台服务器任意一台执行以上sql,三台的表都会创建好,这就是分布式ddl,分布式ddl也需要zookeeper的支持,同样也支持CREATE、DROP、ALTER、RENAME
示例代码:
CREATE TABLE if not exists default.test_cluster_g on cluster my_shard
(
`UserID` UInt64,
`PageViews` UInt8,
`Duration` UInt8,
`Sign` Int8,
`Version` UInt8
)
ENGINE = ReplicatedMergeTree
ORDER BY UserID
SETTINGS index_granularity = 8192;
默认新建,副本表会有很多参数,只要在配置文件中加上配置项,就可以在新建表的时候省略这些参数
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard_name}/replicaTest3', '{replica_name}')
执行完成分布式DDL后,就可以发现各个分片的各个副本都生成了对应的表。
三、同步数据
1、默认情况下,对test_cluster_g 表进行insert,都是只会在本分片生效,副本间同步。
不会到另一个分片上去。需要新建一个对应的分布式表,对分布式表进行insert,这样会按照一定的规则,把数据分散插入到各个分片上。
2、新建分布式表
Distributed(cluster_name, db_name, table_name[, sharding_key[, policy_name]])
第一个是配置的cluster名称,第二个第三个分别代表代理的数据库,数据表,第四个参数是数据插入分发策略,指定一个字段名(必须是Int类型)或者rand(),第五个参数是策略名称。
示例代码
CREATE TABLE default.test_cluster_g_all on cluster my_shard
(
`UserID` UInt64,
`PageViews` UInt8,
`Duration` UInt8,
`Sign` Int8,
`Version` UInt8
)
ENGINE = Distributed('my_shard',
'default',
'test_cluster_g',
rand())
3、insert分布式表
此时insert 分布式表,会将数据分散发送到各个分片。分片内部不同副本,数据由zookeeper进行同步。select分布式表,查询的全部分片
此时就可以使用了分布式了