2017 更新日志
ClickHouse 发布 1.1.54327,2017-12-21
此版本包含对上一版本 1.1.54318 的错误修复:
- 修复了复制中可能出现竞态条件并导致数据丢失的错误。此问题影响版本 1.1.54310 和 1.1.54318。如果在这些版本中使用了 Replicated 表,强烈建议升级。该问题会在日志中的 Warning 信息里体现,例如:
Part ... from own log does not exist.即使在日志中没有看到这些消息,该问题依然存在。
ClickHouse 发布 1.1.54318,2017-11-30
此版本包含对上一版本 1.1.54310 的错误修复:
- 修复了 SummingMergeTree 引擎在合并期间错误删除行的问题
- 修复了非复制 MergeTree 引擎中的内存泄漏
- 修复了 MergeTree 引擎在频繁写入场景下的性能下降问题
- 修复了导致复制队列停止运行的问题
- 修复了服务器日志的轮转和归档问题
ClickHouse 发布 1.1.54310,2017-11-01
新特性:
- 为 MergeTree 系列表引擎提供自定义分区键。
- Kafka 表引擎。
- 新增对加载 CatBoost 模型并将其应用于存储在 ClickHouse 中的数据的支持。
- 新增对具有非整数 UTC 偏移量的时区的支持。
- 新增对时间间隔算术运算的支持。
- 将 Date 和 DateTime 类型的取值范围扩展到 2105 年。
- 新增
CREATE MATERIALIZED VIEW x TO y查询(为物化视图指定已有的表用于存储其数据)。 - 新增无参数的
ATTACH TABLE查询。 - 将 SummingMergeTree 表中列名以 -Map 结尾的 Nested 列的处理逻辑抽取为 sumMap 聚合函数。现在可以显式指定此类列。
- IP trie 字典的最大大小增加到 1.28 亿条目。
- 新增 getSizeOfEnumType 函数。
- 新增 sumWithOverflow 聚合函数。
- 新增对 Cap'n Proto 输入格式的支持。
- 使用 zstd 算法时,现在可以自定义压缩级别。
向后不兼容变更:
- 不允许使用除 Memory 以外的引擎创建临时表。
- 不允许显式创建使用 View 或 MaterializedView 引擎的表。
- 在创建表时,新增检查以验证采样键表达式是否包含在主键中。
错误修复:
- 修复了向 Distributed 表进行同步插入时可能出现的挂起问题。
- 修复了在 Replicated 表中非原子方式添加和删除部件的问题。
- 插入到物化视图中的数据不再进行不必要的去重。
- 当对某个 Distributed 表执行查询时,如果本地副本滞后并且远程副本不可用,则不再导致错误。
- 用户现在即使没有
default数据库的访问权限也可以创建临时表。 - 修复了在未带参数指定 Array 类型时导致的崩溃。
- 修复了当包含服务器日志的磁盘卷被占满时出现的挂起问题。
- 修复了在 Unix 纪元第一周中,toRelativeWeekNum 函数的溢出问题。
构建改进:
- 更新了若干第三方库(尤其是 Poco),并将其转换为 git 子模块。
ClickHouse 发布 1.1.54304,2017-10-19
新特性:
- 在原生协议中支持 TLS(要启用,请在
config.xml中设置tcp_ssl_port)。
错误修复:
- 现在,对 replicated 表执行
ALTER会尽可能尽早开始运行。 - 修复了在设置
preferred_block_size_bytes=0读取数据时发生的崩溃。 - 修复了在
clickhouse-client中按下Page Down键时的崩溃。 - 修正了包含
GLOBAL IN和UNION ALL的某些复杂查询的解析。 FREEZE PARTITION现在始终以原子方式工作。- 空的 POST 请求现在会返回状态码为 411 的响应。
- 修复了类似
CAST(1 AS Nullable(UInt8)).这样的表达式的解析错误。 - 修复了从
MergeTree表读取Array(Nullable(String))列时的错误。 - 修复了解析类似
SELECT dummy AS dummy, dummy AS b这类查询时发生的崩溃。 - 即使
users.xml无效,用户也会被正确更新。 - 修正了当可执行字典返回非零响应码时的处理。
ClickHouse Release 1.1.54292, 2017-09-20
New Features:
- 新增
pointInPolygon函数,用于在坐标平面上处理坐标。 - 新增聚合函数
sumMap,用于计算数组的和,类似于SummingMergeTree。 - 新增
trunc函数。提升了取整函数(round、floor、ceil、roundToExp2)的性能,并修正了其工作逻辑。更改了roundToExp2函数在处理小数和负数时的逻辑。 - ClickHouse 可执行文件现在对 libc 版本的依赖更少。同一个 ClickHouse 可执行文件可以在多种不同的 Linux 系统上运行。在使用已编译查询时(设置
compile = 1,默认不使用)仍然存在依赖。 - 减少了查询动态编译所需的时间。
Bug Fixes:
- 修复了有时会产生
part ... intersects previous part消息并削弱副本一致性的错误。 - 修复了在关闭期间 ZooKeeper 不可用时导致服务器挂起的错误。
- 移除了在恢复副本时的过量日志记录。
- 修复了 UNION ALL 实现中的错误。
- 修复了在块中的第一列是 Array 类型时,
concat函数产生的错误。 - 现在在 system.merges 表中正确显示进度。
ClickHouse Release 1.1.54289, 2017-09-13
New Features:
- 用于服务器管理的
SYSTEM查询:SYSTEM RELOAD DICTIONARY、SYSTEM RELOAD DICTIONARIES、SYSTEM DROP DNS CACHE、SYSTEM SHUTDOWN、SYSTEM KILL。 - 新增用于处理数组的函数:
concat、arraySlice、arrayPushBack、arrayPushFront、arrayPopBack、arrayPopFront。 - 为 ZooKeeper 配置新增
root和identity参数。这样可以在同一个 ZooKeeper 集群上隔离单个用户。 - 新增聚合函数
groupBitAnd、groupBitOr和groupBitXor(为兼容性起见,它们也可通过BIT_AND、BIT_OR和BIT_XOR这几个名称使用)。 - 外部字典可以通过在文件系统中指定 socket,从 MySQL 加载。
- 外部字典可以通过 SSL 从 MySQL 加载(
ssl_cert、ssl_key、ssl_ca参数)。 - 新增
max_network_bandwidth_for_user设置,用于限制每个用户查询的总体带宽使用量。 - 支持对临时表执行
DROP TABLE。 - 支持从
CSV和JSONEachRow格式中以 Unix 时间戳格式读取DateTime值。 - 在分布式查询中滞后的副本现在默认被排除在外(默认阈值为 5 分钟)。
- 在执行 ALTER 时使用 FIFO 锁:对于持续运行的查询,不会无限期阻塞 ALTER 查询。
- 可以在配置文件中设置
umask。 - 提升了包含
DISTINCT的查询性能。
Bug Fixes:
- 改进了在 ZooKeeper 中删除旧节点的流程。之前在非常频繁插入的情况下,旧节点有时不会被删除,这会导致服务器在关闭时变慢等问题。
- 修复了在与 ZooKeeper 建立连接时选择主机的随机化问题。
- 修复了在分布式查询中,如果副本是 localhost 时,排除落后副本的逻辑存在的错误。
- 修复了在
ReplicatedMergeTree表中,对Nested结构中的元素执行ALTER MODIFY后,数据分片可能会损坏的问题。 - 修复了可能导致 SELECT 查询“挂起”的错误。
- 改进了分布式 DDL 查询。
- 修复了查询
CREATE TABLE ... AS <materialized view>的问题。 - 解决了在
Buffer表上执行ALTER ... CLEAR COLUMN IN PARTITION查询时产生的死锁问题。 - 修复了在使用
JSONEachRow和TSKV格式时,Enum的默认值无效的问题(错误地为 0 而不是最小值)。 - 解决了在使用带有
executable源的字典时出现僵尸进程的问题。 - 修复了 HEAD 查询产生段错误的问题。
改进 ClickHouse 的开发与构建流程:
- 可以使用
pbuilder来构建 ClickHouse。 - 在 Linux 上构建时,可以使用
libc++替代libstdc++。 - 新增了使用静态代码分析工具的说明:
Coverage、clang-tidy、cppcheck。
升级时请注意:
- MergeTree 设置
max_bytes_to_merge_at_max_space_in_pool(要合并的数据分片的最大总大小,单位为字节)的默认值现在更高了:从 100 GiB 提升到 150 GiB。升级服务器后,这可能会导致执行大规模合并,从而增加磁盘子系统的负载。如果服务器可用的剩余空间小于当前正在进行的所有合并总量的两倍,将会导致所有其他合并停止运行,包括小数据分片的合并。结果是,INSERT 查询会失败,并返回消息 “Merges are processing significantly slower than inserts.”。请使用SELECT * FROM system.merges查询来监控情况。你也可以在system.metrics表中或在 Graphite 中查看DiskSpaceReservedForMerge指标。你无需执行任何操作来修复此问题,因为在大规模合并完成后,问题会自动消失。如果你认为这种情况不可接受,可以将max_bytes_to_merge_at_max_space_in_pool设置恢复为以前的值。为此,请在 config.xml 中进入<merge_tree>部分,设置<merge_tree>``<max_bytes_to_merge_at_max_space_in_pool>107374182400</max_bytes_to_merge_at_max_space_in_pool>然后重启服务器。
ClickHouse Release 1.1.54284, 2017-08-29
- 这是针对之前 1.1.54282 版本的错误修复版本。它修复了 ZooKeeper 中 parts 目录中的泄漏问题。
ClickHouse Release 1.1.54282, 2017-08-23
此版本包含对之前 1.1.54276 版本的错误修复:
- 修复了向 Distributed 表插入数据时出现的
DB::Exception: Assertion violation: !_path.empty()错误。 - 修复了在以 RowBinary 格式插入数据时,如果输入数据以 ';' 开头导致的解析问题。
- 修复了某些聚合函数(例如
groupArray())在运行时编译时出错的问题。
ClickHouse Release 1.1.54276, 2017-08-16
新功能:
- 为 SELECT 查询新增可选的 WITH 部分。示例查询:
WITH 1+1 AS a SELECT a, a*a - 可以在 Distributed 表中以同步方式执行 INSERT:仅在所有分片上的所有数据都保存完成后才返回 OK。通过设置 insert_distributed_sync=1 启用。
- 新增 UUID 数据类型,用于处理 16 字节标识符。
- 新增 CHAR、FLOAT 以及其他类型的别名,以兼容 Tableau。
- 新增函数 toYYYYMM、toYYYYMMDD 和 toYYYYMMDDhhmmss,用于将时间转换为数值。
- 在集群 DDL 查询中,可以使用 IP 地址(与主机名一起)来标识服务器。
- 为函数
substring(str, pos, len).新增对非常量参数和负偏移量的支持。 - 为聚合函数
groupArray(max_size)(column)新增 max_size 参数,并对其性能进行了优化。
主要变更:
- 安全性改进:所有服务器文件均以 0640 权限创建(可通过
<umask>配置参数更改)。 - 改进了语法无效查询的错误消息。
- 在合并大段 MergeTree 数据时,大幅降低了内存消耗并提升了性能。
- 大幅提升 ReplacingMergeTree 引擎进行数据合并时的性能。
- 通过合并来自多个源的插入请求,提升了从 Distributed 表进行异步插入的性能。要启用此功能,请使用设置 distributed_directory_monitor_batch_inserts=1。
向后不兼容的变更:
- 更改了
groupArray(array_column)函数在处理数组时聚合状态的二进制格式。
完整变更列表:
- 新增
output_format_json_quote_denormals设置,用于在 JSON 格式中输出 nan 和 inf 值。 - 优化了从 Distributed 表读取时的流分配。
- 在 readonly 模式下,如果值未发生变化,则可以对设置进行配置。
- 新增了获取 MergeTree 引擎非整数 granule 的功能,以满足 preferred_block_size_bytes 设置中指定的块大小限制。其目的是在处理包含大列的表的查询时,降低 RAM 消耗并提高缓存局部性。
- 更高效地使用包含
toStartOfHour(x)这类表达式的索引,用于满足toStartOfHour(x) op сonstexpr这类条件。 - 为 MergeTree 引擎新增了一些设置(config.xml 中的 merge_tree 小节):
- replicated_deduplication_window_seconds 设置在 Replicated 表中允许去重插入的时间窗口(秒数)。
- cleanup_delay_period 设置启动清理以删除过期数据的频率。
- replicated_can_become_leader 可以阻止某个副本成为 leader(并分配合并任务)。
- 加速了从 ZooKeeper 中清理过期数据的过程。
- 对集群 DDL 查询进行了多项改进和修复。特别值得关注的是新增设置 distributed_ddl_task_timeout,它限制了等待集群中服务器响应的时间。如果 DDL 请求尚未在所有主机上执行,响应将包含超时错误,并且请求将以异步模式执行。
- 改进了在服务器日志中显示栈回溯的信息。
- 为压缩方法新增了值 "none"。
- 在 config.xml 中可以使用多个 dictionaries_config 小节。
- 现在可以通过文件系统中的 socket 连接到 MySQL。
- system.parts 表新增一列,用于存储标记大小(以字节为单位)的信息。
Bug 修复:
- 现在,对于在
_table字段上带条件的 SELECT 查询,基于 Merge 表的分布式表可以正确工作。 - 修复了在 ReplicatedMergeTree 中检查数据部分时可能出现的罕见竞态条件。
- 修复了服务器启动时在 “leader election”(领导者选举)阶段可能发生的冻结问题。
- 在使用数据源的本地副本时,
max_replica_delay_for_distributed_queries设置会被忽略。该问题已修复。 - 修复了在尝试清理一个不存在的列时,
ALTER TABLE CLEAR COLUMN IN PARTITION的不正确行为。 - 修复了在 multiIf 函数中使用空数组或空字符串时抛出的异常。
- 修复了反序列化 Native 格式时过多的内存分配问题。
- 修复了 Trie 字典自动更新行为不正确的问题。
- 修复了当使用 SAMPLE 时,从 Merge 表中执行带 GROUP BY 子句的查询会抛出异常的问题。
- 修复了在
distributed_aggregation_memory_efficient=1时 GROUP BY 崩溃的问题。 - 现在你可以在 IN 和 JOIN 右侧指定 database.table。
- 并行聚合使用了过多线程的问题已修复。
- 修复了 "if" 函数在处理 FixedString 参数时的行为。
- 对于权重为 0 的分片,从 Distributed 表执行 SELECT 工作不正确的问题已修复。
- 运行
CREATE VIEW IF EXISTS不再导致崩溃。 - 修复了在设置
input_format_skip_unknown_fields=1且存在负数时的不正确行为。 - 修复了在
dictGetHierarchy()函数中,如果字典中存在某些无效数据会导致无限循环的问题。 - 修复了在 IN 或 JOIN 子句中带子查询并使用 Merge 表的分布式查询时出现的
Syntax error: unexpected (...)错误。 - 修复了从 Dictionary 表执行 SELECT 查询时的不正确解析问题。
- 修复了在 IN 和 JOIN 子句中使用包含超过 20 亿个元素的数组时出现的 "Cannot mremap" 错误。
- 修复了以 MySQL 作为源的字典的故障切换问题。
改进的 ClickHouse 开发与构建流程:
- 可以在 Arcadia 中进行构建。
- 你可以使用 gcc 7 来编译 ClickHouse。
- 使用 ccache+distcc 的并行构建速度现在更快。
ClickHouse Release 1.1.54245,2017-07-04
新功能:
- 分布式 DDL(例如,
CREATE TABLE ON CLUSTER) - 用于复制表的查询
ALTER TABLE CLEAR COLUMN IN PARTITION。 - Dictionary 表引擎(以表的形式访问字典数据)。
- Dictionary 数据库引擎(这种类型的数据库会自动为所有已连接的外部字典提供 Dictionary 表)。
- 你可以通过向源发送请求来检查字典是否有更新。
- 限定列名(Qualified column names)
- 使用双引号对标识符进行引用。
- HTTP 接口中的会话。
- 针对 Replicated 表的 OPTIMIZE 查询现在不仅可以在 leader 上运行。
向后不兼容的变更:
- 移除了 SET GLOBAL 语句。
次要变更:
- 现在在警报被触发后,日志会打印完整的堆栈跟踪。
- 放宽了启动时对损坏/多余数据部分数量的校验(之前误报太多)。
Bug 修复:
- 修复了向 Distributed 表插入数据时,坏连接会一直保持的問題。
- 现在,来自 Merge 表并访问 Distributed 表的查询中,GLOBAL IN 可以正常工作。
- 在 Google Compute Engine 虚拟机上检测到的 CPU 核心数不正确的问题已修复。
- 修改了缓存外部字典的可执行源的工作方式。
- 修复了包含空字符的字符串比较。
- 修复了 Float32 主键字段与常量比较的问题。
- 之前,对字段大小的不正确估算可能导致过大的内存分配。
- 修复了对通过 ALTER 添加到表中的 Nullable 列进行查询时的崩溃。
- 修复了当行数小于 LIMIT 时,按 Nullable 列排序会崩溃的问题。
- 修复了仅由常量值组成的 ORDER BY 子查询。
- 之前,在 DROP TABLE 失败后,Replicated 表可能会保持在无效状态。
- 对结果为空的标量子查询的别名不再丢失。
- 现在,即使 .so 文件被损坏,使用编译的查询也不会因错误而失败。