全新的 ClickHouse 22.3 版本已发布!这是一个长期支持版本 (LTS)——它将持续获得安全更新和重要错误修复,直至 2023 年 3 月。
该版本包含来自 86 位贡献者的 1308 个新提交,其中包括 25 位新贡献者
1lann、Anish Bhanwala、Eugene Galkin、HaiBo Li、Hongbin、Jianmei Zhang、LAL2211、Lars Eidnes、Miel Donkers、NikitaEvs、Nir Peled、Robert Schulze、SiderZhang、Varinara、Xudong Zhang、Yong Wang、cwkyaoyao、heleihelei、kashwy、lincion、metahys、rfraposa、shuchaome、tangjiangling、zhangyifan27。
22.3 版本的变化主要集中在功能成熟度、安全性和可靠性方面。一些实验性功能已准备好用于生产环境。
ClickHouse Keeper
ClickHouse Keeper 是我们对 ZooKeeper 的替代方案。它实现了 ZooKeeper 协议和数据模型;并且可以作为 ZooKeeper(最高版本 3.5)的直接替换方案,用于 ClickHouse 和其他应用程序。它可以作为专用组件工作,也可以嵌入到 clickhouse-server 中。
我们很自豪它通过了 Jepsen 测试,并进行了持续集成。这包括 ZooKeeper 的测试以及为了更全面覆盖而进行的额外测试。此外,它还通过了 ClickHouse 功能测试和集成测试、压力测试和模糊测试。
从 22.3 版本开始,我们确保它在读写方面都比 ZooKeeper 快,同时消耗更少的内存。用于日志和快照的磁盘使用量也更低。磁盘和传输中的数据经过校验和校验,以防止硬件故障。请求延迟的较高百分位数更低。这得益于**张立星**和**Alexander Sapin**的贡献。
截至 22.3 版本,ClickHouse Keeper 已准备好用于生产环境!事实上,它已经投入生产使用超过半年了,所以您将不是第一个生产环境用户。
ARM 架构支持
64 位 ARM CPU 架构 (AArch64) 在云服务器应用中以及笔记本电脑和工作站中越来越受欢迎。您是否考虑过在网络设备和移动设备上使用 ClickHouse?您知道吗?ClickHouse 可以在所有这些设备上运行,并且可以充分利用它们的性能。
我们于 2016 年 2 月开始将 ClickHouse 移植到 AArch64,从那时起,我们已经测试了 13 种不同的 CPU 型号:APM X-Gene;Cavium ThunderX 1、2;Raspberry Pi;Pinebook;Google Pixel;Apple M1、M1 Max;华为泰山;AWS Graviton 1、2、3;Ampere Altra。ARM CPU 制造商之间存在巨大的差异,我们很高兴能支持它们。我们还维护着不同硬件的比较基准测试集合。
22.3 版本在 AArch64 支持方面取得了两个重要里程碑
- 持续集成,100% 功能测试通过。
- 完全支持发行版构建:deb、rpm、apk、tgz、单二进制文件和 Docker。
这得益于**Mikhail Shiryaev**的工作。从 22.3 版本开始,AArch64 上的 ClickHouse 已准备好用于生产环境!
ClickHouse 对 x86_64 指令集架构进行了更具体的优化,并且只对 AArch64 进行了少量优化,即使如此,它在主要云提供商的 AArch64 上仍然可以提供更好的价格/性能比。
一些 x86 特定功能在 AArch64 上被禁用:支持 Hyperscan,支持来自PMU 的硬件指标。一些功能未包含在构建中,例如 GRPC API 支持。不建议运行混合架构集群,尽管目前没有已知问题。
接下来会发生什么?我们正在进行 PowerPC 64 小端和 RISC-V 64 的开发。如果您对其他 CPU 架构感兴趣,请告知我们。
通过 S3 的虚拟文件系统
通过 S3 的 VFS 实验性支持已存在大约两年。这是故事
- 用于数据导入和导出的 s3 函数,由**Vladimir Chebotarev**贡献
- 磁盘、卷和存储策略,由**Igor Mineev**和**Alexander Sapin**贡献
- 自动和用户触发的将数据部分在磁盘之间移动,由**Vladimir Chebotarev**贡献
- 虚拟文件系统接口,由**Alexander Burmak**贡献
- 通过 s3 的 VFS 实现,由**Pavel Kovalenko**、**Grigory Pervakov**和**Anton Ivashkin**贡献
- 异步读取,由**Alexey Milovidov**、**Kseniia Sumarokova**和**Alexander Sapin**贡献
- 完整的函数测试覆盖率、正确性和可靠性,由**Alexander Sapin**贡献
截至 22.3 版本,我们确保了基于 s3 的查询性能最大化,并对每次提交进行了持续测试。通过 s3 的 MergeTree 和 ReplicatedMergeTree 操作已准备好用于生产环境。
尽管一些新功能尚未准备好用于生产环境:“零拷贝复制”(如果一个区域中存在多个副本,则确保只有一份数据副本)以及本地缓存。已对 AWS S3 和 Minio 进行了测试。在 GCP 上存在已知问题。
安全构建基础设施
对于之前的版本,我们使用了 Yandex Cloud 中的服务器。从 22.3 版本开始,我们已将基础设施迁移到不同的位置。
持续集成和测试已迁移到美国 AWS 数据中心。我们还发布了开源中的所有构建和测试运行器。构建过程已变得可重现。您可以自行运行构建,并获得与官方二进制文件完全相同且无法区分的二进制文件。构建过程是封闭的,不依赖于操作系统发行版和环境。最终的发行版构建存储在JFrog Artifactory中,并且在packages.clickhouse.com上提供。
这项工作由**Mikhail Shiryaev**、**Alexander Sapin**和**Alexey Milovidov**完成。
请阅读这些更改的动机。
安全功能
使用 X.509 客户端证书进行身份验证是由**Eungenue**贡献的。还有**Heena Bansal**贡献的两个功能:切换以禁用用户的明文密码或无密码;在 MySQL、PostgreSQL 联合查询中过滤传出连接。
更多测试和模糊测试
我们认为模糊测试是构建可靠软件的绝对必要条件。模糊测试的主要原则是:应该进行更多模糊测试。因此,ClickHouse CI 中有很多模糊测试方法:LLVM 的 libFuzzer、基于 AST 的查询模糊测试器、Ad-hoc SQL 函数模糊测试器、线程调度顺序随机化、时区随机化、SQLancer(逻辑模糊测试器)、压力测试和 Jepsen 测试。
但这还不够。
从 22.3 版本开始,我们添加了功能测试中查询设置的随机化。因此,我们可以在不同的设置组合下运行测试。
我们还添加了用于向后兼容性的自动化测试。它试图创建所有可能的数据库、表和字典,然后安装以前的 ClickHouse 版本,并检查它是否能够成功启动。这使我们能够了解新功能是否会阻止版本降级。
我们对测试非常重视,因此决定为测试添加自动化测试。 每当有人贡献 bug 修复时,我们都会自动检查它是否包含测试,以及这些测试是否在以前的 ClickHouse 版本中失败。
半结构化数据
好吧,我已经花了你 15 分钟的时间谈论安全性、可靠性、合规性、透明度…… 但是哪里是 **乐趣**?
在 22.3 版本中,我们有一个新的实验性功能——支持动态子列和半结构化数据!
假设您有一堆 JSON,并且想要分析它——无需在表中指定数据类型。 并且您希望您的表能够自动适应模式更改,自动添加新列。 并且所有这一切都与具有深度嵌套的层次结构对象和数组! 现在这是可能的,并且效果神奇。
让我用 GitHub API 的示例演示一下。
我从 GH Explorer 中获取了按星数排序的 GitHub 存储库列表。 然后,我使用以下脚本开始查询 GitHub API 中最受欢迎的存储库的元数据
cut -f1 repos.tsv | while read repo; do
[ -f "${repo/\//@}.json" ] && continue;
echo $repo;
while true;
do curl -sS -u 'alexey-milovidov:***' "https://api.github.com/repos/${repo}" > ${repo/\//@}.json;
grep -F 'API rate limit exceeded for user' ${repo/\//@}.json && sleep 60 || break;
done;
done
(有时我有一种写 shell 脚本的罪恶快感)
数据包含详细信息,例如主存储库语言、实际星数、分支和订阅者。 响应 JSON 对象也具有大量的冗余。
我可以将它们全部加载到 ClickHouse 中,而无需关心数据类型和嵌套级别
SET allow_experimental_object_type = 1;
CREATE TABLE repositories (data JSON) ENGINE = MergeTree;
INSERT INTO repositories FROM INFILE '*.json' FORMAT JSONAsObject;
然后计算一些有趣的东西
SELECT
1 + rowNumberInAllBlocks() AS n,
*
FROM
(
SELECT DISTINCT
data.full_name,
data.stargazers_count,
data.license.name
FROM repositories
WHERE data.language = 'C++'
ORDER BY data.stargazers_count DESC
)
LIMIT 20
Query id: 175ccd7e-d689-493b-b0bc-57a584f09590
┌──n─┬─data.full_name────────────────────────┬─data.stargazers_count─┬─data.license.name───────────────────────┐
│ 1 │ tensorflow/tensorflow │ 164038 │ Apache License 2.0 │
│ 2 │ electron/electron │ 101133 │ MIT License │
│ 3 │ microsoft/terminal │ 82110 │ MIT License │
│ 4 │ opencv/opencv │ 60681 │ Other │
│ 5 │ apple/swift │ 59164 │ Apache License 2.0 │
│ 6 │ pytorch/pytorch │ 55051 │ Other │
│ 7 │ protocolbuffers/protobuf │ 53704 │ Other │
│ 8 │ x64dbg/x64dbg │ 38319 │ GNU General Public License v3.0 │
│ 9 │ BVLC/caffe │ 32370 │ Other │
│ 10 │ nlohmann/json │ 29284 │ MIT License │
│ 11 │ google/leveldb │ 28826 │ BSD 3-Clause "New" or "Revised" License │
│ 12 │ topjohnwu/Magisk │ 24989 │ GNU General Public License v3.0 │
│ 13 │ microsoft/calculator │ 24045 │ MIT License │
│ 14 │ CMU-Perceptual-Computing-Lab/openpose │ 23777 │ Other │
│ 15 │ huihut/interview │ 23490 │ Other │
│ 16 │ cmderdev/cmder │ 23453 │ MIT License │
│ 17 │ ClickHouse/ClickHouse │ 22957 │ Apache License 2.0 │
│ 18 │ facebook/rocksdb │ 22198 │ Other │
│ 19 │ mongodb/mongo │ 21409 │ Other │
│ 20 │ apache/incubator-mxnet │ 19938 │ Apache License 2.0 │
└────┴───────────────────────────────────────┴───────────────────────┴─────────────────────────────────────────┘
因此,ClickHouse 是 GitHub 上第 17 个最受欢迎的 C++ 存储库。 不错。
让我解释一下动态子列是如何工作的
有新的 JSON
数据类型。 您也可以将其写为 Object('JSON')
。 此数据类型可以解析任意 JSON,并且包含动态子列。 您可以在同一表中同时拥有常规类型和 JSON
类型。 动态子列是在插入时创建的,并像常规列一样以列式格式存储,因此查询这些子列与查询常规列一样高效。 数据类型是自动推断的,可以在后台合并期间进行转换,因此您可以在不同的 INSERT 中拥有不同的模式。 查询使用自然语法,例如 data.license.name[1]
而不是 JSONExtractString(data, 'license', 'name', 1)
或 JSON_QUERY(data, '$.license.name[1]')
。
此功能由 **Anton Popov** 实现。 它在 22.3 版本中可供预览。 我们很乐意听到您的反馈。
性能改进
ClickHouse 中有许多性能优化,并且每个新版本 ClickHouse 都变得更快。
**Maksim Kita** 通过排序优化(如果排序键由多个数字列表示)将插入 MergeTree 表的性能提高了最高两倍。
如果您有在 WHERE IN 中包含巨大列表的 SELECT 查询,那么这些查询在 ClickHouse 22.3 中的执行速度将提高最高 3 倍。
SELECT * FROM table
WHERE key IN (111, 222, ... a megabyte of something)
远程文件系统的本地缓存
当 ClickHouse 从本地文件系统读取时,数据由操作系统缓存到页面缓存中。 从具有多通道内存的服务器上的多个线程读取页面缓存的典型性能约为 50 GB/秒,因此热查询非常快。
但是,如果 ClickHouse 从远程文件系统读取,操作系统将不会看到这些读取,也无法使用页面缓存。 因此,我们需要在 ClickHouse 中使用自己的页面缓存。 从 22.3 版本开始,ClickHouse 拥有由 **Ksenia Sumarokova** 实现的远程文件系统缓存。 此功能可供预览。
它带来了 巨大的性能提升。 缓存是混合的——它同时使用本地磁盘和 RAM。
还有什么?
阅读 22.3 版本的完整变更日志 并关注 路线图。