Clickhouse Buffer Table 是否适合实时摄取许多小插入?

Whi*_*ork 5 data-ingestion clickhouse

我正在编写一个应用程序,用于绘制财务数据并与此类数据的实时反馈进行交互。由于任务的性质,可能会以一次一笔交易的方式非常频繁地接收实时市场数据。我在本地使用数据库,并且我是唯一的用户。只有一个程序(我的中间件)会将数据插入数据库。我最关心的是延迟——我想尽可能地减少它。出于这个原因,我想避免使用队列(从某种意义上说,我希望缓冲区表来履行该角色)。Clickhouse 为我计算的许多分析预计也是实时的(尽可能)。我有三个问题:

\n
    \n
  1. 澄清缓冲区表文档中的一些限制/警告
  2. \n
  3. 阐明查询的工作原理(常规查询+物化视图)
  4. \n
  5. 当我在刷新数据时查询数据库时会发生什么
  6. \n
\n

问题 1)澄清缓冲区表文档中的一些限制/警告

\n

根据 Clickhouse 文档,我了解到许多小型插入至少可以说是次优的。在研究该主题时,我发现缓冲区引擎 [1] 可以用作解决方案。这对我来说很有意义,但是当我阅读 Buffer 的文档时,我发现了一些警告:

\n
\n

请注意,一次一行插入数据是没有意义的,即使对于缓冲区表也是如此。这只会产生每秒几千行的速度,而插入更大的数据块可以每秒产生超过一百万行(请参阅 \xe2\x80\x9cPerformance\xe2\x80\x9d 部分)。

\n
\n

每秒几千行对我来说绝对没问题,但是我担心其他性能考虑因素 - 如果我一次将一行数据提交到缓冲表,我是否应该预期 CPU/内存会出现峰值?如果我理解正确的话,一次向 MergeTree 表提交一行会给合并作业带来大量额外的工作,但如果使用 Buffer Table,这应该不是问题,对吗?

\n
\n

如果服务器异常重启,缓冲区中的数据就会丢失。

\n
\n

据我所知,这是指停电或计算机崩溃之类的事情。如果我正常关闭计算机或正常停止clickhouse服务器,我可以期望缓冲区将数据刷新到目标表吗?

\n

问题2)阐明查询的工作原理(常规查询+物化视图)

\n
\n

从缓冲区表读取数据时,将从缓冲区和目标表(如果有)中处理数据。\n请注意,缓冲区表不支持索引。换句话说,缓冲区中的数据被完全扫描,这对于大缓冲区来说可能会很慢。(对于下级表中的数据,将使用其支持的索引。)

\n
\n

这是否意味着我可以对目标表使用查询并期望自动包含缓冲区表数据?或者是相反 - 我查询缓冲表并且目标表包含在后台?如果任一为真(并且我不需要手动聚合两个表),这是否也意味着将填充物化视图?哪个表应该触发物化视图 - 磁盘表还是缓冲表?或者以某种方式两者兼而有之?

\n

我非常依赖物化视图,并且需要它们实时更新(或尽可能接近)。实现这一目标的最佳策略是什么?

\n

问题3)当我在刷新数据时查询数据库时会发生什么?

\n

我在这里主要关心的两个问题是:

\n
    \n
  1. 在刷新发生的确切时间运行查询 - 是否存在重复记录或遗漏记录的风险?
  2. \n
  3. 在哪一点会填充目标表的物化视图(我想这取决于触发 MV 的是目标表还是缓冲表)?刷新缓冲区对于我如何构建 MV 很重要吗?
  4. \n
\n

感谢您的时间。

\n

[1] https://clickhouse.tech/docs/en/engines/table-engines/special/buffer/

\n

小智 6

每秒几千行对我来说绝对没问题,但是我担心其他性能考虑因素 - 如果我一次将一行数据提交到缓冲表,我是否应该预期 CPU/内存会出现峰值?

无缓冲表引擎不会产生 CPU\内存峰值

如果我理解正确的话,一次向 MergeTree 表提交一行会给合并作业带来大量额外的工作,但如果使用 Buffer Table,这应该不是问题,对吗?

缓冲表引擎用作内存缓冲区,定期将一批行刷新到底层 *MergeTree 表,缓冲表的参数是刷新的大小和频率

如果我正常关闭计算机或正常停止clickhouse服务器,我可以期望缓冲区将数据刷新到目标表吗?

是的,当服务器正常停止时,缓冲区表将刷新其数据。

我查询缓冲表,目标表是否包含在后台?

是的,这是正确的行为,当您从 Buffer 表中 SELECT 时,SELECT 也会传递到底层 *MergeTree 表,并且刷新的数据将从 *MergeTree 读取

这是否也意味着物化视图将被填充?

目前尚不清楚,您是 CREATE MATERIALIZED VIEW 作为触发器 FROM *MergeTree 表还是触发器 FROM Buffer 表,以及您使用哪个表引擎 forTO table子句?

我建议 CREATE MATERIALIZED VIEW 作为触发器 FROM 底层 MergeTree 表