环境介绍 Clickhouse高可用
集群采用ReplicatedMergeTree + Distributed
方案,2分片2副本
,共4个节点
。
注意: 本文档不展示zookeeper集群的安装过程,请自行查找zk集群安装文档。生产环境建议Zookeeper独立服务器部署,Clickhouse集群对Zookeeper依赖较高。
名称
版本
操作系统
Centos7.9
ClickHouse版本(RPM)
21.9.7.2
Zookeeper集群
3.4.5
Node01
192.168.99.28
Node02
192.168.99.29
Node03
192.168.99.30
Node04
192.168.99.21
操作系统准备工作
准备工作四台主机都需要操作。
我这里准备clickhouse单独数据盘挂载
,如果数据不单独存储可以省略
此步。
1 2 3 4 5 6 7 8 9 10 pvcreate /dev/sdb vgcreate data /dev/sdb lvcreate --name data_01 -l 100%FREE data mkfs.ext4 /dev/mapper/data-data_01 mkdir -p /data/clickhousecat >> /etc/fstab<<EOF /dev/mapper/data-data_01 /data ext4 defaults,noatime 0 EOF mount -a
修改
系统文件安全上限配置
及安装依赖
1 2 3 4 5 6 7 $ vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072 $ yum install -y libtool *unixODBC*
关闭防火墙和Selinux
1 2 3 4 5 6 7 systemctl stop firewalld systemctl disable firewalld sed -i 's/=enforcing/=disabled/g' /etc/selinux/config setenforce 0
开始离线安装 下载并安装软件包
https://repo.yandex.ru/clickhouse/rpm/stable/x86_64
,下载离线rpm安装包,clickhouse-client*
、clickhouse-common-static*
、clickhouse-common-static-dbg*
、clickhouse-server*
这四个安装包的版本要一致
我这里安装的是21.9.7.2
版本,下面是下载地址这里可以先下载软件包到一台主机,然后通过scp的方式传送到另外三台主机。
1 2 3 4 5 6 $ cd /usr/local/src wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-client-21.9.7.2-2.noarch.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-21.9.7.2-2.x86_64.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-dbg-21.9.7.2-2.x86_64.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-server-21.9.7.2-2.noarch.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-test-21.9.7.2-2.noarch.rpm
四台主机
都执行下面命令安装clickhouse的rpm包
到主机。
1 2 3 4 5 6 $ yum install -y ./*.rpm mkdir -p /data/clickhousechown -R clickhouse:clickhouse /data/clickhouse/ && chmod 700 /data/clickhouse/
修改配置文件 修改四台主机的clickhouse
主配置文件config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $ vim /etc/clickhouse-server/config.xml <tcp_port > 29000</tcp_port > <interserver_http_host > 192.168.99.28</interserver_http_host > <listen_host > 0.0.0.0</listen_host > <max_connections > 4096</max_connections > <path > /data/clickhouse/</path > <tmp_path > /data/clickhouse/tmp/</tmp_path > <format_schema_path > /data/clickhouse/format_schemas/</format_schema_path > <user_files_path > /data/clickhouse/user_files/</user_files_path > <path > /data/clickhouse/access/</path > <include_from > /etc/clickhouse-server/config.d/metrika.xml</include_from >
四个节点新建都需要的配置文件/etc/clickhouse-server/config.d/metrika.xml
,一段不同的配置在下面列举,相同的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 $ vim /etc/clickhouse-server/config.d/metrika.xml <yandex > <remote_servers > <test_cdh_ck_cluster > <shard > <weight > 1</weight > <internal_replication > true</internal_replication > <replica > <host > 192.168.99.28</host > <port > 29000</port > <user > default</user > <password > </password > <compression > true</compression > </replica > <replica > <host > 192.168.99.30</host > <port > 29000</port > <user > default</user > <password > </password > <compression > true</compression > </replica > </shard > <shard > <weight > 1</weight > <internal_replication > true</internal_replication > <replica > <host > 192.168.99.29</host > <port > 29000</port > <user > default</user > <password > </password > <compression > true</compression > </replica > <replica > <host > 192.168.99.21</host > <port > 29000</port > <user > default</user > <password > </password > <compression > true</compression > </replica > </shard > </test_cdh_ck_cluster > </remote_servers > <zookeeper > <node index ="1" > <host > 192.168.99.28</host > <port > 2181</port > </node > <node index ="2" > <host > 192.168.99.29</host > <port > 2181</port > </node > <node index ="3" > <host > 192.168.99.30</host > <port > 2181</port > </node > </zookeeper > <networks > <ip > ::/0</ip > </networks > <clickhouse_compression > <case > <min_part_size > 10000000000</min_part_size > <min_part_size_ratio > 0.01</min_part_size_ratio > <method > lz4</method > </case > </clickhouse_compression > <macros > <shard > 01</shard > <replica > ch28-01-01</replica > </macros > </yandex >
Node01-99.28节点不同的集群配置字段如下
1 2 3 4 5 6 <macros > <shard > 01</shard > <replica > ch28-01-01</replica > </macros >
Node02-99.29节点不同的集群配置字段如下
1 2 3 4 <macros > <shard > 02</shard > <replica > ch29-02-01</replica > </macros >
Node03-99.30节点不同的集群配置字段如下
1 2 3 4 <macros > <shard > 01</shard > <replica > ch30-01-02</replica > </macros >
Node04-99.21节点不同的集群配置字段如下
1 2 3 4 <macros > <shard > 02</shard > <replica > ch21-02-02</replica > </macros >
修改所有节点的目录的属组
,因为刚刚新建的用户
可能是root
,我们要改成属组和属主是clickhouse
。
1 $ chown -R clickhouse:clickhouse /etc/clickhouse-server/
启动服务 完成后现在就可以启动各节点的clickhouse服务了。
1 2 3 4 5 6 7 $ /etc/init.d/clickhouse-server start $ ss -tnl |egrep '29000|8123' LISTEN 0 64 *:29000 *:* LISTEN 0 64 *:8123 *:*
如果启动有问题就可以
连接集群并建库验证 任何一台机器使用clickhouse-client
命令行工具连接到服务
1 2 3 4 5 6 7 8 $ clickhouse-client --port 29000 clickhouse-client --port 29000 ClickHouse client version 21.9.7.2 (official build). Connecting to localhost:29000 as user default. Connected to ClickHouse server version 21.9.7 revision 54449. k8s-master21 :)
查看集群信息
1 2 3 4 5 6 7 8 9 10 11 12 :) select cluster,shard_num,replica_num,shard_weight,host_name,port,user from system.clusters; ┌─cluster─────────┬─shard_num─┬─replica_num─┬─shard_weight─┬─host_name─────┬──port─┬─user ────┐ │ test_cdh_ck_cluster │ 1 │ 1 │ 1 │ 192.168 .99 .28 │ 29000 │ default │ │ test_cdh_ck_cluster │ 1 │ 2 │ 1 │ 192.168 .99 .30 │ 29000 │ default │ │ test_cdh_ck_cluster │ 2 │ 1 │ 1 │ 192.168 .99 .29 │ 29000 │ default │ │ test_cdh_ck_cluster │ 2 │ 2 │ 1 │ 192.168 .99 .21 │ 29000 │ default │ └─────────────────┴───────────┴─────────────┴──────────────┴───────────────┴───────┴─────────┘ # 可以看到如下信息 # test_cdh_ck_cluster为我们的集群名称 # 分片1 的第一个副本是99.28 ,第二个副本是99.30 # 分片2 的第一个副本是99.29 ,第二个副本是99.21
创建数据库因为有on cluster test_cdh_ck_cluster
语句字段,所有会自动在所有节点执行。
1 create database testdb on cluster test_cdh_ck_cluster;
创建本地表,如果去掉ON CLUSTER test_cdh_ck_cluster
语句字段则需要每个节点都要创建。
1 create table testdb.table_test ON CLUSTER test_cdh_ck_cluster ( label_id UInt32, label_name String, insert_time Date ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_cdh_ck_cluster/{shard}/table_test' ,'{replica}' ,insert_time, (label_id, insert_time), 8192 );
ReplicatedMergeTree
引擎用法: ENGINE = ReplicatedMergeTree('zk_path', 'replica_name')
zk_path
用于指定在 zk
中创建数据表的路径,一般 zk_path
建议配置成如下形式:
/clickhouse/tables/{cluster}/{shard}/{table_name},{replica}
{cluster}
表示集群名,替换成实际的集群名
{shard}
表示分片编号,ch中已定义宏变量,会自动读取本节点的值
{table_name}
表示数据表的名称,替换成实际的表名
{replica}
表示副本编号,ch中已定义宏变量,会自动读取本节点的值
4个节点需要手动去创建分布式表
1 CREATE TABLE table_test_all AS table_test ENGINE = Distributed(test_cdh_ck_cluster, testdb, table_test, rand());
也可以用下面命令直接在集群中创建
1 2 # 需要注意的是这俩不能用as 字段了,需要指定字段 CREATE TABLE table_test_all ON CLUSTER test_cdh_ck_cluster ( label_id UInt32, label_name String, insert_time Date ) ENGINE = Distributed(test_cdh_ck_cluster, testdb, table_test, rand());
说明:
test_cdh_ck_cluster
:集群名称
table_test_all
:分布式表名称
testdb
:数据库名称
table_test
:本地表名称
rand()
:随机分配
我们往分布式表
插入8条
数据
1 2 3 4 5 6 7 8 insert into table_test_all values (1 ,'111' ,'2021-09-11' );insert into table_test_all values (2 ,'222' ,'2021-10-22' );insert into table_test_all values (3 ,'333' ,'2021-10-33' );insert into table_test_all values (4 ,'444' ,'2021-10-44' );insert into table_test_all values (5 ,'555' ,'2021-10-55' );insert into table_test_all values (6 ,'666' ,'2021-10-66' );insert into table_test_all values (7 ,'777' ,'2021-10-77' );insert into table_test_all values (8 ,'888' ,'2021-10-88' );
下面分别登录各节点
查看分布式表
的数据都是8条
Node01-99.28节点
1 2 3 4 :) select count (* ) from table_test_all; ┌─count ()─┐ │ 8 │ └─────────┘
Node02-99.29节点
1 2 3 4 :) select count (* ) from table_test_all; ┌─count ()─┐ │ 8 │ └─────────┘
Node03-99.30节点
1 2 3 4 :) select count (* ) from table_test_all; ┌─count ()─┐ │ 8 │ └─────────┘
Node04-99.21节点
1 2 3 4 :) select count (* ) from table_test_all; ┌─count ()─┐ │ 8 │ └─────────┘
查看各节点的本地表及副本分片的数据。
node01和node03都是分片1的主和副本分片,这里本地表数据肯定是一样的,只是查询出来顺序不一样而已。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # node01-99.28 :) select * from table_test; ┌─label_id─┬─label_name─┬─insert_time─┐ │ 1 │ 111 │ 2021 -09 -11 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 8 │ 888 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 6 │ 666 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 3 │ 333 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ # node03-99.30 :) select * from table_test; ┌─label_id─┬─label_name─┬─insert_time─┐ │ 6 │ 666 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 3 │ 333 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 8 │ 888 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 1 │ 111 │ 2021 -09 -11 │ └──────────┴────────────┴─────────────┘
node02和node04都是分片2的主和副本分片,这里本地表数据肯定是一样的,只是查询出来顺序不一样而已。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # node02-99.29 :) select * from table_test; ┌─label_id─┬─label_name─┬─insert_time─┐ │ 2 │ 222 │ 2021 -10 -22 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 7 │ 777 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 5 │ 555 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 4 │ 444 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ # node04-99.21 :) select * from table_test; ┌─label_id─┬─label_name─┬─insert_time─┐ │ 7 │ 777 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 2 │ 222 │ 2021 -10 -22 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 5 │ 555 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘ ┌─label_id─┬─label_name─┬─insert_time─┐ │ 4 │ 444 │ 1970 -01 -01 │ └──────────┴────────────┴─────────────┘
至此集群就安装成功了。
安装成功后的管理信息 服务启停管理命令
1 2 3 4 $ /etc/init.d/clickhouse-server start $ /etc/init.d/clickhouse-server restart $ /etc/init.d/clickhouse-server stop $ /etc/init.d/clickhouse-server status
终端clickhouse-client命令
连接
1 $ clickhouse-client --port 29000
第三方Gui工具
连接
1 2 连接地址:192.168.99.28:8123 账号密码:default/密码为空
数据目录
日志目录
1 /var/log/clickhouse-server/