阿里云ClickHouse对接指南:企业级OLAP分析引擎搭建全流程
在实时海量数据在线分析处理(OLAP)领域,ClickHouse 是公认的高性能列式存储数据库。由俄罗斯搜索引擎 Yandex 开源,ClickHouse 执行大规模聚合查询时,速度通常比传统关系型数据库快 10 至 100 倍。阿里云将其封装为托管云服务,提供自动运维、弹性扩缩容及数据高可用等企业级特性,使开发者能够脱离基础设施运维的束缚,将精力集中于业务逻辑与数据洞察。
ClickHouse 在实际业务中应用广泛,覆盖用户行为分析、日志存储与分析、物联网数据监控、电商实时大屏以及广告投放效果评估等场景。列式存储、数据压缩、向量化执行引擎以及分布式架构,使其在处理宽表聚合查询时具有压倒性优势。本指南将从零开始,逐步拆解如何在阿里云上开通、配置并连接云数据库 ClickHouse,从集群创建到执行首次查询,提供完整的实操指引。
2. 环境准备与账号配置
创建 ClickHouse 集群前,需满足几项前置条件。首先,必须拥有一个完成实名认证的阿里云账号。若使用 RAM 子账号操作,则需授予 AliyunClickHouseFullAccess 权限。另外,ClickHouse 控制台依赖于应用实时监控服务 ARMS,创建集群时会自动开通该服务,建议提前确认 ARMS 处于可用状态。
需注意费用方面的细节。2021 年 12 月 1 日之后创建的 ClickHouse 集群,默认挂载一个传统型负载均衡 CLB 实例,该实例单独计费。如果业务无需公网访问集群,或已存在其他接入方案,建议在集群创建完成后释放 CLB 实例,避免产生不必要的支出。
3. 部署云数据库 ClickHouse 集群
完成准备工作后,登录阿里云控制台,在云数据库 ClickHouse 产品页面创建集群。阿里云提供社区兼容版和企业版两个版本。社区兼容版基于开源 LTS 稳定内核,通常在版本发布三个月后开始售卖,当前推荐选用 21.8 及以上版本。企业版采用云原生存算分离架构,在弹性能力与 Serverless 扩展方面更具灵活性。
创建集群时,需做出几项关键决策。计费方式方面,包年包月适合长期稳定运行的项目,性价比更高;按量付费适合测试或短期项目,按小时计费,用后可随时释放。地域和可用区应选择距离业务用户最近的位置,以降低访问延迟。部署方案上,单可用区不支持跨机房容灾,多可用区支持同城高可用,但社区兼容版的多可用区需双副本支持,计算和存储成本是单副本的两倍。
当前网络类型仅支持专有网络 VPC,提供隔离的网络环境,安全性更优。需选择现有的 VPC 和虚拟交换机,如尚未创建,需提前在 VPC 控制台中完成。内核版本选择社区兼容版后,系统会自动分配 ZooKeeper 规格(默认 4 核 8GB),该部分免费。版本规格上,单副本版只有一个副本,该副本故障时集群会暂时不可用,但高可靠云盘可防止数据丢失;双副本版有两个副本,一个故障时另一副本自动接管,可用性更高,成本相应翻倍。
配置完成并确认购买后,集群通常在 1 至 10 分钟内创建完毕,进入运行中状态。
4. 网络与白名单配置
集群创建完毕,首步安全配置即设置白名单。为保障数据库安全,系统默认禁止所有 IP 地址访问,默认的白名单分组 default 内仅包含 127.0.0.1。开始使用前,必须将客户端 IP 地址或 IP 地址段加入白名单。
具体操作为:在集群列表页面点击目标集群 ID,进入集群信息页面,从左侧导航栏选择“数据安全”,然后点击“添加白名单分组”。分组名称需由小写字母、数字或下划线组成,长度 2 至 32 个字符。组内白名单支持 IP 地址(如 192.168.0.1)或 IP 地址段(如 192.168.0.0/24),多个地址用英文逗号分隔。严禁设置白名单为 0.0.0.0 或 0.0.0.0/0,以防安全风险。单个白名单分组最多支持 50 个 IP,整个集群最多 200 个。
新建集群时,系统会自动添加名为 dms 的白名单分组,其中包含 DMS(数据管理服务)的服务器 IP。若自动添加失败,需手动添加 DMS 的 IP 地址段。避免随意修改或删除系统自动生成的白名单分组,以免影响 DMS 等服务的正常使用。
5. 创建数据库账号
白名单配置完成后,接下来创建数据库登录账号。在集群信息页面找到“账号管理”或“创建账号”入口,设置用户名和密码。该账号将用于通过 DMS、clickhouse-client 或应用程序连接集群。每个集群最多可创建 500 个数据库账号。
安全起见,建议为不同应用或团队创建独立账号,并授予最小必要权限。创建账号时,可限制该账号仅能从特定 IP 地址登录,进一步加强访问控制。
6. 连接集群的多种途径
阿里云云数据库 ClickHouse 支持多种连接方式,可根据使用场景灵活选择。
6.1 通过 DMS 连接
DMS 是阿里云的一站式数据管理服务,提供图形化界面,尤其适合初学者。在集群信息页面点击右上角的“登录数据库”按钮,即可进入 DMS 的 SQL 控制台。登录时需选择数据库类型(默认 ClickHouse)、实例地域、集群 ID,并输入数据库账号和密码。首次登录时,管控模式默认为“自由操作”,后续可根据需要调整。
在 DMS 的 SQL Console 中,可直接执行建表、插入、查询等各类 SQL 语句,并支持可视化的库表管理和数据导入导出。对于不熟悉命令行的开发者,DMS 是上手 ClickHouse 的高效工具。
6.2 通过 clickhouse-client 命令行工具连接
若需脚本化操作或批量导入数据,clickhouse-client 更为适用。首先,需安装与集群版本对应的 clickhouse-client 工具。若客户端服务器与 ClickHouse 集群处于同一 VPC 内,使用 VPC 地址连接;否则,需使用外网地址。
连接命令格式为:./clickhouse-client --host=。host 可使用 VPC 地址或外网地址,在集群信息页面即可查到;port 为 TCP 端口号;user 和 password 为先前创建的数据库账号和密码。连接成功后,即可在命令行中执行 SQL。
6.3 通过编程语言 SDK 连接
阿里云云数据库 ClickHouse 兼容开源 ClickHouse 协议,因此可使用主流编程语言的官方或社区驱动连接。Java 应用使用 clickhouse-jdbc 驱动,Python 可使用 clickhouse-driver 或 clickhouse-connect,Go 则使用 clickhouse-go。连接串格式为:clickhouse://。使用 VPC 地址连接时,务必确保应用程序与 ClickHouse 集群处于同一 VPC 内,以保障延迟和安全性。
7. 建表与数据模型设计
ClickHouse 的核心表引擎为 MergeTree 家族,几乎涵盖所有分析场景。MergeTree 系列支持数据分区、存储有序、主键索引、稀疏索引和数据 TTL 等特性。建表时,表引擎选择、分区键定义及排序键定义是三项关键设计决策。
7.1 选择表引擎
最常用的引擎为 MergeTree(单副本版)和 ReplicatedMergeTree(双副本版)。若集群为双副本版,建表时需使用 ReplicatedMergeTree 引擎,并指定 /clickhouse/tables/{database}/{table}/{shard} 和 {replica} 参数,确保数据在多个副本间自动同步。单副本版则直接使用 MergeTree 引擎即可。
7.2 分区键设计
分区键是 ClickHouse 表设计中的关键环节。分区功能根据指定键将数据组织为逻辑段,数据按分区键被划分为多个独立片段(part)。分区的主要用途在于高效的数据过期管理、分层存储和批量删除,而非作为首选的查询优化工具。
分区键设计需遵循几项核心原则:优先选择低基数(不同分区值数量较小)、易于数据管理的字段,例如时间字段。推荐分区数控制在 100 至 1000 之间,切勿使用高基数字段(如 user_id、设备号)作为分区键,否则会导致 part 数量激增,甚至引发“too many parts”错误。
最常见的分区方式是按时间分区。按月分区使用 toYYYYMM(date),按天分区使用 toDate(date)。按时间分区的优势明显:可按分区批量删除或归档数据(例如 ALTER TABLE ... DROP PARTITION),无需全表扫描;结合 TTL 策略可自动清理过期数据;查询时若按时间过滤,ClickHouse 仅需扫描相关分区,大幅减少 I/O。
以下为按天分区的建表示例:CREATE TABLE order_logs_local ON CLUSTER default (order_id UInt64, user_id UInt64, product_id UInt32, amount Decimal(18,2), status String, create_time DateTime) ENGINE = MergeTree() PARTITION BY toDate(create_time) ORDER BY (create_time, order_id);
7.3 排序键与主键设计
排序键(ORDER BY)决定数据在磁盘上的物理存储顺序,是 ClickHouse 查询性能的关键。数据严格按照 ORDER BY 指定的列排序后存储于磁盘,形成有序的数据块(Granule),每个 Granule 默认包含 8192 行数据。主键索引基于排序键生成,记录每个 Granule 中第一行的排序键值。
设计排序键时,应将查询中最常用的过滤字段置于前列。例如,若多数查询按 create_time 和 user_id 过滤,则 ORDER BY (create_time, user_id) 是合理选择。若未显式指定 PRIMARY KEY,ClickHouse 会将排序键同时作为主键。查询时,若 WHERE 条件命中 ORDER BY 键的前缀,ClickHouse 可快速定位相关数据块,实现高效过滤。
8. 数据写入策略
ClickHouse 支持多种数据写入方式,涵盖 INSERT 语句、批量导入以及从外部数据源同步。
8.1 INSERT 语句写入
基本写入方式为 INSERT 语句:INSERT INTO order_logs_local (order_id, user_id, product_id, amount, status, create_time) VALUES (1001, 2001, 3001, 99.99, 'PAID', now()); 为获得更优的写入性能
_(注:因篇幅限制,后续优化策略部分的原文 `