提及海量数据的实时分析领域,有一个名字你绝对无法忽略——ClickHouse。这款由俄罗斯搜索引擎Yandex开源、专为在线分析处理(OLAP)场景打造的列式存储数据库,在处理大规模数据的聚合查询时,性能堪称“降维打击”,相比传统关系型数据库快上一个甚至两个数量级。阿里云将其封装为托管的云服务,集成了自动运维、弹性扩缩容、数据高可用等企业级能力,让开发者能够从繁琐的基础设施维护中彻底解放,真正聚焦于业务分析本身。
那么,在实际业务中,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());为了获得更优的写入性能,建议每次写入尽可能多的行数,例如10万行以上。ClickHouse每次INSERT操作都会在存储中创建一个包含插入数据及元数据信息的新数据片段。频繁的小批量写入会导致大量小数据片段,增加后台合并的负担,进而影响查询性能。
8.2 批量写入与异步写入
对于大规模数据导入,批量写入是更优的方式。通过clickhouse-client工具,可以从本地文件批量导入数据:./clickhouse-client --host=cc-xxxx.public.clickhouse.ads.aliyuncs.com --port=3306 --user=test --password=123456Aa --query="INSERT INTO clickhouse_demo.ontime_local_distributed FORMAT CSVWithNames" < ontime-data.csv。该命令会将CSV格式的数据文件导入到指定的ClickHouse表中。ClickHouse支持多种数据格式,例如TabSeparated、CSV、JSONEachRow等。
在应用程序中,可以采用批量INSERT的方式,将多条记录拼在一条INSERT语句里,或者使用异步写入缓冲区,积累到一定数量后再一次性提交。需要注意的是,ClickHouse Writer在使用INSERT模式时,建议将系统吞吐量限制在最高1000 TPS,避免对集群造成过大负载。
8.3 从OSS导入数据
阿里云云数据库ClickHouse支持通过表引擎或表函数直接从OSS(对象存储服务)导入数据。这种方式非常适合将存储在OSS中的日志文件、备份数据直接加载到ClickHouse中进行分析。首先,你需要在OSS中准备好数据文件,并确保访问OSS的账号具备读取权限。然后,在ClickHouse中创建与OSS数据格式兼容的表:CREATE TABLE oss_test_tbl_local ON CLUSTER default (id UInt8, user_name String, age UInt16, city String, access_url String) ENGINE = MergeTree() ORDER BY id;数据格式必须与表结构兼容,特别是null字段的处理,防止因数据无法解析导致集群异常。创建外表后,可以通过INSERT INTO ... SELECT的方式将OSS中的数据导入到ClickHouse本地表中。
8.4 从MySQL导入数据
ClickHouse也支持从MySQL等关系型数据库导入数据。你可以创建MySQL外表,将MySQL表映射到ClickHouse中,然后使用INSERT INTO SELECT语句将数据同步过来。这种方式适合将MySQL中的历史数据或维度数据导入ClickHouse进行OLAP分析。
9. 数据查询
ClickHouse支持标准的SQL语法,并在此基础上做了大量扩展,以适应分析场景的特殊需求。
9.1 基础查询
基本的SELECT查询与标准SQL一致:SELECT toDate(create_time) AS date, count(*) AS order_count, sum(amount) AS total_amount FROM order_logs_local WHERE create_time >= '2026-01-01' AND create_time < '2026-02-01' GROUP BY toDate(create_time) ORDER BY date DESC;由于使用了分区键toDate(create_time),该查询会自动进行分区裁剪,仅扫描2026年1月的数据分区,数据扫描量大幅减少。
9.2 高级SQL特性
ClickHouse还提供了许多特有的SQL扩展功能:
WITH子句:定义公共表表达式(CTE),复用中间结果,例如WITH tmp AS (SELECT ...) SELECT * FROM tmp。
ANY修饰符:在JOIN时仅保留第一个匹配的行,避免笛卡尔积爆炸,例如SELECT ... FROM table1 ANY LEFT JOIN table2 USING (key)。
GLOBAL IN / GLOBAL JOIN:在分布式查询中,将右表广播到所有节点执行,适用于小表关联大表的场景。
LIMIT n BY expr:按expr分组后,每组取前n条数据,类似窗口函数ROW_NUMBER。
SAMPLE子句:快速采样数据,适用于数据量极大时的近似查询。
ARRAY JOIN:将数组或嵌套结构展开为多行。
9.3 聚合函数优化
ClickHouse提供了多种高效的聚合函数:
uniqCombined:近似计算UV(独立用户数),误差率小于1%,内存占用极低。
quantileTDigest:近似计算分位数,例如P99延迟。
sumMap / minMap:对Map类型(Key-Value)进行聚合计算。
anyLast:返回最后一次出现的非NULL值,适合状态跟踪场景。
对于需要极致查询性能的场景,可以考虑使用SummingMergeTree或AggregatingMergeTree引擎进行数据预聚合,在数据写入时就完成部分聚合计算,从而大幅减少查询时的计算量。
10. 性能优化与监控
10.1 查询性能调优
ClickHouse的查询性能主要依赖于其强大的并行数据扫描能力和高效的列式计算引擎。以下是一些关键的优化策略:
索引优化:确保WHERE条件能命中ORDER BY键的前缀;对高基数列使用跳数索引(例如SET或MINMAX索引)来加速过滤。
避免全表扫描:利用分区裁剪和索引过滤,避免在WHERE中对非索引列进行复杂计算。
聚合优化:使用预聚合表引擎减少实时计算量;在分布式查询中,优先在本地节点进行预聚合(Combiner优化)。
JOIN优化:右表存在重复键时使用ANY JOIN;右表数据量小时使用GLOBAL JOIN广播到所有节点;右表数据量大时按Join键分布数据。
资源控制:通过max_memory_usage限制查询内存使用,通过max_threads调整并行度。
10.2 慢查询监控
阿里云云数据库ClickHouse提供了图形化的查询日志界面,可以按多种维度搜索慢SQL,进行统计分析,帮助定位和解决性能问题。通过控制台的“慢SQL”和“运行中查询”功能,可以实时监控集群的查询负载,及时发现性能瓶颈。
10.3 资源队列管理
阿里云云数据库ClickHouse还提供了资源队列功能,可以对不同用户或角色设置资源使用优先级。通过合理配置资源队列,可以确保关键业务查询能获得足够的计算资源,避免个别大查询影响整个集群的稳定性。
11. 自动化管理与集成
阿里云云数据库ClickHouse提供了完整的OpenAPI,支持通过编程方式管理集群。社区兼容版使用2019-11-11版本号,企业版使用2023-05-22版本号。OpenAPI覆盖了地域管理、集群管理(例如CreateCluster、ListClusters)、计算组管理等分类。
开发者可以在OpenAPI门户中在线调试API,系统会自动生成对应的SDK调用示例。集成方式包括阿里云SDK、Terraform、资源编排和自定义封装等。强烈建议使用RAM用户而非主账号进行API调用,以降低安全风险。
此外,云数据库ClickHouse还支持与Quick BI等BI工具集成,方便业务人员直接进行数据可视化分析。同时也支持与MaxCompute等大数据平台进行数据互通。
12. 常见问题与解决方案
问题一:推荐购买哪个版本的ClickHouse?建议购买21.8及以上版本的社区兼容版或企业版。社区兼容版性价比高,适合大多数OLAP场景;企业版基于存算分离架构,弹性更好,适合对扩缩容灵活性要求较高的业务。
问题二:连接时提示“连接超时”或“访问被拒绝”?这通常是因为白名单未正确配置。请检查客户端的IP地址是否已添加到集群的白名单中。同时确认使用的是VPC地址还是外网地址,以及端口号是否正确(默认TCP端口为9000或8123)。
问题三:出现“too many parts”错误怎么办?该错误通常是由于分区键设计不合理(例如使用高基数字段作为分区键)或写入过于频繁导致part数量过多。解决方案是优化分区键设计,使用低基数字段(例如时间)作为分区键,并将分区数量控制在100到1000之间。同时可考虑增大批量写入的大小,降低写入频率。
问题四:如何查看慢SQL并进行优化?可以通过云数据库ClickHouse控制台的查询日志功能查看慢SQL。针对慢查询,可以检查是否命中了分区裁剪和索引,是否需要对表结构进行优化,或者调整max_memory_usage、max_threads等资源参数。
问题五:社区兼容版和企业版如何选择?社区兼容版基于开源ClickHouse内核,提供包年包月和按量付费两种计费模式,适合常规OLAP场景。企业版基于云原生存算分离架构,支持Serverless弹性伸缩,适合负载波动较大、需要快速扩缩容的场景。两者在API版本上也有所不同,社区兼容版使用2019-11-11 API版本,企业版使用2023-05-22 API版本。
问题六:从自建ClickHouse迁移到阿里云云数据库ClickHouse需要注意什么?迁移后可能会遇到兼容性和性能问题,建议在切换生产流量之前,先在测试环境中进行全面验证。需要注意表引擎的差异(例如自建环境可能使用非Replicated引擎,而云上双副本环境需要使用ReplicatedMergeTree)、版本差异带来的语法兼容性问题,以及网络延迟变化对写入性能的影响。
结语
总体而言,阿里云云数据库ClickHouse为企业提供了一个高性能、易运维的OLAP数据仓库解决方案。从集群创建、网络配置、表结构设计,到数据写入、查询优化、监控管理,本文系统地梳理了完整的对接使用流程。通过合理设计分区键与排序键、选择合适的写入策略、利用ClickHouse强大的SQL扩展能力,开发者可以快速构建起高效的数据分析平台。随着业务增长,还可以通过弹性扩缩容、资源队列管理等机制,持续保障集群的稳定性和性能。
