ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
官方文档:https://clickhouse.com/docs/zh
下载地址:https://packages.clickhouse.com/rpm/stable/ #稳定版本
或者:https://packages.clickhouse.com/rpm/lts/ #长期支持版
准备篇
操作系统:CentOS-7.x
3台服务器:192.168.21.100,192.168.21.101,192.168.21.128
1、关闭selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
2、关闭防火墙
ClickHouse提供两个网络端口: TCP 默认9000,HTTP 默认8123,建议在内网环境下部署ClickHouse,关闭服务器防火墙。
CentOS-7.x默认使用的是firewall作为防火墙,关闭
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
systemctl mask firewalld
systemctl stop firewalld
yum remove firewalld
3、配置系统打开文件数限制
vi /etc/security/limits.conf #文件句柄数量的配置
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
:wq! #保存退出
vi /etc/security/limits.d/20-nproc.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
:wq! #保存退出
4、安装jdk
zookeeper依赖Java,需要安装java环境,我们使用Java 1.8版本
Linux系统下安装Java JDK:https://www.osyunwei.com/archives/12872.html
5、安装配置zookeeper
clickhouse集群部署依赖zookeeper,需要先安装部署,并且优先于clickhouse启动
Linux系统下部署ZooKeeper集群:https://www.osyunwei.com/archives/13465.html
6、添加hosts解析
vi /etc/hosts #编辑配置文件
192.168.21.100 node1
192.168.21.101 node2
192.168.21.128 node3
:wq! #保存退出
概念篇
ClickHouse集群相关概念
1、副本:集群中的副本是防止数据丢失,增加数据冗余以保证数据的安全,或者实现读写分离。
2、分片:集群中的分片是实现数据的水平切分,单张数据表可能会遇到瓶颈。
如下图,假设ClickHouse的N个节点组成了一个集群,在集群的各个节点上,都有一张结构相同的数据表Y。如果它们的数据完全相同,则它们互为副本(红色部分)。如果N1的Y和N2的Y中的数据完全不同,则N1和N2互为分片(绿色部分)。
分片和集群的使用方法。从数据表的初始形态1分片、0副本开始介绍;接着介绍如何为它添加副本,从而形成1分片、1副本的状态;再介绍如何引入分片,将其转换为多分片、1副本的形态(多副本的形态以此类推),如图下图所示。
3、多分片多副本的情况下,最小需要4 台服务器,实际上如果资源紧张2台机器、3台机器都可以搭建一个 ClickHouse 多分片多副本的集群( 1 台机器只开一个实例)。
4、使用3节点服务器搭建ClickHouse集群,在同一个节点放两个分片的数据,部署为环形架构,第一个分片在第一和第二节点上,第二个分片在第二和第三节点上,第三个分片在第三和第一节点上。
5、ClickHouse 支持每个分片定义一个默认库,在配置文件中对应 default_database,从而使得两个不同的分片在同一节点上,实际是在两个不同的库中,这样就可以实现同一个节点放两个分片的数据。
安装篇
使用3台服务器,部署1分片3副本集群,并验证测试。
1、安装ClickHouse
1.1、安装ClickHouse所需的依赖包
yum install -y libtool *unixODBC*
1.2、分别下载client,static,static-dbg,keeper-dbg和server五个安装包,五个包的版本要一致,这里以23.3.2.37版本为例,把下载的五个包放到/usr/local/src 目录下。
clickhouse-client-23.3.2.37.x86_64.rpm
clickhouse-common-static-23.3.2.37.x86_64.rpm
clickhouse-common-static-dbg-23.3.2.37.x86_64.rpm
clickhouse-server-23.3.2.37.x86_64.rpm
clickhouse-keeper-dbg-23.3.2.37.x86_64.rpm
rpm -ivh *.rpm #安装过程中会提示输入密码,直接回车不设置密码,密码后面我们在配置文件中设置。
1.3、目录说明
/etc/clickhouse-server #服务端的配置文件目录,包括全局配置config.xml和用户配置users.xml等
/etc/clickhouse-client #客户端配置,包括conf.d文件夹和config.xml文件
/var/lib/clickhouse #默认的数据存储目录,建议修改路径到大容量磁盘
/var/log/clickhouse-server #默认保存日志的目录,建议修改路径到大容量磁盘
1.4、新建存储目录
mkdir -p /data/server/clickhouse #数据存储目录
mkdir -p /data/server/clickhouse/log #日志存放目录
修改目录权限:
chown clickhouse:clickhouse /data/server/clickhouse -R
chown clickhouse:clickhouse /data/server/clickhouse/log -R
chmod 755 /data/server/clickhouse -R
chmod 755 /data/server/clickhouse/log -R
1.5、设置数据库密码,默认用户名是:default
cp /etc/clickhouse-server/users.xml /etc/clickhouse-server/users.xml.bak
vi /etc/clickhouse-server/users.xml
<password>123456</password>
:wq! #保存退出
2、修改配置文件
修改3台服务器ClickHouse配置文件 /etc/clickhouse-server/config.xml
cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config.xml.bak #备份
2.1、修改全局配置信息
vi /etc/clickhouse-server/config.xml
<timezone>Asia/Shanghai</timezone> #修改时区
<listen_host>::</listen_host> #开启外部访问
<path>/data/server/clickhouse/</path> #修改数据存放路径,默认是<path>/var/lib/clickhouse</path>
<level>none</level> #不记录日志
<!-- <log>/data/server/clickhouse/log/clickhouse-server.log</log> --> #不记录日志
<!-- <errorlog>/data/server/clickhouse/log/clickhouse-server.err.log</errorlog> --> #不记录日志
<max_open_files>1048576</max_open_files> #文件句柄数量的配置
<http_port>8123</http_port> #http默认端口
<tcp_port>9000</tcp_port> #tcp默认端口
<max_concurrent_queries>4096</max_concurrent_queries> #限制的是活跃查询的数量,是对正在执行或排队等待执行的查询进行限制
<max_connections>4096</max_connections> #限制的是客户端连接的数量,是对同时与 ClickHouse 建立的连接进行限制
:wq! #保存退出
2.2、在 <remote_servers> 标签内配置副本节点信息
<perftest_1shards_3replicas> #分片名称,自定义
<shard>
<internal_replication>true</internal_replication> #只写一个副本,其他副本通过zookeeper进行同步,保证数据一致性
<replica>
<host>192.168.21.100</host>
<port>9000</port>
</replica>
<replica>
<host>192.168.21.101</host>
<port>9000</port>
</replica>
<replica>
<host>192.168.21.128</host>
<port>9000</port>
</replica>
</shard>
</perftest_1shards_3replicas>
2.3、添加zookeeper配置,取消注释修改节点信息
<zookeeper>
<node>
<host>192.168.21.100</host>
<port>2181</port>
</node>
<node>
<host>192.168.21.101</host>
<port>2181</port>
</node>
<node>
<host>192.168.21.128</host>
<port>2181</port>
</node>
</zookeeper>
2.4、添加macros配置,取消注释修改节点信息
<macros>
<shard>01</shard> #分片号3个节点都一样
<replica>192.168.21.100</replica> #副本名称,3个节点不能相同,填写各自的ip地址
</macros>
2.5、启动clickhouse
systemctl start clickhouse-server
systemctl status clickhouse-server
systemctl stop clickhouse-server
systemctl restart clickhouse-server
systemctl enable clickhouse-server
2.6、进入数据库控制台,查看集群信息
clickhouse-client --password
clickhouse-client --host 192.168.21.100 --port=9000
clickhouse-client --host 192.168.21.101 --port=9000
clickhouse-client --host 192.168.21.128 --port=9000
select * from system.clusters;
SELECT * FROM system.zookeeper WHERE path = '/clickhouse';
select * from system.macros;
3、创建数据库
3.1、在其中一个节点上操作,我这里是在192.168.21.100上执行
CREATE DATABASE db_test_01 ON CLUSTER perftest_1shards_3replicas;
3.2、在其他节点查看数据库信息
show databases;
3个节点都有了db_test数据库
4、创建表并写入数据
4.1、在其中一个节点上操作,我这里是在192.168.21.100上执行
CREATE TABLE db_test_01.tb_test_01 ON CLUSTER 'perftest_1shards_3replicas'
(
`id` Int64,
`p` Int16
)
ENGINE = ReplicatedMergeTree( '/clickhouse/tables/{shard}/tb_test_01', '{replica}')
PARTITION BY p
ORDER BY id;
4.2、写入数据,逐条进行操作
INSERT INTO db_test_01.tb_test_01 VALUES(111,111);
INSERT INTO db_test_01.tb_test_01 VALUES(222,222);
INSERT INTO db_test_01.tb_test_01 VALUES(333,333);
INSERT INTO db_test_01.tb_test_01 VALUES(444,444);
4.3、在其他节点查看数据
select * from db_test_01.tb_test_01;
数据已经同步
#注意
zookeeper是用hostname的名称去进行访问的,多网卡多ip,请设置/etc/hosts对应的IP和主机映射信息,
如果主机有多个ip地址,hostname要和zookeeper中设置的ip地址对应,否则数据无法同步。
5、验证集群高可用
5.1、关闭其中一个节点,模式节点宕机,在另外的节点上写入数据
5.2、重新启动节点,查看数据表,发现数据已经同步过来,验证成功
5.3、删除数据库
drop database db_test_01 on cluster perftest_1shards_3replicas;
至此,Linux下ClickHouse集群安装部署完成。