背景
Buffer,指把数据先写入内存 Buffer 表,再周期性的刷入磁盘表中。
读取数据时,会同时从 Buffer 表和磁盘表读取。
示例
先给例子
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 引擎。在数据写入这张表时,会先写入内存缓冲,随后再写入 merge.hits
表了。
例子中给出了 16 个缓冲区。每一个缓冲区中的数据的触发条件为:
- 缓存达到了 100 秒
- 写入了 100 万条数据
- 写入了 100MB 数据
- 同时达到了 缓存 10 秒,写入 1 万条数据,并且写入了 10MB 数据
在服务器 stop 时,或者执行 DROP TABLE 和 DETACH TABLE 时,Buffer 表内容也会写入目标表中。
说明
再给说明
Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes)
database
: 数据库table
: 数据要写入的磁盘表num_layers
: buffer 的个数,推荐为 16
数据在所有的 min 条件均满足时,或者有一个 max 条件满足时,则会被刷新到磁盘中。
min_time
,max_time
: 秒数min_rows
,max_rows
: 行数min_bytes
,max_bytes
: 字节数
写操作时,会随机写入 num_layers
中的一个。如果数据过大时,即超过了 max_rows
和 max_bytes
时,会直接写入磁盘中。
每一个 buffer layers 的操作都是独立进行的。
当使用默认值时,即 num_layers
= 16 和 max_bytes
= 100000000 时,使用的总内存为 1.6GB.
注意事项
- 如果数据库和目标表留空,数据则不会写入目标表。在 flush 时,buffer 将被清空。这个特点可以用来实现内存窗口。
- buffer 表是没有索引的,查询时会进行全表扫描。buffer 表很大时,会变的慢。
- 如果 buffer 表和目标表的列不一致,则两个表公共的列将写入目标表中。
- 如果需要改为表结构,推荐先删除 Buffer 表,再改变目标表结构,再重建 Buffer 表。
- 如果机器异常重启,则 Buffer 表内容会丢失。
- PREWHERE, FINAL and SAMPLE 语句,不支持 Buffer 表,这些语句将直接在目标表中操作,不会操作 Buffer 表中的数据。
- 在向 Buffer 表写数据时,这个 Buffer 区将会加锁,这时读请求会有延迟。
- 写入 Buffer 表的顺序,和刷新到磁盘的顺序,不一定是一致的。如果要同时使用 Buffer 表和 CollapsingMergeTree 表,可以将
num_layers
设置为 1,来避免这个问题。 - 如果目标表是 replicated,Buffer 表不能保证一条数据只写入一次??
If the destination table is replicated, some expected characteristics of replicated tables are lost when writing to a Buffer table. The random changes to the order of rows and sizes of data parts cause data deduplication to quit working, which means it is not possible to have a reliable 'exactly once' write to replicated tables.
结论:只在少数有限的情况下,推荐使用 Buffer 表。
性能
- 每秒可以发起几千个请求。如果每个请求只有一条数,则 QPS 只有几千;如果每个请求的日志数大,则 QPS 可以达到百万级。
应用场景
经过测试,使用少量线程(1-3),大包发送(2000-4000)的情况下,使用 Buffer 引擎和直接使用 MergeTree 引擎的性能是无差异的。
所以据推测,Buffer 引擎适用于多线程,小包发送的场景。未实际测试。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于