天天看点

在AWS上快速搭建使用clickhouse

作者:ezmsp易云服科技

作者: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架构

在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模式)
在AWS上快速搭建使用clickhouse
  • 选择一个登录EC2的秘钥对(用于登录堡垒机,数据节点等)
在AWS上快速搭建使用clickhouse
  • 选择机型和节点数(机器选型可参考:https://aws.amazon.com/cn/ec2/instance-types/)
在AWS上快速搭建使用clickhouse
  • 输入邮箱(用于获取进度等)
在AWS上快速搭建使用clickhouse
  • 下一步,选择正确的角色
在AWS上快速搭建使用clickhouse
  • 创建,创建过程大概30分钟

2、配置

①LoadBalancer

  • 因为暴露的端口是8123 协议是https并不能用于登录clickhouse
  • 给LB添加9000端口的target group
  • 创建target group:协议:TCP 端口:9000
在AWS上快速搭建使用clickhouse
  • 等待健康检查通过
在AWS上快速搭建使用clickhouse
  • 添加LB listener监听
在AWS上快速搭建使用clickhouse
  • 将数据节点组添加到后端
在AWS上快速搭建使用clickhouse
  • (可选)添加子网组,有时候添加target group后健康检查会有unhealthy:Target is in an Availability Zone that is not enabled for the load balancer
在AWS上快速搭建使用clickhouse
  • 到LB详情中点击右上角action--edit subnets
  • 因为是可用区d所以添加可用区d,保存退出
在AWS上快速搭建使用clickhouse

3、使用

①登录堡垒机

  • 使用keypair登录堡垒机
在AWS上快速搭建使用clickhouse
  • 使用刚才创建集群时候选择的秘钥登录堡垒机
在AWS上快速搭建使用clickhouse
  • 复制ssh 命令
在AWS上快速搭建使用clickhouse

②登录clientadmin

要登录数据库需要从堡垒机登录clientadmin

从堡垒机登录clientadmin

  1. 复制秘钥到堡垒机
  2. 给秘钥400权限(只能400)chmod 400 xx.pem
在AWS上快速搭建使用clickhouse

复制ssh 命令

在AWS上快速搭建使用clickhouse

从堡垒机登录

在AWS上快速搭建使用clickhouse

③连接集群

  • 获取密码:从cloudformation提供的链接获取(堆栈---输出---dbpassword)
在AWS上快速搭建使用clickhouse
  • 点击检索秘钥值获取集群密码
在AWS上快速搭建使用clickhouse
  • 连接集群
clickhouse-client --host=vpc-0e95fc0-Nlb-db51adbxxxx5bb.elb.ap-northeast-2.amazonaws.com --port=9000  --password=S296dxxxxY5rIVWy
aK           
  • Host: cloudformation 创建完成后输出的LB地址
  • User:使用默认default
  • 端口:9000
在AWS上快速搭建使用clickhouse

三、高可用

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行

在AWS上快速搭建使用clickhouse

此时开机node1节点模拟修复node1,登录到node1节点,也是9行

在AWS上快速搭建使用clickhouse

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;           
在AWS上快速搭建使用clickhouse

五、数据迁移

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高可用

  1. 服务发现:ZooKeeper可以用于集群中的节点自动发现和管理。当有新节点加入或节点故障时,ZooKeeper可以通知集群中的其他节点,使得整个集群可以及时地做出相应的响应。
  2. 元数据管理:ClickHouse集群中的元数据通常存储在ZooKeeper中。包括表结构、分片信息、索引信息等。当元数据发生变化时,ZooKeeper会通知各个节点更新元数据,保证整个集群的一致性。
  3. 分布式锁:ZooKeeper提供了分布式锁的功能,可以帮助ClickHouse集群协调和控制访问共享资源的并发性。例如,当需要对某个表进行结构变更时,可以使用ZooKeeper提供的分布式锁来保证只有一个节点在进行表结构变更,避免了并发操作造成的问题。

1.高可用测试

①模拟宕机一个zk节点:数据正常写入

在AWS上快速搭建使用clickhouse

②模拟宕机两个zk节点:数据库变为只读,无法写入数据

在AWS上快速搭建使用clickhouse

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

继续阅读