十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ClickHouse v20.12 版本亮点解析:从 EmbeddedRocksDB 新引擎到分布式合并与格式设置的全面进化

ClickHouse v20.12 版本亮点解析:从 EmbeddedRocksDB 新引擎到分布式合并与格式设置的全面进化 ClickHouse v20.12 版本亮点解析从 EmbeddedRocksDB 新引擎到分布式合并与格式设置的全面进化【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 仓库 docs/changelogs/archive/v20.12.1.5236-prestable.md 版本日志对比基线 v20.11.1.5109-prestable系统梳理该版本在引擎、语法、设置项、性能与稳定性上的关键演进并结合当前仓库源码src/Core/Settings.cpp、src/Storages/RocksDB、src/Storages/MergeTree 等补充底层实现证据。读完本文你将理解 v20.12 引入的每个重要功能如何使用、为何如此设计以及它们对后续版本的深远影响。一、向后不兼容变更Backward Incompatible Change任何大版本升级都必须首先关注行为变化v20.12 的两项不兼容变更直接影响存量 SQL 与集群运维。1. File 引擎表文件格式设置改为建表时固化此前使用File引擎的表在执行INSERT/SELECT时会读取当前会话或 DML 语句SETTINGS子句中设置的格式参数如format_csv_delimiter。这意味着同一张表在不同会话中读取结果可能不一致。v20.12 起对应 PR #16591行为被改为在CREATE TABLE ... SETTINGS子句中接受并固化文件格式相关设置并在后续所有INSERT、SELECT中统一使用。当前会话或 DML 自身的格式设置不再影响该类表的查询。-- 建表时固化 CSV 分隔符 CREATE TABLE t (a UInt32, b String) ENGINE File(CSV) SETTINGS format_csv_delimiter ;; -- 后续读写都使用 ; 作为分隔符与会话设置无关 INSERT INTO t VALUES (1, x), (2, y); SELECT * FROM t;这一改动消除了同一张表读出来格式随会话漂移的隐患使文件格式表的行为可预测、可复现。2. 分布式表 part 命名默认启用紧凑格式use_compact_format_in_distributed_parts_names设置在本版本被默认开启PR #16728并在 PR #16788 中进一步应用到每次INSERT配合internal_replication。在源码 src/Core/Settings.cpp 中该设置的文档明确说明其影响值为1默认后台INSERT的分片命名受集群定义影响更改集群定义中节点的顺序会改变shard_index/replica_index因此涉及这些 part 的引用需保持一致值为0集群定义的变化不会影响后台INSERT产生的 part 命名。升级后若你的运维脚本依赖旧格式的 part 名称需要重新审视对shard_index/replica_index的假设。二、新特性引擎、语法与设置项v20.12 是本版本中功能增量相当密集的一个里程碑以下按主题分组展开。1. 全新存储引擎EmbeddedRocksDBPR #15073约 1300 行并配套 src/Storages/RocksDB/RocksDBSettings.cpp、src/Storages/RocksDB/EmbeddedRocksDBSink.cpp、src/Storages/RocksDB/EmbeddedRocksDBBulkSink.cpp 以及系统表 src/Storages/RocksDB/StorageSystemRocksDB.cpp。从源码看引擎支持通过optimize_for_bulk_insertRocksDBSettings中的RocksDBSettingsBool切换批量写入路径EmbeddedRocksDBBulkSink并支持 TTL引入rocksdb/utilities/db_ttl.h、压缩类型、statistics 等 RocksDB 原生能力配置。RocksDB 相关构建配置可见 contrib/rocksdb本版本对应构建日志还将其版本升级到 v6.14.5见下文构建章节。引擎在 src/Storages/registerStorages.cpp 中通过registerStorageEmbeddedRocksDB注册到StorageFactory。典型用法CREATE TABLE kv ( key String, value String ) ENGINE EmbeddedRocksDB PRIMARY KEY key; INSERT INTO kv VALUES (k1, v1); SELECT * FROM kv WHERE key k1;注意EmbeddedRocksDB 是键值型引擎适合按主键点查的场景复杂的分析型聚合并不适合。2. ALTER 语法扩展IN PARTITION 与 PART 粒度操作ALTER UPDATE/DELETE IN PARTITIONPR #13403允许将更新/删除操作限定在指定分区内显著缩小 mutation 的扫描范围。例如ALTER TABLE t UPDATE v v 1 IN PARTITION 202012 WHERE k 1; ALTER TABLE t DELETE IN PARTITION 202012 WHERE k 1;ALTER TABLE ... DROP|DETACH PART part_namePR #15511新增按part数据分片粒度直接DROP/DETACH的语法此前只能按分区PARTITION操作。这对于精确清理某个损坏或冗余的 part 非常有用ALTER TABLE t DROP PART 202012_1_1_0; ALTER TABLE t DETACH PART 202012_1_1_0;3. 新增设置项与格式能力aggregate_functions_null_for_emptyPR #16123解决 issue #10273开启后会把查询中所有聚合函数改写为追加-OrNull后缀的版本即空输入集返回NULL而非0/ 空串用于对齐 SQL 标准。源码 src/Core/Settings.cpp 给出了完整语义与示例SELECT SUM(-1), MAX(0) FROM system.one WHERE 0;关闭默认0时返回0, 0开启1时等价于执行SUMOrNull(-1), MAXOrNull(0)返回NULL, NULL。其实现方式是查询改写query rewrite与count_distinct_implementation类似从而保证分布式查询下各节点结果一致。相关改写逻辑可参见 src/Interpreters/TreeRewriter.cpp 与 src/Analyzer/Resolve/QueryAnalyzer.cpp。COLLATE 支持扩展PR #16273Nullable、LowCardinality、Array、Tuple中嵌套的String类型现在也支持COLLATE同时对ColumnString.cpp的 collation 相关代码进行了重构。*.xz压缩格式支持PR #16578解决 issue #8828file()表函数与相关读写路径现在可以直接使用*.xz文件。新的cmath数学函数PR #16636新增acosh、asinh、atan2、atanh、cosh、hypot、log1p、sinh。TSV/CSV 默认按 id 解析 EnumPR #16834TSV 与 CSV 格式输入时默认允许直接以枚举的数值 id 作为输入值而无需写字符串名字。tcpPort()函数PR #17134。可用于在查询中感知服务端口SELECT tcpPort();--history_file参数PR #15960clickhouse-client支持通过--history_file指定交互历史文件路径。DateTime/DateTime64 接受字符串日期字面量PR #16040格式化路径支持2020-12-01这类字符串日期格式。JSON 格式增强新增output_format_json_array_of_rowsPR #17152允许将所有输出行整体包裹为 JSON 数组新增output_format_json_named_tuples_as_objectsPR #17175默认关闭开启后命名 Tuple 在 JSON 输入/输出中按对象展示。4. 复制表合并调度execute_merges_on_single_replica_time_thresholdPR #16424 引入execute_merges_on_single_replica_time_thresholdMergeTree 设置当该阈值秒大于 0 时允许将同一份 merge 任务只分派给一个副本执行其他副本等待结果从而将合并压力在副本之间分散降低多个副本重复合并同一批数据带来的 CPU/IO 冗余。底层实现位于 src/Storages/MergeTree/ReplicatedMergeTreeMergeStrategyPicker.cpp并在 src/Storages/MergeTree/MergeTreeSettings.cpp 中声明execute_merges_on_single_replica_time_threshold默认0即每副本各自执行合并remote_fs_execute_merges_on_single_replica_time_threshold默认3 * 60 * 603 小时面向远端共享存储场景。从 ReplicatedMergeTreeMergeStrategyPicker.cpp 可以看出运行时约束若当前副本不在活跃副本列表中或活跃副本数量过少该机制会自动退化为各副本独立合并并打印LOG_WARNING日志。分布式调度相关逻辑由 src/Storages/MergeTree/MergeFromLogEntryTask.cpp 与 src/Storages/MergeTree/MutateFromLogEntryTask.cpp 承载。使用示例CREATE TABLE t (...) ENGINE ReplicatedMergeTree(/clickhouse/tables/t, {replica}) SETTINGS execute_merges_on_single_replica_time_threshold 3600;注意该阈值按秒配置MergeTreeSettingsSeconds且与remote_fs变体相互独立、可叠加使用。三、性能改进分区裁剪与部分排序1. 支持对精确表达式进行分区裁剪PR #16253 让分区裁剪支持精确匹配场景。典型场景表按intHash64(x) % 100分区而查询条件原样书写intHash64(x) % 100 42而非基于x推导。此前这类查询无法利用分区裁剪v20.12 起可以直接剪掉其余 99 个分区CREATE TABLE hits (...) ENGINE MergeTree PARTITION BY intHash64(user_id) % 100 ORDER BY event_time; -- v20.12 起可精确裁剪到 1 个分区 SELECT count() FROM hits WHERE intHash64(user_id) % 100 42;2. 部分排序采用 Floyd–Rivest 算法PR #16825 与 contrib/miniselect-cmake。该算法在期望线性时间内完成选择相比此前实现更适合 ClickHouse 海量数据 取前 N 行的典型负载。四、可用性与运维改进1. 复制表 fetch 独立线程池background_fetches_pool_sizePR #16390 与 src/Core/Settings.cpp使用点位于 src/Interpreters/Context.cpp 及 src/Storages/MergeTree/registerStorageMergeTree.cpp。!-- config.xml -- background_fetches_pool_size3/background_fetches_pool_size2. 配置热加载与更友好的报错auxiliary_zookeepers配置PR #16627现在可以在config.xml中修改后不重启服务直接 reload。分布式 DDL 缺少配置时给出更清晰的异常信息PR #16769修复 issue #5075。服务器启动时若metric_log的collect_interval_milliseconds缺失会直接以明确异常拒绝启动PR #16815。ATTACH/DETACH TABLE DICTIONARY现在会抛出明确错误PR #16885避免产生格式损坏的内存元数据。3. 其他值得关注的小改进indexOf()底层改用 BloomFilterPR #14977。EXPLAIN增加VIEW子查询描述与 limit 下推优化并在查询计划中展示Distributed表的本地副本PR #14936。HTTPS 连接远程资源支持SNIPR #16252修复 issue #10055客户端连接位于 TLS 代理后的clickhouse-server安全端点同样支持 SNIPR #16938。同尺寸整型与浮点之间允许reinterpretPR #16657修复 issue #16640。S3 配合 nginx 代理时使用补丁版 aws-sdk-cpp 将空路径 URL如http://domain.com?delete规范为带/的形式PR #16709。Distributed引擎启动时清理 async INSERT 遗留的空目录PR #16729。新增cutToFirstSignificantSubdomainWithWWW()函数PR #16845。SOURCE(CLICKHOUSE(...))字典源的host/port默认取当前实例、user默认取defaultPR #16997。被 TTL、mutation 或 collapsing merge 裁剪后产生的空 part 会被直接移除PR #16895。物化视图成环时抛出明确异常而非栈溢出PR #16048修复 issue #15732。MySQL 同步用户权限错误时给出更准确的异常提示PR #15977。CREATE TABLE中CODEC表达式位置错误时语法错误提示更友好PR #16768修复 issue #12493。五、稳定性与 Bug 修复要点v20.12 的修复覆盖查询正确性、崩溃防护与分布式一致性等多个维度以下是按主题归类的要点完整清单见 docs/changelogs/archive/v20.12.1.5236-prestable.md查询正确性修复带if后缀聚合函数在远程查询中的失败PR #16610修复开启transform_null_in时多列 元组的IN运算PR #16722修复 issue #15310修复optimize_read_in_order/optimize_aggregation_in_order与max_threads0及ORDER BY表达式组合的问题PR #16637修复ORDER BY查询偶发Illegal type of argumentPR #16928修复 issue #16580修复 128/256 位大整数从double转换时的错误结果PR #16986。崩溃防护修复any()无参调用崩溃PR #16826修复TimeSeriesGroupSum导致的 server 崩溃PR #16865修复ColumnConst比较崩溃PR #17135修复ALTER MODIFY COLUMN未完成期间WHERE引用被改列导致的崩溃PR #16968修复toInt256(inf)栈溢出PR #17257修复 query profiler 在 glibc 异步 unwind 表异常时的静默崩溃PR #16846修复 issues #15301、#13098。分布式与复制修复ON CLUSTER查询在非 leader 的ReplicatedMergeTree上可能无限挂起PR #17089system.distribution_queue的data_path中密码脱敏PR #16727修复可被取消的远程查询如带LIMIT产生的不必要网络错误PR #17006。存储与 IO写入表元数据内存不足时防止写出损坏的 metadata 文件PR #16772S3 无数据写入时中止 multipart uploadPR #16840format_avro_schema_registry_url出错时重新解析 IPPR #16985。内存与解析内存不足时关闭并行解析并规避超大行触发Memory limit exceededPR #16721修复TDigest无控增长PR #16680自适应索引粒度在数据块大小差异大时计算更合理PR #17120。兼容性修复修复CREATE TABLE ... AS some_table且源表由表函数创建时的崩溃PR #17072修复 issue #16944修复 MySQL 修改binlog_checksum后MaterializeMySQL同步失败PR #17091修复 issues #16923、#15883。六、构建、测试与打包改进UBSan 治理修复无限浮点转整数的 UBSan 报告PR #16677、cache 字典 UBSan 报告PR #16763、Poco 的 UBSan 报告PR #16765同时不再对第三方库插桩 UBSanPR #16764。RocksDB 升级RocksDB 版本升级到v6.14.5PR #17179为 EmbeddedRocksDB 引擎提供更新的底层能力。时区数据内嵌时区数据更新到2020d并同步更新 cctz 到最新 masterPR #17204。头文件修正为 base/common/StringRef.h 补充stdexcept头文件修复std::logic_error的编译问题PR #17256。CI/测试修复 fasttest 子模块克隆PR #16908、query_db_generate构建错误PR #16859、LDAP 外部用户目录测试不稳定PR #17161并改进覆盖率构建镜像PR #17233。Docker 安装脚本自定义配置的 Docker 构建场景下安装脚本会始终在配置目录中创建子目录PR #16936。clickhouse-git-import修复 blame 信息计算错误PR #16959。无 CL 条目含 MySQL DDL 原子同步PR #16704、RBAC Testflows 相关测试PR #16719、#16773、docs/tools 中 protobuf 3.13.0 → 3.14.0PR #17056等未单独记录 changelog 的合并。七、升级与回归风险清单基于上述变更从 v20.11 升级到 v20.12 前建议重点核对File 引擎表确认建表语句中没有依赖会话级格式设置的读写必要时在CREATE TABLE的SETTINGS中显式固化format_csv_delimiter等。分布式表 part 命名use_compact_format_in_distributed_parts_names默认开启检查依赖旧命名格式的脚本、备份与外部同步逻辑若需兼容可显式设置0。复制表合并默认仍为每副本独立合并execute_merges_on_single_replica_time_threshold 0开启单副本合并前确认副本数 ≥ 2 且当前副本在活跃列表避免退化路径带来的行为变化。background_fetches_pool_size默认 3如需调整必须重启服务。aggregate_functions_null_for_empty默认关闭开启会改变聚合空集的返回语义NULLvs0属于显式 SQL 标准对齐行为按需开启。这些变更背后的完整上下文可以在 docs/changelogs/archive/v20.12.1.5236-prestable.md 及上述源码路径中进一步查阅验证。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表