当前位置:首页 > 技术 > 正文内容

基于 Kubernetes Operator 构建 ClickHouse 云原生中间件平台

访客 技术 2026年6月18日 1

本文介绍如何利用 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 集群间的负载均衡、连接池管理和高可用性等需求。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。