一、环境准备
1、环境信息
192.168.184.161 zk ck
192.168.184.162 zk ck
192.168.184.163 zk ck
192.168.184.164 ck
2、修改主机名
(1)161节点执行
hostname node-01
sudo hostnamectl set-hostname node-01
su -
(2)162节点执行
hostname node-02
sudo hostnamectl set-hostname node-02
su -
(3)163节点执行
hostname node-03
sudo hostnamectl set-hostname node-03
su -
(3)164节点执行
hostname node-04
sudo hostnamectl set-hostname node-04
su -
3、修改hosts
vim /etc/hosts
添加如下内容
192.168.184.161 node-01
192.168.184.162 node-02
192.168.184.163 node-03
192.168.184.164 node-04
4、安装java环境
在zk集群安装即可,我这里是161、162、163节点进行安装。
yum -y install java
java -version
5、安装clickhouse
在161、162、163、164节点安装clickhouse,可参考:
二、ClickHouse分片架构图
三、zookeeper安装和启动
1、下载zookeeper
网盘地址:
链接: https://pan.baidu.com/s/1p2aPuhR3GSo3qDehTPmypg?pwd=hkyw
提取码: hkyw
mkdir /data/zookeeper
cd /data/zookeeper
ll
tar zxvf apache-zookeeper-3.9.3-bin.tar.gz
cd apache-zookeeper-3.9.3-bin
cd conf/
cp zoo_sample.cfg zoo.cfg
2、修改配置文件
vim /data/zookeeper/apache-zookeeper-3.9.3-bin/conf/zoo.cfg
加入
server.1=192.168.184.161:2888:3888
server.2=192.168.184.162:2888:3888
server.3=192.168.184.163:2888:3888
3、配置myid
(1)161节点执行
mkdir -p /tmp/zookeeper/
echo 1 >/tmp/zookeeper/myid
(2)162节点执行
mkdir -p /tmp/zookeeper/
echo 2 >/tmp/zookeeper/myid
(3)163节点执行
mkdir -p /tmp/zookeeper/
echo 3 >/tmp/zookeeper/myid
4、启动zookeeper
/data/zookeeper/apache-zookeeper-3.9.3-bin/bin/zkServer.sh start
查看进程
ps -ef | grep zookeeper
四、配置ClickHouse的分片集群
在161、162、163、164节点进行配置
1、修改分片配置文件
vim /etc/clickhouse-server/config.xml
(1)调整监听的host
调整监听的host,这里一般安装的时候就设置好了:
<listen_host>0.0.0.0</listen_host>
(2)zookeeper的配置
加入zookeeper的配置:
<zookeeper>
<node>
<host>node-01</host>
<port>2181</port>
</node>
<node>
<host>node-02</host>
<port>2181</port>
</node>
<node>
<host>node-03</host>
<port>2181</port>
</node>
</zookeeper>
(3)分片集群的配置
加入分片集群的配置:
<remote_servers>
<!-- 2分片1副本 -->
<cluster_test>
<!-- 数据分片1 -->
<shard>
<weight>1</weight>
<!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). -->
<internal_replication>true</internal_replication>
<replica>
<host>192.168.184.161</host>
<port>9000</port>
</replica>
<replica>
<host>192.168.184.162</host>
<port>9000</port>
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>192.168.184.163</host>
<port>9000</port>
</replica>
<replica>
<host>192.168.184.164</host>
<port>9000</port>
</replica>
</shard>
</cluster_test>
</remote_servers>
参数解释:
internal_replication
这个参数表示是否将数据写入其中一个副本,如果是false,表示写入所有副本。
每个分片可以配置权重weight,默认都是1
(4)分片集群的名称
注意,这里每一个节点都不一样,要注意一下!!
161节点
<macros>
<shard>01</shard>
<replica>node-01</replica>
</macros>
162节点
<macros>
<shard>01</shard>
<replica>node-02</replica>
</macros>
163节点
<macros>
<shard>02</shard>
<replica>node-03</replica>
</macros>
164节点
<macros>
<shard>02</shard>
<replica>node-04</replica>
</macros>
参数解释:
这一段是ClickHouse里面的宏,类似代码里的变量
在等一下创建分布式表的时候,会调用这两个宏
分片1,shard写成01
分片2,shard写成02
replica,每个节点唯一,比如是node-01 到04
2、重启clickhouse
/etc/init.d/clickhouse-server restart
3、查看集群信息
随便选择一个节点,登录clickhouse,这里我在161节点进行登录
clickhouse-client -m
查看集群信息
select * from system.clusters;
4、创建本地表和总表
(1)创建库
在所有节点创建库,我这里是161、162、163、164节点
clickhouse-client -m
CREATE DATABASE cluster_db;
(2)创建本地表
到其中一个节点创建本地表,会自动同步到其他节点,我这里在161节点进行创建。
clickhouse-client -m
CREATE TABLE cluster_db.cluster_table_local on cluster cluster_test
(
EventDate DateTime,
CounterID UInt32,
UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/cluster_table_local', '{replica}')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID));
参数解释:
ENGINE = ReplicatedMergeTree('zk_path', 'replica_name')
1、zk_path 用于指定在 zk 中创建数据表的路径,一般 zk_path 建议配置成如下形式:
/clickhouse/fcluster}/{shard}{table name}
(1){cluster}表示集群名;
(2){shard}表示分片编号;
(3){table_name}表示数据表的名称;
2、replica_name 的定义,需要注意的是同一分片不同副本,需要定义不同的名称;
3、而 zk path 的定义,需要注意的是同一分片不同副本,需要定义相同的路径。
(3)创建分布式总表
所有节点都需要创建分布式总表:
CREATE TABLE cluster_db.cluster_table_all AS cluster_db.cluster_table_local ENGINE = Distributed(cluster_test, cluster_db, cluster_table_local, rand());
参数解释:
cluster_test:集群名
cluster_db和cluster_table:库表名
rand():分片方式
五、数据分布测试
1、往总表写入数据
在161节点写入数据
insert into cluster_db.cluster_table_all values ('2030-01-01 12:00:00',1,1),
('2030-02-01 12:00:00',2,2),
('2030-03-01 12:00:00',3,3),
('2030-04-01 12:00:00',4,4);
2、查询总表数据
161、162、163、164节点查询数据
select * from cluster_db.cluster_table_all;
3、查询各个分片本地表的数据
161、162、163、164节点查询数据
select * from cluster_db.cluster_table_local;
六、高可用测试
1、停一个节点
停掉163节点的ck
/etc/init.d/clickhouse-server stop
2、测试总表写入数据
161节点写入数据
insert into cluster_db.cluster_table_all values
('2030-05-01 12:00:00',5,5),
('2030-06-01 12:00:00',6,6);
3、测试总表查询
161、162、164节点查询数据
select * from cluster_db.cluster_table_all ;
七、问题总结
1、怎样完全删除分片表
如果创建了本地表,想删除,可以登录zookeeper
(1)登录zookeeper
/data/zookeeper/apache-zookeeper-3.9.3-bin/bin/zkCli.sh
(2)查询
ls /
(3)删除
deleteall /clickhouse/tables/01
deleteall /clickhouse/tables/02
2、某个实例本地表没有任何数据可能的原因
如果发现某个本地表没有保存任何数据,可能是listen_host没有开放,配置如下:
<listen_host>0.0.0.0</listen_host>