目录
3.3配置sudo、NetworkManager、firewalld、selinux
1.clickhouse数据库安装说明
clickhouse提供了集群机制支持,集群有两种实现方式,一是数据副本,即全量数据冗余到另外的机器,提供高可用保证。二是分布式表,即以表为单位将数据分散到多个节点上保存,用以解决单机存储不足问题。
生产环境通常使用数据副本架构,确保数据安全与生产业务的高可用性;对于分布式表,由于数据分布在多个节点,查询可能从多节点获取数据再组合加工,因网络延时等原因查询效率相对较低,也有数据不一致的风险,适用场景较少。
部署clickhouse采用数据副本架构,2台机器作为clickhouse专用服务器,即2个节点保存相同数据;3台机器部署zookeeper集群,为clickhouse数据同步提供服务。因zookeeper对数据延迟非常敏,而clickhouse数据库可能占用所用可用的系统资源,所以强烈推荐生产环境zookeeper与clickhouse使用不同的服务器部署,或者已有zookeeper集群且未超载的情况下,复用现有的zookeeper。
部署clickhouse所需服务器资源配置如下表,生产环境根据实际业务量调整资源配置,推荐使用SSD存储设备。
服务器名 | ip | 操作系统 | cpu | 内存 | 用途1 | 用途2 |
ch01 | 10.82.88.182 | CentOS Linux release 7.9 | 8c | 16G | clickhouse集群 | zookeeper集群 |
ch02 | 10.82.88.183 | CentOS Linux release 7.9 | 8c | 16G | clickhouse集群 | zookeeper集群 |
ch03 | 10.82.88.184 | CentOS Linux release 7.9 | 8c | 16G |
| zookeeper集群 |
2.clickhouse数据库安装介质
官方预构建的二进制文件通常针对x86_64进行编译,并利用SSE 4.2指令集,检查当前CPU是否支持SSE 4.2的命令。
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
服务器CPU检查通过,选择RPM包进行安装,数据库版本使用更加稳定的最新的LTS(Long Term Support)版本 22.8,下载以下3个安装包。
https://packages.clickhouse.com/rpm/stable/
clickhouse-common-static-22.8.9.24.x86_64.rpm
clickhouse-client-22.8.9.24.x86_64.rpm
clickhouse-server-22.8.9.24.x86_64.rpm
3.clickhouse数据库安装前配置
3.1配置操作系统yum源(可选)
通常操作系统以最小化方式安装,配置yum源可以为后续安装软件提供很大的便利。yum源推荐使用内网环境提供的地址,若无法获得,则挂载操作系统安装盘,配置本地yum源。注意yum源需要和操作系统版本相同,安装使用的操作系统为CentOS Linux release 7.9.2009,配置本地yum源操作如下。
挂载光盘文件 CentOS-7-x86_64-Everything-2009.iso,编辑repo文件,注意 "/run/media/root/CentOS\ 7\ x86_64" 替换为对应的挂载路径。
cat >/etc/yum.repos.d/Centos7_local.repo <<EOF
[CentOS7]
name=CentOS-server
baseurl=file:///run/media/root/CentOS\ 7\ x86_64
enabled=1
gpgcheck=0
EOF
3.2配置NTP客户端
根据现网使用的实际ntp server进行调整。
ip=xxx.xxx.xxx.xxx
ntpdate $ip
sed -i "s/server 3.centos.pool.ntp.org/server $ip/g" /etc/chrony.conf
sed -i "s/server 0.centos.pool.ntp.org/#server 0.centos.pool.ntp.org/g" /etc/chrony.conf
sed -i "s/server 1.centos.pool.ntp.org/#server 0.centos.pool.ntp.org/g" /etc/chrony.conf
sed -i "s/server 2.centos.pool.ntp.org/#server 0.centos.pool.ntp.org/g" /etc/chrony.conf
systemctl enable chronyd
systemctl start chronyd
systemctl status chronyd
3.3配置sudo、NetworkManager、firewalld、selinux
echo "clickhouse ALL=(ALL) NOPASSWD: /bin/su - root" >> /etc/sudoers
systemctl disable NetworkManager
systemctl stop NetworkManager
systemctl disable firewalld
systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3.4创建用户
新建用户,替换命令中的密码,进行密码设置。
groupadd clickhouse
useradd -g clickhouse clickhouse
echo "umask 022" >> /home/clickhouse/.bash_profile
echo "xxxx" | passwd --stdin clickhouse
3.5修改系统参数与限制
cat >> /etc/security/limits.conf << EOF
* soft nproc 65536
* hard nproc 65536
* soft nofile 655360
* hard nofile 655360
EOF
3.6修改主机名称与host文件
根据实际情况修改主机名,3台机器分别执行:
hostnamectl set-hostname ch01
hostnamectl set-hostname ch02
hostnamectl set-hostname ch03
cat >> /etc/hosts << EOF
10.82.88.182 ch01
10.82.88.183 ch02
10.82.88.184 ch03
EOF
每台机器的名称和IP映射关系都需要写入到host文件中,zookeeper集群机器IP信息也需要写入到host文件。
3.7关闭透明大页、调整CPU固定高频、关闭SWAP
查看是否使用透明大页
cat /sys/kernel/mm/transparent_hugepage/enabled
查看CPU频率策略
cpupower frequency-info --policy
a.执行 tuned-adm list 命令查看当前操作系统的 tuned 策略。
b.创建新的 tuned 策略。
mkdir /etc/tuned/balanced-ch-optimal/
cat > /etc/tuned/balanced-ch-optimal/tuned.conf <<EOF
[main]
include=balanced
[cpu]
governor=performance
[vm]
transparent_hugepages=never
EOF
c.应用新的 tuned 策略。
tuned-adm profile balanced-ch-optimal
修改后检查:
cat /sys/kernel/mm/transparent_hugepage/enabled
cpupower frequency-info --policy
关闭swap
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p
调整内存分配策略
echo 0 | sudo tee /proc/sys/vm/overcommit_memory
至此,完成操作系统相关设置,下一章节进行数据库安装。
4. clickhouse数据库安装
数据库集群部署在节点ch01 (10.82.88.182)与ch02(10.82.88.183),需要在两个节点均执行以下操作。
4.1创建目录
创建clickhouse日志目录与数据文件目录,可根据实际情况调整。
mkdir -p /opt/clickhouse_logs
mkdir -p /opt/clickhouse
chown -R clickhouse:clickhouse /opt/clickhouse_logs
chown -R clickhouse:clickhouse /opt/clickhouse
4.2安装数据库软件
上传安装包,检查安装包md5值
md5sum clickhouse-common-static-22.8.9.24.x86_64.rpm
f3c6bb13102ca5418b778b9f6ce7c3bf clickhouse-common-static-22.8.9.24.x86_64.rpm
md5sum clickhouse-client-22.8.9.24.x86_64.rpm
44bfe6eb388905c2037ce3e6717b3e4c clickhouse-client-22.8.9.24.x86_64.rpm
md5sum clickhouse-server-22.8.9.24.x86_64.rpm
c1acc4debcc1fab2ee0257b8689d140a clickhouse-server-22.8.9.24.x86_64.rpm
依次执行
rpm -ivh clickhouse-common-static-22.8.9.24.x86_64.rpm
rpm -ivh clickhouse-client-22.8.9.24.x86_64.rpm
rpm -ivh clickhouse-server-22.8.9.24.x86_64.rpm
在安装clickhouse-server-22.8.9.24.x86_64.rpm时需要输入数据库用户default的密码,请输入并记住密码,后续登录数据库需要使用。
至此,完成数据库软件安装。
数据库的默认配置文件目录是 /etc/clickhouse-server
默认日志目录是 /var/log/clickhouse-server/
默认数据文件目录是 /var/lib/ clickhouse
默认提供sytemclt启停,先不启动数据库,编辑配置文件后再启动数据库,数据库在启动时会自动初始化。
4.3编辑配置文件
clickhouse安装后生成两个配置文件,/etc/clickhouse-server/ config.xml 服务器级配置文件;/etc/clickhouse-server/ users.xml 用户级配置文件。
4.3.1编辑 /etc/clickhouse-server/config.xml
可以使用vi /etc/clickhouse-server/config.xml 修改文件,或者使用sed命令,注意本文件属性为只读,vi保存时需要使用 wq!
(1)允许远程访问
<!-- <listen_host>::</listen_host> --> 去掉注释。
sed -i 's/<!-- <listen_host>::<\/listen_host> -->/<listen_host>::<\/listen_host>/g' /etc/clickhouse-server/config.xml
修改后入下图:
(2)interserver_http_host去掉注释,修改为本机IP,注意两节点IP不相同。
修改前:
<!--
<interserver_http_host>example.clickhouse.com</interserver_http_host>
-->
修改后ch01节点如下图:
修改后ch02节点如下图:
(3)启用zookeeper
找到zookeeper相关内容,修改前如下图:
zookeeper相关内容默认处于注释状态,使用zookeeper则要去掉注释,并且修改host中example1,example2,example3分别为zookeeper集群3个节点的IP(10.82.88.182/183/184)。修改后如下图:
(4)启用宏(macros)
找到macros相关内容,修改前如下图:
macros相关内容默认处于注释状态,使用macros则去掉注释;修改example01-01-1为本节点的主机名,不同节点值不同,比如节点ch01把example01-01-1修改为ch01,节点ch02把example01-01-1修改为ch02。
ch01节点修改后如下图:
ch02节点修改后如下图:
(5)修改目录
日志默认路径是 /var/log/clickhouse-server ,修改为/opt/clickhouse_logs,根据实际情况修改。
数据默认路径是 /var/lib/clickhouse ,修改为/opt/clickhouse,可根据实际情况修改。
修改命令:
sed -i 's/\/var\/log\/clickhouse-server/\/opt\/clickhouse_logs/g' /etc/clickhouse-server/config.xml
sed -i 's/\/var\/lib\/clickhouse/\/opt\/clickhouse/g' /etc/clickhouse-server/config.xml
4.3.2编辑 /etc/clickhouse-server/user.xml
以下参数需要调优,具体参数值根据实际情况进行调整。
background_pool_size :后台线程数,默认16,建议调整为cpu逻辑线程数的2倍(cpu逻辑线程数cat /proc/cpuinfo |grep processor|wc -l)。
background_distributed_schedule_pool_size :分布式后台任务线程数,默认16,建议改成cpu个数的2倍(线程数)。
max_memory_usage :单次查询可使用的内存最大值,clickhouse数据库专用服务器可以设置为服务器内存的60%以上。
max_memory_usage_for_all_queries : 所有查询可使用的内存最大值,建议与 max_memory_usage 相同。
max_bytes_before_external_group_by :group by 内存量使用量,建议设置为 max_memory_usage的一半,当group by使用内存超过设置值后会使用磁盘进行排序。
max_bytes_before_external_sort : order by 内存使用量,建议与max_bytes_before_external_group_by相同,当order by使用内存超过设置值后会使用磁盘进行排序。
执行如下命令:
sed -i '/<load_balancing>/i\ <max_memory_usage>10737418240</max_memory_usage>' /etc/clickhouse-server/users.xml
sed -i '/<load_balancing>/i\ <max_memory_usage_for_all_queries>10737418240</max_memory_usage_for_all_queries>' /etc/clickhouse-server/users.xml
sed -i '/<load_balancing>/i\ <max_bytes_before_external_group_by>5368709120</max_bytes_before_external_group_by>' /etc/clickhouse-server/users.xml
sed -i '/<load_balancing>/i\ <max_bytes_before_external_sort>5368709120</max_bytes_before_external_sort>' /etc/clickhouse-server/users.xml
sed -i '/<load_balancing>/i\ <background_pool_size>16</background_pool_size>' /etc/clickhouse-server/users.xml
sed -i '/<load_balancing>/i\ <background_distributed_schedule_pool_size>16</background_distributed_schedule_pool_size>' /etc/clickhouse-server/users.xml
增加default用户访问权限
sed -i 's/<!-- <access_management>1<\/access_management> -->/<access_management>1<\/access_management>/g' /etc/clickhouse-server/users.xml
执行后如下图:
4.4启动数据库
zookeeper启动后方可启动clickhouse数据库,若还未安装zookeeper集群,请先安装并启动。zookeeper安装部署请参见第5章。
systemclt 相关命令如下:
systemctl start clickhouse-server
systemctl stop clickhouse-server
systemctl restart clickhouse-server
systemctl status clickhouse-server
clickhouse-client登录命令:
clickhouse-client --host 10.82.88.182 -m --password xxxx
4.5创建数据副本表
副本的目的是保障数据的高可用。当一台clickhouse节点宕机了,可以从其他备份服务器获得相同的数据。clickhosue只有MergeTree系列的表引擎可以支持副本。针对MergeTree系列的表引擎,clickhouse都提供了对应的Replicated*MergeTree表引擎来支持数据副本。
clickhouse的数据副本机制是表级别的,也就是说只针对表进行复制,一个数据库中可以同时包含复制表和非复制表。副本机制对于select查询是没有影响的,查询复制表和非复制表的速度是一样的。而写入数据时,clickhouse的集群没有主从之分,大家都是平等的。只不过配置了复制表后,insert以及alter操作会同步到对应的副本机器中。
搭建两节点clickhouse,通过zk进行数据同步,创建库表的操作需要在两节点执行。分别登录到两节点创建数据库和表,执行如下语句。
create database test;
use test;
create table t_stock(id UInt32,sku_id String,total_amount decimal(16, 2),create_time datetime) engine = ReplicatedMergeTree('/clickhouse/tables/test/t_stock','{replica}') primary key id ;
建表语句语法:
create table table_name(...) engine=ReplicatedMergeTree('zoo_path','replica_name')
引擎使用 ReplicatedMergeTree ,zoo_path为 /clickhouse/tables/test/t_stock ,是ZooKeeper中该表的路径 ; replica_name为 {replica} ,是ZooKeeper 中的该表的副本名称。
复制表路径必须一致,"/clickhouse/tables"为固定前缀,"test"是库名,"t_stock"是表名
副本名称必须不相同,所以使用宏 {replica},创建时匹配配置文件中的值。
在某个节点写入数据,数据会自动同步到另外一个节点。
insert into t_stock values(1,'10000',2000,'2022-12-12');
如果删除表drop table 需要加sync。
drop table t_stock sync;
4.6创建分布式表
完成步骤4.1-4.4后,编辑配置文件/etc/clickhouse-server/config.xml,使用分布式表。找到config.xml中 remote_servers 部分,删除<remote_servers> </remote_servers>之间所有内容,加入以下内容。
<bigdata>
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>10.82.88.182</host>
<port>9000</port>
<user>default</user>
<password>xxx</password>
</replica>
</shard>
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>10.82.88.183</host>
<port>9000</port>
<user>default</user>
<password>xxx</password>
</replica>
</shard>
</bigdata>
<host>10.82.88.182</host>为clickhouse的IP,根据实际情况修改,<port>9000<port>,<user>default</user>是数据库用户,<password>xxx</password>是安装rpm包时输入的密码。配置了2个分片,分别节点为10.82.88.182和10.82.88.183,权重相等都是1,若有更多分片,可以再此基础上增加。每个节点均进行相同配置,然后重启数据库
登录到任意一台数据库,执行语句创建库表,语句使用“on cluster saxo”,在每个分片节点创建相同的库表,t_stock_local为本地表,是数据实际存储位置;t_stock_distributed为分布式表,是本地表的映射表。
分布式表中ENGINE = Distributed(saxo,test02,t_stock_local,hiveHash(sku_id)),saxo为集群名称,test02为数据库名,t_stock_local为本地表名,hiveHash(sku_id)分片键。
create database test02 on cluster saxo;
use test02;
CREATE TABLE t_stock_local on cluster saxo
(
id UInt32,
sku_id String,
total_amount Decimal(16, 2),
create_time DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY (id, sku_id);
CREATE TABLE t_stock_distributed on cluster saxo
(
id UInt32,
sku_id String,
total_amount Decimal(16, 2),
create_time DateTime
)
ENGINE = Distributed(saxo,test02,t_stock_local,hiveHash(sku_id));
insert into t_stock_distributed values (1,101,1000,'2022-12-08');
insert into t_stock_distributed values (2,102,1000,'2022-12-08');
insert into t_stock_distributed values (3,103,1000,'2022-12-08');
insert into t_stock_distributed values (4,104,1000,'2022-12-08');
insert into t_stock_distributed values (5,105,1000,'2022-12-08');
insert into t_stock_distributed values (6,106,1000,'2022-12-08');
insert into t_stock_distributed values (7,107,1000,'2022-12-08');
insert into t_stock_distributed values (8,108,1000,'2022-12-08');
insert into t_stock_distributed values (9,109,1000,'2022-12-08');
insert into t_stock_distributed values (10,110,1000,'2022-12-08');
insert into t_stock_distributed values (11,111,1000,'2022-12-08');
insert into t_stock_distributed values (12,112,1000,'2022-12-08');
往分布式表t_stock_distributed中写入数据,其他分片节点查询t_stock_distributed获取全量数据,同时查询到本地表t_stock_local只包含部分数据。
5. zookeeper集群安装
zookeeper集群安装节点为10.82.88.182、10.82.88.183、10.82.88.184,需要在3个节点均执行创建目录,安装软件、编辑配置文件、创建用户、启动集群等操作。
5.1安装要求
clickhouse要求zookeeper版本不低于3.4.5,下载最新稳定版本 apache-zookeeper-3.7.1-bin.tar.gz。下载链接:
https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
zookeeper需要JDK环境支持,自行安装一个jdk8即可
5.2创建目录
mkdir /opt/zookeeper/
mkdir -p /opt/zookeeper/cluster_clickhouse/data
mkdir -p /opt/zookeeper/cluster_clickhouse/log
5.3 安装zookeeper,编辑配置文件
tar -xvf apache-zookeeper-3.7.1-bin.tar.gz
mv apache-zookeeper-3.7.1-bin /opt/zookeeper/zookeeper-3.7.1
根据clickhouse官方推荐,调整zookeeper相关参数
cat > /opt/zookeeper/zookeeper-3.7.1/conf/zoo.cfg << EOF
dataDir=/opt/zookeeper/cluster_clickhouse/data/
dataLogDir=/opt/zookeeper/cluster_clickhouse/log/
clientPort=2181
tickTime=2000
initLimit=30000
syncLimit=10
maxClientCnxns=2000
maxSessionTimeout=60000000
autopurge.snapRetainCount=10
autopurge.purgeInterval=1
preAllocSize=131072
snapCount=3000000
server.1=10.82.88.182:2888:3888
server.2=10.82.88.183:2888:3888
server.3=10.82.88.184:2888:3888
EOF
节点ch01执行
echo 1 > /opt/zookeeper/cluster_clickhouse/data/myid
节点ch02执行
echo 2 > /opt/zookeeper/cluster_clickhouse/data/myid
节点ch03执行
echo 3 > /opt/zookeeper/cluster_clickhouse/data/myid
5.4 创建 zookeeper 用户
groupadd zookeeper
useradd -g zookeeper zookeeper
echo "umask 022" >> /home/zookeeper/.bash_profile
echo "xxxx" | passwd --stdin zookeeper
echo "zookeeper ALL=(ALL) NOPASSWD: /bin/su - root" >> /etc/sudoers
chown -R zookeeper:zookeeper /opt/zookeeper
5.5 启动zookeeper集群
三台机器分别执行su - zookeeper
/opt/zookeeper/zookeeper-3.7.1/bin/zkServer.sh start
启动完成后查看状态
/opt/zookeeper/zookeeper-3.7.1/bin/zkServer.sh status
应为1个leader,2个follower
集群启停命令
/opt/zookeeper/zookeeper-3.7.1/bin/zkServer.sh start
/opt/zookeeper/zookeeper-3.7.1/bin/zkServer.sh stop
/opt/zookeeper/zookeeper-3.7.1/bin/zkServer.sh restart
/opt/zookeeper/zookeeper-3.7.1/bin/zkServer.sh status