ClickHouse高可用集群的配置: https://www.cnblogs.com/freeweb/p/9352947.html
副本表以及分布式表简单实践 : https://www.cnblogs.com/leodaxin/p/10023641.html
ClickHouse之集群搭建以及数据复制:https://blog.csdn.net/weixin_34269583/article/details/85880207
ClickHouse分布式高可用集群搭建: https://cloud.tencent.com/developer/article/1376125
这里主要介绍clickhouse高可用集群的部署方案,因为对于默认的分布式表的配置,每个分片只有一份,这样如果挂掉一个节点,则查询分布式表的时候直接会报错,这个是基于clickhouse自己实现的多分片单副本集群,配置也比较简单,这里说的高可用是指,每个分片具有2个或以上副本,当某个节点挂掉时,该节点分片仍可以由其他机器上的副本替代工作,所以这样实现的分布式集群可以在挂掉至少1个节点时机器正常运行,随着集群节点数量的增加,则集群挂掉2个节点或以上可提供服务的概率也越大,至少能避免单点故障问题,集群的稳定性也更高。
clickhouse集群的理想方案是如下所示:
这里有3个集群,每个集群n个节点,每个节点的数据依靠zookeeper协调同步,比如cluster1提供服务,如果cluster1里面挂掉多台机器那么cluster2的副本可以切换过来提供服务,如果cluster2的分片再挂了,那么cluster3中的副本也可以提供服务,cluster1~3同时挂掉的概率就非常小了,所以集群的稳定性可以非常高,其中单个集群的节点个数n决定了clickhouse的性能,性能是可以线性扩展的,具体副本集群的个数根据机器资源配置.
如果机器资源确实特别少,想每个节点都用上提供服务的话,那么可以每个节点存储两个以上的副本,即提供服务的分片和其他机器的副本,实现相互备份,但是clickhouse不支持单个节点多个分片的配置,我们可以人为设置在每个节点上启动两个实例来实现,设计图如下:
可以看出来3个节点每个节点的tcp 9000对外提供服务,9001提供副本,其中2提供1的备份,3提供2的备份,1提供3的备份,这样假设挂掉1个节点,集群也可以正常使用,但是挂掉2个几点,就不正常了,这样的话是机器越多越稳定一些.
上面两种方案,官网上还是推荐的第一种方案可用性最高,这里为了演示采用第二种方式配置,其实两种方式的配置是完全一样的,第二种配置反而更繁琐一些,下面详细说一下配置的流程,软件包结构就采用上一篇文章打包好的.
zookeeper 需要单独部署在其他机器上,以免clickhouse 节点挂掉,引起zookeeper 挂掉。
0. 高可用原理:zookeeper + ReplicatedMergeTree(复制表) + Distributed(分布式表)
1. 前提准备:所有节点防火墙关闭或者开放端口;所有节点建立互信(免密码登录);hosts表和主机名一定要集群保持一致正确配置,因为zookeeper返回的是主机名,配置错误或不配置复制表时会失败.
clickhouse测试节点3个:10.121.8.6 dc-server06(clickhouse1), 10.121.8.7 dc-server07 (clickhouse2),10.121.8.8 dc-server08 (clickhouse3)
zookeeper测试节点1个:10.121.8.8 dc-server08 (zookeeper)
配置方案:3个节点点各配置两个clickhouse实例,相互备份.
dc-server06: 实例1, 端口: tcp 9000, http 8123, 同步端口9009, 类型: 分片1, 副本1
dc-server06: 实例2, 端口: tcp 9001, http 8124, 同步端口9010, 类型: 分片3, 副本3 (clickhouse3的副本)
dc-server07: 实例1, 端口: tcp 9000, http 8123, 同步端口9009, 类型: 分片2, 副本1
dc-server07: 实例2, 端口: tcp 9001, http 8124, 同步端口9010, 类型: 分片1, 副本2 (clickhouse1的副本)
dc-server08: 实例1, 端口: tcp 9000, http 8123, 同步端口9009, 类型: 分片3, 副本1
dc-server08: 实例2, 端口: tcp 9001, http 8124, 同步端口9010, 类型: 分片2, 副本2 (clickhouse2的副本)
1)主机配置(根据自身情况)
10.121.8.6 dc-server06 centos 6.4/6.6 32G 200G
10.121.8.7 dc-server07 centos 6.4/6.6 32G 200G
10.121.8.8 dc-server08 centos 6.4/6.6 32G 200G
2)hosts表和主机名
3)所有节点防火墙关闭或者开放端口;
# 1.关闭防火墙
service iptables stop
chkconfig iptables off
chkconfig ip6tables off
# 2.关闭selinux
vi /etc/sysconfig/selinux
修改内容:【SELINUX=disabled】
4)所有节点建立互信(免密码登录);
1、在各节点通过ssh-keygen生成RSA密钥和公钥
ssh-keygen -q -t rsa -N "" -f ~/.ssh/id_rsa
2、将所有的公钥文件汇总到一个总的授权key文件中,在M01机器执行如下命令,必须逐行执行:
ssh deserver06 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh deserver07 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh deserver08 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3、设置授权key文件的权限,在M01机器执行如下命令:
chmod 600 ~/.ssh/authorized_keys
4、分发授权key文件到所有服务器,必须逐行执行:
scp ~/.ssh/authorized_keys deserver06:~/.ssh/
scp ~/.ssh/authorized_keys deserver07:~/.ssh/
scp ~/.ssh/authorized_keys deserver08:~/.ssh/
说明:
1)当系统为centos 6.4 时 ,需要安装libicu-4.2.1-14.el6.x86_64.rpm 包,clickhouse-common-static-18.14.12-1.el6.x86_64.rpm依赖此包。
2)当系统为centos 6.6 时 ,不需要安装libicu-4.2.1-14.el6.x86_64.rpm包,直接安装其他包即可。
3) 安装资源获取: https://packagecloud.io/Altinity/clickhouse。
4)也可以直接在csdn 下载:https://download.csdn.net/download/u013205003/10968848
1) 分别在个服务器上进行如下安装和配置
2)安装clickhouse
安装 libicu
mkdir -p /usr/local/icu/
cd /usr/local/icu/libicu-4.2.1-14.el6.x86_64.rpm
rpm -ivh libicu-4.2.1-14.el6.x86_64.rpm
安装clickhouse
rpm -ivh clickhouse-server-common-18.14.12-1.el6.x86_64.rpm
rpm -ivh clickhouse-compressor-1.1.54336-3.el6.x86_64.rpm
rpm -ivh clickhouse-common-static-18.14.12-1.el6.x86_64.rpm
rpm -ivh clickhouse-server-18.14.12-1.el6.x86_64.rpm
rpm -ivh clickhouse-client-18.14.12-1.el6.x86_64.rpm
rpm -ivh clickhouse-test-18.14.12-1.el6.x86_64.rpm
rpm -ivh clickhouse-debuginfo-18.14.12-1.el6.x86_64.rpm
3) 修改启动脚本和配置文件
首先将启动脚本复制一个出来,除了上一篇文章说的外,主要修改配置文件位置和pid文件位置,如下:
启动脚本路径:/etc/init.d/clickhouse-server
复制
修改
这里配置文件比如使用config1.xml,pid使用clickhouse-server-1.pid
然后进入到配置文件目录,将原有配置文件拷贝一份,这里是config1.xml,然后修改配置:
主要修改内容是:日志文件(和之前不要冲突)、http端口、tcp端口、副本同步端口(这个改完之后clickhouse按照当前实例的端口自动和其他实例同步)、数据文件和tmp目录、users.xml(这个如果都一样可以用同一个)、最后就是集群配置了,下面重点叙述:
集群配置默认为:
zookeeper默认为:
macros默认为:
首先是集群分片的配置,这个配置所有节点的所有实例完全保持一致:
1
true
10.121.8.6
9000
10.121.8.7
9001
1
true
10.121.8.7
9000
10.121.8.8
9001
1
true
10.121.8.8
9000
10.121.8.6
9001
配置里面的
然后是zookeeper配置,这个也是所有示例配置都一样:
10.121.8.8
2181
这里zookeeper只有一个,如果多个的话继续往下写,就像官网上给出的一样,参考下图:
然后是复制标识的配置,也称为宏配置,这里唯一标识一个副本名称,每个实例都要配置并且都是唯一的,这里配置如下:
clickhouse1 9000 分片1, 副本1:
01
01
cluster01-01-1
clickhouse1 9001 分片3, 副本2:
01
03
cluster01-03-2
clickhouse2 9000 分片2, 副本1:
01
02
cluster01-02-1
clickhouse2 9001 分片1, 副本2:
01
01
cluster01-01-2
clickhouse3 9000 分片3, 副本1:
01
03
cluster01-03-1
clickhouse3 9001 分片2, 副本2:
01
02
cluster01-02-2
由上面配置可以看到replica的分布规律,其中layer是双级分片设置,在Yandex公司的集群中用到,因为我们这里是单集群所以这个值对我们没有影响全部一样即可,这里是01;然后是shard表示分片编号;最后是replica是副本标识,这里使用了cluster{layer}-{shard}-{replica}的表示方式,比如cluster01-02-1表示cluster01集群的02分片下的1号副本,这样既非常直观的表示又唯一确定副本. 副本的文档链接下面会给出.
2,依次启动3个节点上的 各2 个实例,总共 6个实例
# 启动实例一
[root@dc-server06 clickhouse-server]# service clickhouse-server start
# 启动实例二
[root@dc-server06 clickhouse-server]# service clickhouse-server2 start
依次检查 3个节点上的 各2 个实例,总共 6个实例
请参考配置文件(详细):/etc/clickhouse-server/config.xml
dc-server06 / clickhouse1 实例一
trace
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log
1000M
10
8123
9000
/etc/clickhouse-server/server.crt
/etc/clickhouse-server/server.key
/etc/clickhouse-server/dhparam.pem
none
true
true
sslv2,sslv3
true
true
true
sslv2,sslv3
true
RejectCertificateHandler
9009
10.121.8.6
::
4096
3
100
8589934592
5368709120
/data/clickhouse/
/data/clickhouse/tmp/
/var/lib/clickhouse/user_files/
users.xml
default
default
1
true
10.121.8.6
9000
10.121.8.7
9001
1
true
10.121.8.7
9000
10.121.8.8
9001
1
true
10.121.8.8
9000
10.121.8.6
9001
10.121.8.8
2181
01
01
cluster01-01-1
::/0
3600
3600
60
system
query_log
toYYYYMM(event_date)
7500
*_dictionary.xml
/clickhouse/task_queue/ddl
click_cost
any
0
3600
86400
60
max
0
60
3600
300
86400
3600
/var/lib/clickhouse/format_schemas/
dc-server06 / clickhouse1 实例二 /etc/clickhouse-server/config.xml
trace
/var/log/clickhouse-server/clickhouse-server2.log
/var/log/clickhouse-server/clickhouse-server2.err.log
1000M
10
8124
9001
/etc/clickhouse-server/server.crt
/etc/clickhouse-server/server.key
/etc/clickhouse-server/dhparam.pem
none
true
true
sslv2,sslv3
true
true
true
sslv2,sslv3
true
RejectCertificateHandler
9010
10.121.8.8
::
4096
3
100
8589934592
5368709120
/data/clickhouse2/
/data/clickhouse2/tmp/
/var/lib/clickhouse/user_files2/
users.xml
default
default
1
true
10.121.8.6
9000
10.121.8.7
9001
1
true
10.121.8.7
9000
10.121.8.8
9001
1
true
10.121.8.8
9000
10.121.8.6
9001
10.121.8.8
2181
01
02
cluster01-02-2
::/0
3600
3600
60
system
query_log
toYYYYMM(event_date)
7500
*_dictionary.xml
/clickhouse/task_queue2/ddl
click_cost
any
0
3600
86400
60
max
0
60
3600
300
86400
3600
/var/lib/clickhouse/format_schemas2/
配置文件:/etc/clickhouse-server/users.xml
内存限制设置 vi /etc/clickhouse-server/users.xml
本次设置为 32 G 转化为B : 34359738368 B
1.所有实例配置完上面这些之后,分别执行启动命令启动,然后所有实例都执行下面语句创建数据库:
CREATE DATABASE monchickey;
2. 然后对于所有实例分别创建对应的复制表,这里测试创建一个简单的表
drop table monchickey.t_co_dwfxdata_0809_30000000_new;
CREATE
TABLE
monchickey.t_co_dwfxdata_0809_30000000_new(
CRETIME date,
YEAR String,
MONTH String,
COMPNAME String,
CBYS String,
YWHD String,
DYDJ String,
ZCLX String,
AMOUNT Float64,
YHLB String,
YSLX String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/t_co_dwfxdata_0809_30000000_new', '{replica}',
CRETIME,
(COMPNAME),
8192
);
drop table monchickey.t_co_dwfxdata_0809_30000000_all;
CREATE TABLE monchickey.t_co_dwfxdata_0809_30000000_all AS monchickey.t_co_dwfxdata_0809_30000000_new ENGINE = Distributed(distable, monchickey, t_co_dwfxdata_0809_30000000_new, rand());
select count (*) from monchickey.t_co_dwfxdata_0809_30000000_new;
select count(*) from monchickey.t_co_dwfxdata_0809_30000000_all;
3.简单数据样例
分别在三台机器上插入如下数据
dc-server06 /clickhouse1
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES ('2016-01-01','2016年','1月','单位8','其他长期职工福利','检修-输电运检','500kV及以上','架空线路',9.4441398224E8,'','工');
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES ('2016-01-01','2016年','1月','单位8','其他短期薪酬','检修-输电运检','500kV及以上','架空线路',2.0894114651E8,'','工');
dc-server07 /clickhouse2
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES ('2016-01-01','2016年','1月','单位8','其他长期职工福利','检修-输电运检','500kV及以上','架空线路',9.4441398224E8,'','工')
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES (('2016-01-','2016年','1月','单位8','临时用工薪酬','检修-输电运检','500kV及以上','架空线路',8.5247987777E8,'','工');
dc-server08 /clickhouse3
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES ('2016-01-01','2016年','1月','单位8','劳务派遣费','检修-输电运检','500kV及以上','架空线路',3.59378772E8,'','工');
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES ('2016-01-01','2016年','1月','单位8','委托服务费','检修-输电运检','500kV及以上','架空线路',4.7638581405E8,'','费');
insert into monchickey.t_co_dwfxdata_0809_30000000_all VALUES ('2016-01-01','2016年','1月','单位8','财产保险费','检修-输电运检','500kV及以上','架空线路',9.527716281E8,'','费');
在任意一台机器上查询数据
a.能查询到完成 7条数据
b.查询总数为7条
select * from monchickey.t_co_dwfxdata_0809_30000000_all;--能查询到完整的7 条数据
select count(*) from monchickey.t_co_dwfxdata_0809_30000000_all; -- 总数为7