基于 Kubernetes Operator 构建 ClickHouse 云原生中间件平台
本文介绍如何利用 Kubernetes Operator 技术构建云原生的 ClickHouse 中间件服务平台,并将其集成到 Sentry 的 Snuba 事件分析引擎中。
ClickHouse 云原生多租户平台架构
构建具备云原生编排、多云部署、自动运维、弹性伸缩和故障自愈能力的分布式中间件服务是一项复杂工程。这类平台通常需要提供租户隔离、权限控制和操作审计等企业级功能。
SaaS 化服务交付模式
通过 SaaS 模式向用户提供 ClickHouse 数据库服务,用户无需关心底层基础设施的运维管理。
Sentry Snuba 架构概述
Snuba 是构建在 ClickHouse 之上的事件数据分析服务,提供丰富的数据模型和优化的查询能力。数据存储在 ClickHouse 表和物化视图中,通过 Kafka 等消息队列进行数据摄入。
Kubernetes ClickHouse Operator 实现
Kubernetes Operator 概念
Kubernetes Operator 是一种扩展 Kubernetes API 的方法,用于自动化应用程序的部署和管理。
Altinity ClickHouse Operator
Altinity 是知名的 ClickHouse Operator 开源项目维护者,提供了行业领先的解决方案。
RadonDB ClickHouse Operator
RadonDB 基于 Altinity 项目进行了定制化开发,针对生产环境集群部署进行了优化。
Helm + Operator 快速部署 ClickHouse 集群
实验环境配置
- VKE K8S Cluster (v1.23.14)
- Kubesphere v3.3.1 集群管理平台
- Longhorn 1.14 分布式存储
部署 ClickHouse Operator
# 定制 operator 参数 watchAllNamespaces: true enablePrometheusMonitor: true # 部署 operator helm install clickhouse-operator ./clickhouse-operator -f values.operator.yaml -n kube-system # 验证部署 kubectl -n kube-system get po | grep clickhouse-operator
部署 ClickHouse 集群
# 定制集群配置
clickhouse:
clusterName: snuba-data-cluster
shardscount: 2
replicascount: 2
zookeeper:
install: true
replicas: 3
# 部署集群
kubectl create ns cloud-clickhouse
helm install clickhouse ./clickhouse-cluster -f values.cluster.yaml -n cloud-clickhouse
动态扩展集群分片
# 编辑集群配置,增加分片数 kubectl edit chi/clickhouse -n cloud-clickhouse # 验证新分片创建 kubectl get po -n cloud-clickhouse
ClickHouse 集群功能验证
连接集群节点
kubectl exec -it chi-clickhouse-snuba-ck-nodes-0-0-0 -n cloud-clickhouse -- bash clickhouse-client -m
创建分布式数据库
CREATE DATABASE analytics ON CLUSTER 'snuba-ck-nodes'; SHOW DATABASES;
创建本地表结构
CREATE TABLE analytics.events_local ON CLUSTER 'snuba-ck-nodes'
(
event_time DateTime,
project_id UInt32,
user_id UInt32
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/analytics/events_local', '{replica}')
PARTITION BY toYYYYMM(event_time)
ORDER BY (project_id, event_time, intHash32(user_id))
SAMPLE BY intHash32(user_id);
创建分布式表
CREATE TABLE analytics.events_dist ON CLUSTER 'snuba-ck-nodes'
(
event_time DateTime,
project_id UInt32,
user_id UInt32
)
ENGINE = Distributed('snuba-ck-nodes', analytics, events_local, rand());
# 插入测试数据
INSERT INTO analytics.events_dist VALUES
('2023-12-01 10:00:00', 1001, 2001),
('2023-12-02 11:00:00', 1002, 2002);
# 查询验证
SELECT * FROM analytics.events_dist;
Sentry 集成 ClickHouse PaaS 平台
Sentry Helm Charts 分析
原始 Sentry Helm Charts 将所有依赖组件耦合在一起部署,不利于微服务架构的扩展性。
独立部署 ZooKeeper 集群
# 创建专用命名空间 kubectl create ns cloud-zookeeper-platform # 定制配置 metrics: enabled: true service: type: ClusterIP # 部署 ZooKeeper helm install zookeeper ./zookeeper -f values.yaml -n cloud-zookeeper-platform
独立部署 ClickHouse 集群
# 创建专用命名空间
kubectl create ns cloud-clickhouse-platform
# 配置 ZooKeeper 连接
clickhouse:
configmap:
zookeeper_servers:
config:
- hostTemplate: 'zookeeper.cloud-zookeeper-platform.svc.cluster.local'
port: "2181"
enabled: true
# 部署 ClickHouse
helm install clickhouse ./clickhouse -f values.yaml -n cloud-clickhouse-platform
Sentry 配置集成
# 禁用内置组件 clickhouse: enabled: false zookeeper: enabled: false # 配置外部连接 externalClickhouse: database: default host: "clickhouse.cloud-clickhouse-platform.svc.cluster.local" clusterName: "production-cluster" singleNode: false
高级架构设计
为支持超大规模数据处理,可以部署多个独立的 ClickHouse 集群,通过 VKE LoadBalancer 和多个 K8S 集群实现 Schema 分离和负载分散。
Snuba 系统在设计层面已充分考虑了 ClickHouse 集群间的负载均衡、连接池管理和高可用性等需求。