Synth Daily

ClickHouse 开源十周年

ClickHouse 自 2016 年开源以来,已发展成为顶级的开源分析型数据库。它起源于一个为解决实时数据处理瓶颈而创建的内部原型,通过逐步引入列式存储、合并树(MergeTree)和分布式复制等关键技术,演化成一个高性能系统。其成功的关键不仅在于技术创新,更在于其开放的开发流程、完善的文档以及对社区贡献者的尊重,这使其成为学习 C++ 和数据库工程的宝贵资源。

开源的不同层次

开源并非只有一种形式,可以分为不同级别:

  • 级别 0: 仅公开代码供阅读,不进行更新,如 Doom 或 MS-DOS 的源码。
  • 级别 1: 在公共仓库中更新代码,但不一定接受外部贡献,如 SQLite。
  • 级别 2: 接受贡献,但开发过程不透明。大多数活跃的开源项目属于此列。
  • 级别 3: 拥有开放的贡献指南、任务跟踪、代码审查、开发路线图、持续集成、发布周期、用户支持和文档。ClickHouse 始终追求达到这一最高标准。

ClickHouse 的开源哲学

ClickHouse 的目标是成为多个领域的典范:

  • 构建卓越数据库的范例: 通过模块化、正交和文档完善的代码,为其他数据库开发者提供学习样板。代码注释详尽,旨在让读者无需查阅课本即可理解复杂概念。
  • 学习 C++ 开发的平台: 作为最受欢迎的 C++ 开源项目之一,它展示了从 C++23 等前沿技术到构建系统、持续集成和代码审查等工程实践的方方面面。
  • 数据结构与性能优化的试验场: 欢迎任何人提交实验性的拉取请求(Pull Request),即使最终不合并,也会得到与生产发布同等级别的严格测试。
  • 让贡献者引以为傲的社区: 每位贡献者 都会被记录在更新日志和 system.contributors 系统表中。即使初次提交的代码不完整,项目维护者也会协助完成,并始终认可最初作者的贡献。

原型与早期探索

ClickHouse 的诞生源于解决一个网站分析系统的实际问题。当时系统使用 MySQL,但随着数据量增长,实时处理和查询变得越来越慢。

在不断寻找解决方案(如 TokuDB、LMDB、Hadoop)的过程中,一个想法逐渐成形:构建一个专门用于即时聚合非聚合结构化日志的系统。

  • 第一个原型 (OLAPServer): 诞生于 2008 年底,它是一个简单的列式存储引擎,将每日每列数据(仅限整数)存入单独的二进制文件,通过 API 支持分组、聚合和过滤查询。它取得了出人意料的成功,甚至比公司内部的 MapReduce 系统响应更快。
  • 第二个原型 (Metrage): 为解决 MySQL 中预聚合报表的更新问题,这个原型采用行式存储,实现了基于 增量聚合和后台合并 的逻辑。它支持任意的自定义数据结构(CRDT),实现了实时更新。

最终,一个核心问题推动了 ClickHouse 的诞生:如果我尝试将列式存储的聚合速度与合并树的实时更新及数据局部性结合起来,会怎么样?

从零开始构建 ClickHouse

ClickHouse 是一个罕见的、完全从零开始构建的数据库系统,而非基于现有系统(如 Postgres 或 Datafusion)的二次开发。其 bootstrapping 过程可以追溯到一系列关键的技术提交:

  • 2009 年: 最早的提交实现了内存中的列式数据结构(IColumnField),这发生在 Apache Arrow 等类似格式出现之前。
  • 后续发展:
    • 引入了聚合函数、表引擎(最初的 TinyLog)、压缩(从 QuickLZ 替换为 LZ4)。
    • 开发了流式数据处理管道(Block Streams)和用于测试的 system.numbers 表。
    • 从零手写了递归下降的 SQL 解析器
    • 为解决 C++ iostreams 的性能瓶颈,引入了至今仍在使用的 WriteBufferReadBuffer
    • 2012 年 3 月clickhouse-serverclickhouse-client 诞生,配合 LogMergeDistributed 等引擎,ClickHouse 首次部署于生产环境,最初的用途是作为一个支持 SQL 查询的持久化日志队列

在开发过程中,一个重要的理念是:删除不必要的代码比添加新代码更重要。许多早期的实验性功能(如变长编码列、Variant 类型)因性能不佳而被移除。

走向生产环境

为了替代早期的两个原型,MergeTree 引擎被开发出来。它通过在后台对数据进行增量排序,解决了数据按时间到达但需按网站 ID 快速查询的矛盾。

为了满足多数据中心的高可用性要求,开发团队利用 ZooKeeper 作为协调系统,实现了 ReplicatedMergeTree 引擎。这确保了数据的强一致性和自动修复能力,使 ClickHouse 在 2014 年 能够正式用于面向用户的生产查询。

开源之路

到 2014 年底,ClickHouse 已在公司内部被广告、电商、基础设施和业务分析等多个部门广泛使用。作者意识到,许多其他公司的工程师也在重复造轮子,开发着类似于 OLAPServer 或 Metrage 的系统。

如果我把它开放给所有人,它就能填补这个空白。如果我不做,别人迟早会做,这才是真正可怕的。

在说服公司管理层后,经过周密的准备,ClickHouse 于 2016 年 6 月 15 日 正式开源。这个故事旨在激励每一位工程师勇于开源自己的代码,因为即使最坏的情况也只是无人问津,但它同样有机会像 ClickHouse 一样,影响一代又一代的开发者。