登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. Platforms
  3. LINUX
  4. ClickHouse
  5. 正文

Clickhouse入门(三)-Buffer表引擎

2022-02-17

参考资料:

《ClickHouse原理解析与应用实战》

原始链接: https://ld246.com/article/1517214401442

一、介绍

Buffer,指把数据先写入内存 Buffer 表,再周期性的刷入磁盘表中。读取数据时,会同时从 Buffer 表和磁盘表读取。

Buffer表引擎完全使用内存装载数据,不支持文件的持久化存储,所以当服务重启之后,表内的数据会被清空。Buffer表引擎不是为了面向查询场景而设计的,它的作用是充当缓冲区的角色。假设有这样一种场景,我们需要将数据写入目标MergeTree表A,由于写入的并发数很高,这可能会致MergeTree表A的合并速度慢于写入速度(因为每一次INSERT都会生成一个新的分区目录)。此时,可以引入Buffer表来缓解这类问题,将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.

示例二:

CREATE TABLE iios_cloud.event_buffer AS iios_cloud.event_data ENGINE = Buffer(iios_cloud, event_data, 8, 100, 1000,  10000000,  20000000,  10000000,  100000000)

四、注意事项

  • 如果数据库和目标表留空,数据则不会写入目标表。在 flush 时,buffer 将被清空。这个特点可以用来实现内存窗口。
  • buffer 表是没有索引的,查询时会进行全表扫描。buffer 表很大时,会变的慢。
  • 如果 buffer 表和目标表的列不一致,则两个表公共的列将写入目标表中。
  • 如果需要改为表结构,推荐先删除 Buffer 表,再改变目标表结构,再重建 Buffer 表。
  • 如果机器异常重启,则 Buffer 表内容会丢失。
  • PREWHERE, FINAL and SAMPLE 语句,不支持 Buffer 表,这些语句将直接在目标表中操作,不会操作 Buffer 表中的数据。
  • 在向 Buffer 表写数据时,这个 Buffer 区将会加锁,这时读请求会有延迟。
  • 写入 Buffer 表的顺序,和刷新到磁盘的顺序,不一定是一致的。如果要同时使用 Buffer 表和 CollapsingMergeTree 表,可以将 num_layers 设置为 1,来避免这个问题。
  • 如果目标表是 replicated,Buffer 表不能保证一条数据只写入一次??

五、性能

每秒可以发起几千个请求。如果每个请求只有一条数,则 QPS 只有几千;如果每个请求的日志数大,则 QPS 可以达到百万级。

经过测试,使用少量线程(1-3),大包发送(2000-4000)的情况下,使用 Buffer 引擎和直接使用 MergeTree 引擎的性能是无差异的。

标签: 暂无
最后更新:2022-05-26

代号山岳

知之为知之 不知为不知

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号