使用 cloudformation 部署 clickhouse on aws 架构

我们将使用cloudformation模板配置以下资源:
分层存储。单节点,2分片2副本,4分片2副本,10分片2副本。如果您选择单节点,将会在1个节点上部署所以内容,如果您选择2分片2副本,将创建4台clickhouse节点+3台zookeeper节点+1台DW admin实例+1台堡垒机实例chproxy (实现clickhouse读写分离,负载路由,查询缓存)Prometheus (实现clickhouse集群监控,他将监听并存储clickhouse各节点clickhouse_exporter和node_exporter的实时状态数据)Grafana (3000端口对外服务,用于clickhouse SQL Tools和Prometheus监控可视化)demosize参数创建表并加载数据,demosize:大 中 小 分别对应 500m/5g/50gAmazonSSMManagedInstanceCore权限以满足PVRE合规要求,请放心食用如果您是一个人使用自己的AWS账户或是使用PSA导师发送的AWS Event Engine账号进行实验,建议您使用cloudformation启动环境。而如果您是多人使用同一账户的不同IAM User进行实验,建议您手动搭建环境进行实验,并在必要时明确区别您和他人的资源命名,例如在任何资源名后加入-user1。
1.使用有效凭证登录AWS控制台
2.选择AWS区域。 此实验室的首选区域是us-west-1。
| 账户所属 | 实验模板 |
|---|---|
| 海外区域账户 | ![]() |
3.等待cloudformation供应所有资源。 大约需要35分钟才能完成执行
4.cloudformation部署成功,包含5个内嵌stack,主stack为ClickHouseOnAWS

5.点击ClickHouseOnAWS进入output,即可查看您可访问的多个URL,其中您的公网入口为Grafana的URL,他将允许您在参数中定义的AccessCIDR访问。

在您的任意浏览器输出访问output的URL,这是一个ELB负载均衡器,后面连接至EKS 集群内的各个odoo Pod的地址,例如http://ec2-54-177-167-204.us-west-1.compute.amazonaws.com:3000/
输入您的默认密码,默认用户名密码为admin/admin,成功之后Grafana将提示您修改初始密码,点击跳过或更改密码后获得以下界面

现在我们点击右侧的小齿轮configuration—》Data Source,以便配置Prometheus的DataSource
1,选择Add data source

2,选择Prometheus,完成DataSource的配置
输入您在Cloudformation output中得到的Prometheus URL,点击添加,完成配置
3,选择右侧的小加号,点击import

4,添加clickhouse的监控dashboard
比较简单的方式是您可以在Import via grafana.com填入clickhouse流行的dashboard,例如882 或者12163或10483
您也可以下载或自己编写dashboard的json进行上传

5,为dashboard选择您刚刚创建的DataSource

6,点击完成后,您将看到集群的监控状态

1,同样点击右侧的小齿轮configuration—》Data Source,这里选择clickhouse

2,输入您在Cloudformation output中得到的CHproxy URL
3,在Auth选项中打开Basic auth,这里可以配置CHproxy 的逻辑用户,Cloudformation默认给了两个用户,分别是Distributed User和Replica User,用户名为distributed和replica,密码由您在Cloudformation参数中定义,默认为read和write您也可以在Cloudformation的参数页面找到他们

我们实例的场景为使用Distributed用户贴合读应用,sql将被负载均衡到指定的的存有分布式表的节点,通过分布式表实现快速查询。而Replica用户贴合写场景,Replica将会默认配置为将请求执行任意分片中的一个副本表,从而实现数据直接写副本表落盘,不必通过分布式表的节点再进行数据移动和副本同步。

以下为CHproxy的默认配置文件示例:
# /data/chproxy/config.yml
# 实现读写分离,可以自定义读写分布式表,副本表,实现clickhouse原生的灵活度
# ./chproxy -config=/path/to/config.yml
server:
http:
listen_addr: ":9092"
allowed_networks: ["172.0.0.0/8"]
users:
- name: "distributed"
password: "$distributedpassword"
to_cluster: "distributed"
to_user: "default"
- name: "replica-write"
password: "$replicapassword"
to_cluster: "replica-write"
to_user: "default"
clusters:
- name: "distributed"
nodes: [
"$CH_Cluster_shard1_replica1:8123",
"$CH_Cluster_shard1_replica2:8123",
"$CH_Cluster_shard2_replica1:8123",
"$CH_Cluster_shard2_replica2:8123"
]
users:
- name: "default"
password: "$chpassword"
- name: "replica-write"
replicas:
- name: "replica1"
nodes: ["$CH_Cluster_shard1_replica1:8123", "$CH_Cluster_shard2_replica1:8123"]
- name: "replica2"
nodes: ["$CH_Cluster_shard1_replica2:8123", "$CH_Cluster_shard2_replica2:8123"]
users:
- name: "default"
password: "$chpassword"
caches:
- name: "shortterm"
dir: "/data/chproxy/cache/shortterm"
max_size: $cachesize
expire: $cacheexpire
4,完成添加之后您可以来打dashboard页面,选择添加dashboard

5,在dashboard页面,您可调整以下几个位置,以便您的SQl能适应可视化

6,查询Cloudformation为您交付的集群环境,他应该与您的参数选择一致,例如2分片2副本:
select * from system.clusters

7,查询Cloudformation为您交付的分层存储,他应该与您的参数选择一致,default(本地磁盘空间)不足30%时想s3移动数据。//数据移动还受其他因数控制,例如建表时的TTL,主键移动等
select * from system.disks

8,查询Cloudformation为您交付的副本表(仅存在与访问节点的副本表)
select * from ontime_replica limit 10

9,查询Cloudformation为您加载的分布式表(完整演示数据)
select * from ontime limit 10

Cloudformation帮助我们创建了clickhouse集群等资源,这些资源默认只能在内网进行通讯。我们仅能通过ssh至堡垒机从而对这些资源进行后台管理。这也是我们安全性最佳实践的原则。
1,ssh至您的堡垒机,例如
ssh -i "workshop.pem" ec2-user@ec2-54-176-92-104.us-west-1.compute.amazonaws.com
2,将您的没药上传至堡垒机
3,在堡垒机上为要授权
sudo chmod 400 xxxx.pem
4,登录至您的管理节点
5,执行登录命令 例如
clickhouse client --host ip-10-0-6-180.us-west-1.compute.internal --password 123456
ClickHouse client version 21.5.6.6 (official build).
Connecting to ip-10-0-6-180.us-west-1.compute.internal:9000 as user default.
Connected to ClickHouse server version 21.5.6 revision 54448.
ip-10-0-6-180.us-west-1.compute.internal :)
5,执行sql 查看您的集群状态 例如



6,您还可以通过客户端或任何BI工具进行复杂查询的测试,更多SQL请参考Demo table SQL页更多示例
Q1. The number of flights per day from the year 1988 to 1989
SELECT DayOfWeek, count(*) AS c
FROM ontime
WHERE Year>=1988 AND Year<=1989
GROUP BY DayOfWeek
ORDER BY c DESC;