作者:ezmsp易云服科技公有云架构师陈博文
一、前言
1、简介
- ClickHouse是一个开源的列式数据库管理系统,旨在处理大量数据,特别是用于在线分析(OLAP)任务。它是一个快速、高效、可扩展的数据库,可以在大规模数据集上快速执行复杂的查询。
- ClickHouse的设计目标是快速处理PB级别的数据,它可以在秒级别内处理数十亿行数据。它使用了列式存储,这意味着它可以仅读取需要的列,从而减少了IO操作。此外,它还使用了压缩算法,可以在磁盘上存储更多的数据。
- ClickHouse支持SQL查询语言,并提供了许多高级功能,例如数据分区、数据压缩、异步复制和分布式查询。它还可以与其他工具和框架集成,例如Apache Spark、Kafka和Elasticsearch等。
- ClickHouse的架构是分布式的,可以在多个节点上运行,从而实现高可用性和容错性。它可以水平扩展,以处理更大的数据集和更高的负载。
2、如何在云上快速的搭建自己的clickhouse并投入到生产工作中
- AWS CloudFormation是一种基于模板的服务,可以快速、自动化地创建和管理AWS资源。它允许用户使用JSON或YAML模板来描述所需的AWS资源和它们之间的关系,然后使用此模板来创建、更新和删除资源栈。
- 在搭建ClickHouse时,可以使用AWS CloudFormation来自动化创建和管理所需的AWS资源。首先通过aws官方提供的CloudFormation模板,描述所需的AWS资源,例如EC2实例、安全组、IAM角色等。然后,使用此模板来创建一个CloudFormation堆栈。CloudFormation将根据模板中的定义自动创建、配置和启动所需的AWS资源。
3、aws clickhouse架构
二、部署
1、使用cloudformation创建基础架构
部署完会生成
- LinuxBastion (堡垒机)
- ZookeeperNode (zk节点)
- Clickhouse Node (ck数据节点)
- ClickHouseAdminClient (ck管理节点)
①在vpc中创建
#堆栈模板地址
https://aws-quickstart.s3.amazonaws.com/quickstart-clickhouse-cluster/templates/clickhouse-entrypoint-existing-vpc.template.yaml
- 选择 VPC和子网,根据VPC填写正确网段(本案例选择的已存在vpc模式)
- 选择一个登录EC2的秘钥对(用于登录堡垒机,数据节点等)
- 选择机型和节点数(机器选型可参考:https://aws.amazon.com/cn/ec2/instance-types/)
- 输入邮箱(用于获取进度等)
- 下一步,选择正确的角色
- 创建,创建过程大概30分钟
2、配置
①LoadBalancer
- 因为暴露的端口是8123 协议是https并不能用于登录clickhouse
- 给LB添加9000端口的target group
- 创建target group:协议:TCP 端口:9000
- 等待健康检查通过
- 添加LB listener监听
- 将数据节点组添加到后端
- (可选)添加子网组,有时候添加target group后健康检查会有unhealthy:Target is in an Availability Zone that is not enabled for the load balancer
- 到LB详情中点击右上角action–edit subnets
- 因为是可用区d所以添加可用区d,保存退出
3、使用
①登录堡垒机
- 使用keypair登录堡垒机
- 使用刚才创建集群时候选择的秘钥登录堡垒机
- 复制ssh 命令
②登录clientadmin
要登录数据库需要从堡垒机登录clientadmin
从堡垒机登录clientadmin
- 复制秘钥到堡垒机
- 给秘钥400权限(只能400)chmod 400 xx.pem
复制ssh 命令
从堡垒机登录
③连接集群
- 获取密码:从cloudformation提供的链接获取(堆栈—输出—dbpassword)
- 点击检索秘钥值获取集群密码
- 连接集群
clickhouse-client --host=vpc-0e95fc0-Nlb-db51adbxxxx5bb.elb.ap-northeast-2.amazonaws.com --port=9000 --password=S296dxxxxY5rIVWy
aK
- Host: cloudformation 创建完成后输出的LB地址
- User:使用默认default
- 端口:9000
三、高可用
1、测试断开node1,然后插入数据
①表
CREATE TABLE if not exists default.city_local9 on cluster default
(
`id` Int64,
`city_code` Int32,
`city_name` String,
`total_cnt` Int64,
`event_time` DateTime
)
Engine=ReplicatedMergeTree()
PARTITION BY toYYYYMMDD(event_time)
ORDER BY id;
②验证
- 此时登录node2节点(node1已关机)
- 插入5条数据
#4条
insert into default.city_local9 (id, city_code, city_name, total_cnt, event_time) values (9, 2000, 'guangzhou', 420000, '2022-02-21 00:00:
00');
insert into default.city_local9 (id, city_code, city_name, total_cnt, event_time) values (10, 3000, 'guangzhou', 420000, '2022-02-21 00:00
:00');
insert into default.city_local9 (id, city_code, city_name, total_cnt, event_time) values (7, 100000, 'huizhou', 75001, '2022-02-25 00:00:
00')
insert into default.city_local9 (id, city_code, city_name, total_cnt, event_time) values (8, 1000, 'guangzhou', 420000, '2022-02-21 00:00
:00');
#5条一共9条
insert into default.city_all9 (id, city_code, city_name, total_cnt, event_time) values (1, 4000, 'guangzhou', 420000, '2022-02-21 00:00:00'),(2, 5000, 'shenzhan', 55000, '2022-02-22 00:00:00'),(3, 6000, 'huizhou', 65000, '2022-02-23 00:00:00'),(4, 7000, 'huizhou', 75000, '2022-02-24 00:00:00'),(5, 8000, 'huizhou', 75001, '2022-02-25 00:00:00');
node2节点city_all9 查询表结果9行
此时开机node1节点模拟修复node1,登录到node1节点,也是9行
2、结论
两节点但副本情况下ReplicatedMergeTree()引擎的表在节点恢复后会自动将恢复节点的数据同步。
四、横向扩容
1、创建节点(使用EC2)
创建一个新的node节点
- NAME:ClickHouseNode3
- 机型:和集群其它节点一样(创建集群时候如果默认是m5.xlarge)
- 秘钥对:选择创建集群时候的keypair
- 镜像:Amazon Linux 2(同原来集群节点)
- VPC:在 中选择现有的 ClickHouse 集群 VPC Network
- 子网:选择同原来集群节点相同子网
- 安全组:选择StackName-ClickHouseClusterStack-***在IAM role(与集群相同)
- 磁盘:EBS,/dev/sdh,500G,gp2(同原来集群节点)
2、添加节点
#登录新的节点 node3
sudo su
yum update -y
mkfs.xfs /dev/sdh
mkdir -p /home/clickhouse/data
mount /dev/sdh /home/clickhouse/data
echo "/dev/sdh /home/clickhouse/data xfs defaults 0 0" >> /etc/fstab
adduser clickhouse
usermod -G clickhouse clickhouse
mkdir -p /home/clickhouse/data
mkdir /home/clickhouse/data/format_schemas/
mkdir /home/clickhouse/data/access/
mkdir /home/clickhouse/data/user_files/
mkdir /home/clickhouse/data/tmp/
mkdir /home/clickhouse/data/log/
mkdir /home/clickhouse/data/clickhouse-data/
chown -R clickhouse.clickhouse /home/clickhouse/
rm -rf /var/log/clickhouse-server/
ln -s /home/clickhouse/data/log/ /var/log/clickhouse-server
yum install yum-utils
rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64
yum install clickhouse-server-21.4.5.46-2 clickhouse-client-21.4.5.46-2 -y
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 131072" >> /etc/security/limits.conf
echo "* hard nproc 131072" >> /etc/security/limits.conf
- 将以下脚本从 ClickHouseNode1 复制到 ClickHouseNode3(新) 。/etc/clickhouse-server/users.xml/etc/clickhouse-server/config.xml/etc/clickhouse-server/config.d/storage.xml/etc/clickhouse-server/config.d/macros.xml
- 修改所有节点的/etc/clickhouse-server/metrika.xml
...
</shard>
<!--添加新的节点进来-->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>nodeip</host>
<port>9000</port>
<user>default</user>
<password>ZPNzXK9MU4j42c2yGvUY</password>
</replica>
</shard>
...
- 在 ClickHouseNode3 上编辑/etc/clickhouse-server/config.d/macros.xml。
<yandex>
<macros>
<!-- 从01-01-01改为01-02-01-->
<replica>cluster01-02-01</replica>
<shard>01</shard>
<layer>01</layer>
</macros>
</yandex>
- 更新目录权限
chown -R clickhouse.clickhouse /home/clickhouse/
chown -R clickhouse.clickhouse /etc/clickhouse-server/
- 重启所有服务
systemctl stop clickhouse-server
systemctl start clickhouse-server
systemctl status clickhouse-server
3、验证
#登录clickhoues查询节点数
SELECT count(*) FROM system.clusters;
五、数据迁移
1、导出建表语句
#---list库---
clickhouse-client --host=cc-0xi41xxxxxxw35.public.clickhouse.ads.aliyuncs.com --port=3306 --user=cbw --password=Axxx111 --query="SHOW databases" > database.list
#---list表---
clickhouse-client --host=cc-0xi41xxxxxxw35.public.clickhouse.ads.aliyuncs.com --port=3306 --user=cbw --password=Aa111111 --query="SHOW tables" > table.list
#---建表DDL---
clickhouse-client --host=cc-0xi41xxxxxxw35.public.clickhouse.ads.aliyuncs.com --port=3306 --user=cbw --password=Axxx111 --query="SHOW CREATE TABLE default.city_local8" > table.sql
问题:
- 导出的建表语句包含换号符:n,导入时候无法识别符号”
- 导出的建表语句不包含on cluster <clustername>,导入时无法在集群所有节点上创建表
解决
- 将导出的建表语句的’n’换行符删除
- 手动添加 on cluster <clustername>
#--导入建表--
clickhouse-client --host=vpc-0e95f1ee9c0-Nlb-db51xxxxd95bb.elb.ap-northeast-2.amazonaws.com --port=9000 --password=S296dxxxxxIVWyaK < table.sql
2、导入数据
①导出导入csv格式数据
1、导出导入csv格式数据
#导出csv
clickhouse-client --host=cc-0xi4166qxxxxx5.public.clickhouse.ads.aliyuncs.com --port=3306 --user=cbw --password=Axxx111 --query="select * from default.city_local8 FORMAT CSV" > table.csv
#导入csv
clickhouse-client --host=vpc-0e95f1xxx49c0-Nlb-db51axxxx1d95bb.elb.ap-northeast-2.amazonaws.com --port=9000 --password=S296xxxxxrIVWyaK --query="insert into default.city_local8 FORMAT CSV" < table.csv
#管道方法
clickhouse-client --host="<old host>" --port="<old port>" --user="<user name>" --password="<password>" --query="select * from <database_name>.<table_name> FORMAT CSV" |
clickhouse-client --host="<new host>" --port="<new port>" --user="<user name>" --password="<password>" --query="INSERT INTO <database_name>.<table_name> FORMAT CSV"
②remote函数导入(需要专线,阿里云clickhouse添加白名单)
insert into default.city_local8 select * from remote('cc-0xi41xxxx056w35.public.clickhouse.ads.aliyuncs.com:3306', default.city_local8, 'cbw', 'Axxx111');
六、Zookeeper高可用
- 服务发现:ZooKeeper可以用于集群中的节点自动发现和管理。当有新节点加入或节点故障时,ZooKeeper可以通知集群中的其他节点,使得整个集群可以及时地做出相应的响应。
- 元数据管理:ClickHouse集群中的元数据通常存储在ZooKeeper中。包括表结构、分片信息、索引信息等。当元数据发生变化时,ZooKeeper会通知各个节点更新元数据,保证整个集群的一致性。
- 分布式锁:ZooKeeper提供了分布式锁的功能,可以帮助ClickHouse集群协调和控制访问共享资源的并发性。例如,当需要对某个表进行结构变更时,可以使用ZooKeeper提供的分布式锁来保证只有一个节点在进行表结构变更,避免了并发操作造成的问题。
1.高可用测试
①模拟宕机一个zk节点:数据正常写入
②模拟宕机两个zk节点:数据库变为只读,无法写入数据
2.如何查看集群信息
- 使用mntr,修改配置文件开启mntr
vim /usr/local/apache-zookeeper-3.5.10-bin/conf/zoo.cfg
...
#添加mntr工具
4lw.commands.whitelist=mntr
...
#重启zk
/usr/local/apache-zookeeper-3.5.10-bin/bin/zkServer.sh restart
#查看集群信息
echo mntr | nc localhost 2181
zk_version 3.5.10-a32c7183d42325b03e44a06aade6a0f16955bf13, built on 05/29/2022 12:50 GMT
zk_avg_latency 0
zk_max_latency 10
zk_min_latency 0
zk_packets_received 7601
zk_packets_sent 7600
#连接数
zk_num_alive_connections 5
zk_outstanding_requests 0
zk_server_state leader
zk_znode_count 250
zk_watch_count 20
zk_ephemerals_count 16
zk_approximate_data_size 42922
zk_open_file_descriptor_count 65
zk_max_file_descriptor_count 65536
#节点数
zk_followers 1
zk_synced_followers 1
zk_pending_syncs 0
zk_last_proposal_size 32
zk_max_proposal_size 452
zk_min_proposal_size 32
#查看节点角色
/usr/local/apache-zookeeper-3.5.10-bin/bin/zkServer.sh status
/usr/local/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.5.10-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
——————————————————————————————————————————————
参考文档:
1、部署:
https://aws-quickstart.github.io/quickstart-clickhouse-cluster
2、横向扩容:
https://catalog.us-east-1.prod.workshops.aws/workshops/22377ab3-e5d8-496d-b8be-20a63668daf0/en-US/scaleout