博客 / 工程

ClickHouse 23.3 版本发布

author avatar
ClickHouse 团队
2023年4月13日 - 11 分钟阅读

v 23.3.png

版本发布列车继续前行。我们非常激动地分享 23.3 LTS 的更新。

而且,我们已经确定了 23.4 版本的发布日期,请立即注册参加 4 月 27 日上午 9:00 (PST) / 下午 6:00 (CEST) 的社区电话会议。

版本摘要

  • 22 个新功能。
  • 14 项性能优化。
  • 61 个错误修复。

以下是一些重点功能的子集。但不要错过内存中的压缩标记、扩展的临时表以及查看已取消查询结果的能力(还有更多)。

并行副本,充分利用副本的全部能力 (Nikita Mikhailov)

通过并行副本,数据可以由同一分片的多个副本并行处理。

在 ClickHouse 集群中,当数据总量超过单台主机的容量,或者单台主机的数据处理速度太慢时,可以使用分片:数据以分片(数据部分的集合)的形式分布在多台主机上。

这使得查询性能可以扩展,因为不同的数据子集可以由多台 ClickHouse 主机并行处理。通常,分布式表用于将查询路由到所有分片。我们在下面简要描述了这一点

在某些情况下,拥有多个分片是不切实际或不必要的。例如,当您在几乎无限的共享对象存储之上运行 ClickHouse 在顶部时,例如在 ClickHouse Cloud 中,所有 ClickHouse 实例都可以访问相同的物理数据,并且实际上是单个(无限)分片的多个副本。借助新的 ClickHouse 并行副本功能,您可以利用这些副本并行处理数据。我们在下面可视化了这一点

上面的可视化显示,通过设置 allow_experimental_parallel_reading_from_replicas = true,查询被发送到(随机)发起者副本节点,该节点将查询转发到所有参与副本(数量通过 max_parallel_replicas 配置)。然后,每个副本并行处理整个分片数据的不同数据子集 范围(由发起者节点动态分配),将其本地结果发送回发起者节点,发起者节点将本地结果合并为最终结果。

在 ClickHouse Cloud 中,这种存储和计算分离允许动态增加(或减少)副本节点的数量,以便(理想情况下)线性甚至 超线性 调整查询处理时间。无需对实际数据进行任何物理重新分片或重新平衡!

并行副本功能也适用于由多个分片组成的自管理 ClickHouse 集群,每个分片有多个副本。然后,每个分片的多个副本将并行处理分片数据范围的不同子集

因此,可以通过添加数据的额外副本(副本)来调整数据处理速度。

具有动态分片的并行副本 (Antonio Andelic)

通过处理数据的不同子集,每个并行副本都可以被想象成一个分片,而无需物理分片数据。

动态分片现在允许用户控制如何形成这些虚拟分片,从而控制查询的分布方式。现在可以配置并行副本,以通过在发起者节点上自动添加基于 parallel_replicas_custom_key 表达式的不同过滤器来拆分工作,然后再将查询转发给所有参与副本

这对于特定查询可能是有益的。例如,对于 GROUP BY 查询,如果 group by 列用作 parallel_replicas_custom_key 表达式,则发起者节点无需合并来自参与副本的本地结果,因为本地结果中不会有组重叠(因此,如果设置了 parallel_replicas_custom_key,则 distributed_group_by_no_merge 会自动设置为 2)。

此外,现在还可以通过 parallel_replicas_custom_key_filter_type 设置配置 parallel_replicas_custom_key 表达式如何用于在参与副本节点之间拆分工作。default 时,将使用 NODE_COUNT 的模数将“除法余数”SQL 谓词添加到发起者节点上的查询中(我们假设每个 NODE_COUNT 参与节点在 0 到 NODE_COUNT - 1 范围内都有不同的标识符 NODE_NUM

WHERE parallel_replicas_custom_key % NODE_COUNT = NODE_NUM

parallel_replicas_custom_key_filter_type 设置为 range 时,parallel_replicas_custom_key 表达式的整个值空间将在副本节点之间均匀分割,方法是为每个副本向查询添加一个“范围”谓词,简化后如下所示(parallel_replicas_custom_key 表达式需要为无符号整数类型才能进行范围过滤)

WHERE parallel_replicas_custom_key >= NODE_NUM * (MAX_OF_VALUE_SPACE / NODE_COUNT)
  AND parallel_replicas_custom_key < (NODE_NUM + 1) * (MAX_OF_VALUE_SPACE / NODE_COUNT)

如果数据根据 parallel_replicas_custom_key 进行本地分布(排序),并且键的值在其数据类型的整个域中均匀分布(就像使用哈希值的情况一样),则此“范围”工作拆分配置是用于节省 IO 时间的优化。

对于那些想了解更多关于并行副本以及如何充分利用基于对象存储的集群的强大功能的用户,请继续关注即将发布的更深入的博客文章。

轻量级删除现已 GA (Jianmei Zhang 和 Alexander Gololobov)

最近的博客文章中,我们探讨了在 ClickHouse 中删除和更新数据的策略。作为其中的一部分,我们讨论了一项最新功能,该功能使在 ClickHouse 中删除数据成为一项更轻量级的操作 - 恰如其分地命名为“轻量级删除”。应社区的大量需求和期待,我们现在可以宣布此功能已正式发布,并已准备好在生产环境中使用。

这种删除数据的方法现在代表了从 ClickHouse 中删除数据的首选和最有效方式。通过 DELETE FROM 表语法公开,用户可以指定条件来删除特定行,如下所示

DELETE FROM table WHERE col1 = 'Hi' AND col2 = 2

用户应该意识到,此功能利用内部列来标记已删除的行。然后,这些行将在常规合并周期中删除。这有一些含义,主要是行只会最终从磁盘中删除。虽然已从搜索结果中排除,但已删除的行将保留在磁盘上,直到其部分被合并。发生这种情况所需的时间是不确定的。这意味着

  • 空间节省不会像发出通过常规 mutations 删除那样立即生效。如果空间节省至关重要,例如磁盘空间不足,请考虑使用 mutations。
  • 由于无法保证删除,因此有合规性要求的用户可能希望使用 mutations 来确保数据被删除。

除了这两个用例之外,我们建议用户立即开始将其删除工作负载迁移到 ClickHouse。

MySQL 兼容性 (Robert Schulze, Flynn)

虽然 ClickHouse 多年来一直支持 MySQL wire 协议,但方言和支持的函数是不同的。这是故意的,因为它允许用户更轻松地编写分析查询。但是,由于 Google Looker 等第三方工具需要广泛的 MySQL 兼容性,我们一直在改进对这方面的支持。虽然对诸如 SELECT 'ClickHouse' REGEXP 'M?ouse$'; 等运算符的支持对于完全语法支持很重要,但诸如 parseDateTime 等其他函数为 ClickHouse 带来了新功能。此特定函数通过允许用户在 MySQL 语法中指定日期格式,从而增强了 ClickHouse 的日期解析功能,适用于 parseDateTimeBestEffort 函数无法正确确定日期时间的情况。

例如,假设您遇到使用年份中的日期来表示特定日期的格式

SELECT parseDateTimeBestEffort('1994-127 23:23:23')

0 rows in set. Elapsed: 0.103 sec.

Received exception from server (version 23.3.1):
Code: 41. DB::Exception: Received from localhost:9000. DB::ParsingException. DB::ParsingException: Cannot read DateTime: unexpected number of decimal digits after year: 3: While processing parseDateTimeBestEffort('1994-127 23:23:23'). (CANNOT_PARSE_DATETIME)

现在可以使用 MySQL 格式解析此格式

SELECT parseDateTime('1994-127 23:23:23', '%Y-%j %H:%M:%S')

┌─parseDateTime('1994-127 23:23:23', '%Y-%j %H:%M:%S')─┐
│                              	1994-05-07 23:23:23    │
└──────────────────────────────────────────────────────┘

对于我们的 Java 用户,我们还支持 parseDateTimeInJodaSyntax 函数,允许使用众所周知的 Joda 语法

SELECT parseDateTimeInJodaSyntax('1994-127 23:23:23', 'YYYY-DDD HH:mm:ss')

┌─parseDateTimeInJodaSyntax('1994-127 23:23:23', 'YYYY-DDD HH:mm:ss')─┐
│                                             	1994-05-07 23:23:23   │
└─────────────────────────────────────────────────────────────────────┘

所有这些改进都开启了各种可能性,尤其是在 BI 工具方面。

Grafana 中的追踪

作为我们在 ClickHouse 上构建可观测性解决方案的最近的博客文章的一部分,我们专注于追踪,并意识到在我们的官方 Grafana 插件中对其进行渲染可以得到显著改进。通过少量更改,最新版本现在支持使用 Grafana 中的 Traces PanelExplore 视图可视化追踪。虽然这对于理解您自己的服务和应用程序的行为显然很有用,正如博客中强调的那样,我们还发现这是一种探索 ClickHouse 中查询的有效工具。

ClickHouse 允许使用设置 opentelemetry_trace_processorsopentelemetry_start_trace_probability 为任何查询生成追踪数据。为查询设置这些设置会导致在系统表 opentelemetry_span_log 中生成追踪。每个追踪都由 span 组成,这些 span 在上表中表示为行。这些 span 中的每一个都显示了代码级别的查询执行情况,允许用户识别查询中代价高昂的执行步骤。使用此数据和以下步骤,用户现在可以在 Grafana 中可视化这些步骤。

启用追踪,运行查询并记下查询 ID。我们在下面显式设置 max_threads 为 1,以限制用于可视目的的追踪数据

// enable tracing
SET opentelemetry_trace_processors=1;
SET opentelemetry_start_trace_probability=1;


// run a query
SELECT
	toStartOfMonth(upload_date) AS month,
	sum(view_count) AS `Youtube Views`,
	bar(sum(has_subtitles) / count(), 0.55, 0.7, 100) AS `% Subtitles`
FROM youtube
WHERE (month >= '2020-08-01') AND (month <= '2021-08-01')
GROUP BY month
ORDER BY month ASC
SETTINGS max_threads = 1

Query id: 77931e25-b1a0-4eb1-82dc-786d95629f89

为了确保为查询 ID 返回正确格式的追踪数据,请从 Grafana Explore 运行以下命令。确保在查询编辑器中设置 Format=Trace

WITH '<query_id>' AS my_query_id
SELECT
	toString(trace_id) AS traceID,
	toString(span_id) AS spanID,
	if(toString(parent_span_id)='0', Null, parent_span_id) AS parentSpanID,
	'ClickHouse' AS serviceName,
	operation_name AS operationName,
	start_time_us/1000 AS startTime,
	finish_time_us/1000 AS finishTime,
	(finish_time_us - start_time_us)/1000 AS duration,
	arrayMap(key -> map('key', key, 'value', attribute[key]), mapKeys(attribute)) AS serviceTags
FROM clusterAllReplicas('default', 'system', 'opentelemetry_span_log')
WHERE trace_id IN (
	SELECT trace_id
	FROM clusterAllReplicas('default', 'system', 'opentelemetry_span_log')
	WHERE (attribute['clickhouse.query_id']) = my_query_id
)
ORDER BY startTime ASC

请注意,我们仅对 ClickHouse Cloud 使用 clusterAllReplicas 函数。本地用户可以显式使用 opentelemetry_span_log 表。

Markdown Image

下一个合乎逻辑的问题是如何使用这些追踪来调试您的查询……请继续关注相关内容!同时,要将此新功能与您自己的服务结合使用,请立即安装最新的 ClickHouse Grafana 插件。对于那些不熟悉追踪并想了解更多信息的用户,请参阅我们的最新博客文章。有关安装和使用 Grafana 插件的更多信息,也可以在此处找到。

分享这篇文章

订阅我们的新闻通讯

及时了解功能发布、产品路线图、支持和云产品!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image