ClickHouse中文社区

Buffer表引擎介绍

2018-05-04  本文已影响274人  c3729438b799

Buffers 表引擎将缓冲数据写入内存,周期性刷新数据到目标表. 当进行读操作时,数据从缓冲区读出,同时写入到另一张表。

Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes)

Engine 参数:database, table – 此表是刷新数据的目标表。与数据库名不同, 你能够使用常量表达式,返回一个string.num_layers – 并行处理层. 从物理上讲,此表将被表示为 'num_layers' 独立缓冲层数。推荐值为: 16.min_time, max_time, min_rows, max_rows, min_bytes, 和max_bytes 是从缓冲区刷新数据的条件.

在Buffer中缓冲的数据写入到目标表,如果所有的 'min'条件或最少的一个 'max' 条件是 met.min_time, max_time – 是从第一次写入到 buffer.min_rows时开始计时的秒数max_rows – 在 buffer.min_bytes中的行数, max_bytes – 在缓冲区中字节的最大数量.

在写操作的过程中,数据被插入到一个 随机缓冲区的 'num_layers' 数量. 或者,如果插入的数据部分足够大 (> 'max_rows' 或者 'max_bytes'),  它将直接写入到目标表, 忽略缓冲区.

刷新数据单独被计算为每个 'num_layers' 缓冲区. 例如, 如果num_layers = 16 和 max_bytes = 100000000, 最大 RAM 消耗是 1.6 GB.

CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10, 100, 10000, 1000000, 10000000, 100000000)

创建一个 'merge.hits_buffer' 表与'merge.hits'具有相同的表结构,同时使用 Buffer 引擎. 当写入到此表后, 数据将被缓冲到 RAM 中,然后写入到 'merge.hits' 表中. 16 缓冲区将被创建。 每个缓冲区中的数据将被刷新,每过100秒,或每写入100万条数据, 或者每写入100 MB 数据; 或者如果同时写入10 秒, 10,000条和 10 MB 数据。 例如,如果一行已经被写入 ,在100秒后,它将被刷新。 但是如果多行已经被写入,数据将稍微延迟刷新。

当服务器停止后,DROP TABLE 或 DETACH TABLE, 缓存数据也刷新到目标表。

你能够在单引号标记上设置空字符串对于数据库和表名称。 它提示了缺乏一个目标表。在这种情况下, 当数据刷新条件达到后,缓冲区将被清空。在内存中维护一个数据窗口是必要的。

当从一个缓冲表中读取数据时,数据同时在缓冲表和目标表中处理。注意:缓冲表不支持一个索引。换句话说,在缓冲区的数据被全表扫描,对于大的缓冲区速度将是慢的。(在次级表中,支持的索引将被引用 )

如果在缓冲表中的列集合不能匹配次级表的列集合, 在2张表中同时存在的列子集将被插入。

如果此类型不匹配缓冲表中的列和次级表的列,则一个错误信息将被写入到服务器日志中,缓冲将被清空。当缓冲表刷新时,次级表不存在,则同样的错误信息也被写入到服务器日志中。

如果你需要在缓冲表和次级表中执行ALTER语句,我们推荐先删除缓冲表,然后在次级表上执行ALTER语句,再创建缓冲表。

如果服务器出现异常重启,在缓冲中的数据将丢失。

对于缓冲表来说,PREWHERE, FINAL 和 SAMPLE 不能正常运行。这些条件将被传给目标表,而在缓冲表中不用于处理数据。因此, 我们推荐仅使用缓冲表来写入数据, 次级表来读取数据,从而实现读写分离。

当数据加载到一个缓冲中后,一个缓存将被锁定。如果在此表上同时执行读数据操作,则将有一定的延时。

插入到一个缓冲表的数据可能以其他的顺序和其他的数据块落地到次级表。因此,一个缓存表难以正确地写入一个 CollapsingMergeTree 表. 为了避免此类问题, 你可以设置 'num_layers' 到 1。

如果目标表是同步的, 一些复制表的特性将丢失,当写入到缓冲表时。随机改变行的顺序和数据的大小导致数据重复数据删除,退出工作,意思是不可能有一个可靠的'exactly once' 写入到复制表。

由于上述的劣势, 我们仅推荐使用一个缓冲表在特定的场景。

当从大量服务器接收过来太多插入操作时,适用于使用缓冲表。 在插入之前,数据不能被缓冲, 这就意味着 INSERTs 不能运行地足够快。

注意:每次往缓冲表中不要频繁插入小批量数据,每秒插入上万条数据最佳 ,当插入更大数据块时,每秒将产生上百万条数据。

版权声明:本文版权归@神州云联科技有限公司所有,未经允许任何单位或个人不得转载,复制或以任何其他方式使用本文全部或部分,侵权必究。

上一篇下一篇

猜你喜欢

热点阅读