Fluentd输出插件支持< buffer >
部分来配置事件的缓冲。缓冲由Fluentd内核处理。
缓冲区概述
缓冲区位于<match>
部分之下。它为那些支持缓冲输出特性的输出插件启用。
<match tag.*>
@type file
# ...
<buffer>
# ...
</buffer>
# <buffer> section can only be configured once!
</match>
缓冲区插件类型
<buffer>
部分的@type
参数指定缓冲区插件的类型
<buffer>
@type file
</buffer>
Fluentd核心包文件和内存缓冲插件,即:
也可以安装和配置第三方插件。
但是,@type
参数不是必需的。如果省略,默认情况下,使用输出插件指定的缓冲插件(如果可能)。否则,使用memory
缓冲插件。 对于通常的工作负载,建议使用文件缓冲插件。对于一般用例来说,它更持久。
Chunk Keys
输出插件将事件分组成chunks。Chunk keys,指定为< buffer >部分的参数,控制如何将事件分组到chunks中。
<buffer ARGUMENT_CHUNK_KEYS>
# ...
</buffer>
如果指定,Chunk keys参数必须是逗号分隔的字符串。
空白Chunk keys
在没有Chunk keys或Chunk keys为空的情况下,输出插件会将所有匹配的事件写入一个Chunk中,直到其大小超过为止,前提是输出插件本身没有指定任何默认的Chunk keys。
<match tag.**>
# ...
<buffer> # <--- No chunk key specified as argument
# ...
</buffer>
</match>
# No chunk keys: All events will be appended into the same chunk.
11:59:30 web.access {"key1":"yay","key2":100} --|
|
12:00:01 web.access {"key1":"foo","key2":200} --|---> CHUNK_A
|
12:00:25 ssh.login {"key1":"yay","key2":100} --|
Tag
如果tag
被指定为chunk key,输出插件将事件写入按tag分组的块。带有不同tag的事件将被写入不同的chunk。
<match tag.**>
# ...
<buffer tag>
# ...
</buffer>
</match>
# Tag chunk key: The events will be grouped into chunks by tag.
11:59:30 web.access {"key1":"yay","key2":100} --|
|---> CHUNK_A
12:00:01 web.access {"key1":"foo","key2":200} --|
12:00:25 ssh.login {"key1":"yay","key2":100} ------> CHUNK_B
Time
如果指定了参数time
和参数timekey
(必需),输出插件会将事件写入按时间键分组的chunk中。 时间键是这样计算的:
time (unix time) / timekey (seconds)
例如:
timekey 60: ["12:00:00", ..., "12:00:59"]
, ["12:01:00", ..., "12:01:59"]
,
...
timekey 180: ["12:00:00", ..., "12:02:59"]
, ["12:03:00", ..., "12:05:59"]
,
...
timekey 3600: ["12:00:00", ..., "12:59:59"]
, ["13:00:00", ..., "13:59:59"]
,
...
这些事件将按其时间范围分组。它们将在时间键范围到期后被输出插件刷新。
<match tag.**>
# ...
<buffer time>
timekey 1h # chunks per hours ("3600" also available)
timekey_wait 5m # 5mins delay for flush ("300" also available)
</buffer>
</match>
# Time chunk key: The events will be grouped by timekey with timekey_wait delay.
11:59:30 web.access {"key1":"yay","key2":100} ------> CHUNK_A
12:00:01 web.access {"key1":"foo","key2":200} --|
|---> CHUNK_B
12:00:25 ssh.login {"key1":"yay","key2":100} --|
timekey_wait参数配置事件的刷新延迟。默认值为600 (10分钟)。 事件时间通常是从当前时间戳开始的延迟时间。Fluentd将等待刷新延迟事件的缓冲区块。例如,下图显示了块(时间键:3600)实际刷新的时间,例如时间键_等待值:
timekey: 3600
-------------------------------------------------------
time range for chunk | timekey_wait | actual flush time
12:00:00 - 12:59:59 | 0s | 13:00:00
12:00:00 - 12:59:59 | 60s (1m) | 13:01:00
12:00:00 - 12:59:59 | 600s (10m) | 13:10:00
其他key
其他(非time/非tag)键作为记录的字段名处理。输出插件将根据这些字段的值将事件分组。
<match tag.**>
# ...
<buffer key1>
# ...
</buffer>
</match>
# Chunk keys: The events will be grouped by values of "key1".
11:59:30 web.access {"key1":"yay","key2":100} --|---> CHUNK_A
|
12:00:01 web.access {"key1":"foo","key2":200} --|---> CHUNK_B
|
12:00:25 ssh.login {"key1":"yay","key2":100} --|---> CHUNK_A
支持内嵌字段
可以使用record_accessor
语法指定嵌套字段。
示例:
<match tag.**>
# ...
<buffer $.nest.field> # access record['nest']['field']
# ...
</buffer>
</match>
组合Chunk Keys
两个或多个chunk key可以组合在一起。这些事件将通过这些组合chunk key的值的组合被分组到chunk中。
# <buffer tag,time>
11:58:01 ssh.login {"key1":"yay","key2":100} ------> CHUNK_A
11:59:13 web.access {"key1":"yay","key2":100} --|
|---> CHUNK_B
11:59:30 web.access {"key1":"yay","key2":100} --|
12:00:01 web.access {"key1":"foo","key2":200} ------> CHUNK_C
12:00:25 ssh.login {"key1":"yay","key2":100} ------> CHUNK_D
注意:chunk key的总数没有硬性限制。但是,太多的chunk key可能会降低输入/输出性能和/或增加总资源利用率。
空key
通过使用[]作为缓冲区节参数,可以将缓冲区块键指定为空。
<match tag.**>
# ...
<buffer []>
# ...
</buffer>
</match>
当输出插件有自己的默认chunk key并且需要禁用它们时,这尤其有用。
占位符
当指定chunk key时,可以在配置参数值中提取这些值。这取决于插件是否对配置值应用extract_placeholders
。
以下配置显示了在path
上应用extract_placeholders
的file
输出插件
# chunk_key: tag
# ${tag} will be replaced with actual tag string
<match log.*>
@type file
path /data/${tag}/access.log #=> "/data/log.map/access.log"
<buffer tag>
# ...
</buffer>
</match>
缓冲区块键中timekey的值可以使用strptime占位符提取。提取的时间值是timekey范围的第一秒。
示例:
# chunk_key: tag and time
# ${tag[1]} will be replaced with 2nd part of tag ("map" of "log.map"), zero-origin index
# %Y, %m, %d, %H, %M, %S: strptime placeholder are available when "time" chunk key specified
<match log.*>
@type file
path /data/${tag[1]}/access.%Y-%m-%d.%H%M.log #=> "/data/map/access.2017-02-28.20:48.log"
<buffer tag,time>
timekey 1m
</buffer>
</match>
任何键都可以作为chunk key。如果引用了chunk key中未指定的键,Fluentd会引发配置错误。
<match log.*>
@type file
path /data/${tag}/access.${key1}.log #=> "/data/log.map/access.yay.log"
<buffer tag,key1>
# ...
</buffer>
</match>
Chunk ID
${chunk_id}将被内部块id替换。不需要在chunk key中指定chunk_id。
<match test.**>
@type file
path /path/to/app_${tag}_${chunk_id}
append true
<buffer tag>
flush_interval 5s
</buffer>
</match>
test.foo标记的结果如下:
# 5b35967b2d6c93cb19735b7f7d19100c is chunk id
/path/to/app_test.foo_5b35967b2d6c93cb19735b7f7d19100c.log
此占位符对于识别区块很有用,例如secondary_file、s3等。
支持内嵌字段
和chunk key一样:
<match log.*>
@type file
path /data/${tag}/access.${$.nest.field}.log #=> "/data/log.map/access.nested_yay.log"
<buffer tag,$.nest.field> # access record['nest']['field']
# ...
</buffer>
</match>
参数
参数
它是一个chunk key数组,必须是逗号分隔的字符串列表。也可以留空。
<buffer> # blank
# ...
</buffer>
<buffer tag, time, key1> # keys
# ...
</buffer>
注意:tag
和time
是为tag和time保留的chunk key,不能用于记录字段。 随着时间的推移,以下参数可用:
timekey
[time]
必需(无默认值)
输出插件将在指定的时间刷新块(当时间 在chunk key中指定)
timekey_wait
[time]
默认值:600 (10m)
输出插件将在timekey到期后,延迟timekey_wait秒才写入块
如果用户配置时间键60m,输出插件将延迟等待 刷新时间键的事件,并在每小时的10分钟时写入数据块
timekey_use_utc
[bool]
默认值:false(使用本地时区)
输出插件决定是否使用世界协调时来格式化占位符
timekey_zone
[string]
默认:本地时区
用于格式化时间键的时区(-0700或亚洲/东京)字符串 占位符
@type
@type参数指定缓冲插件的类型。默认类型是空输出插件的内存,但是它可能被输出插件实现覆盖。 例如,默认为文件输出插件的文件缓冲插件:
<buffer>
@type file
# ...
</buffer>
缓冲区参数
以下是缓冲插件及其chunk的配置参数:
chunk_limit_size
[size]
默认:8MB(内存)/ 256MB(文件)
每个块的最大大小:事件将被写入块,直到 块的大小变成这个大小
chunk_limit_records
[integer]
可选
每个区块可以存储的最大事件数
total_limit_size
[size]
默认:512MB(内存)/ 64GB(文件)
此缓冲插件实例的大小限制
此缓冲插件实例的大小限制
queue_limit_length
[integer]
默认值:零
此缓冲插件实例的队列长度限制
该参数用于v0.12兼容性。
对于v1配置,请改用total_limit_size。
chunk_full_threshold
[float]
默认值:0.95
刷新块大小阈值的百分比
当实际大小达到时,输出插件将刷新块
chunk_limit_size * chunk_full_threshold (== 8MB * 0.95 默认)
queued_chunks_limit_size
[integer] (since v1.1.3)
默认值:1(等于flush_thread_count相同的值 参数)
限制排队区块的数量。
如果设置了较小的刷新间隔,例如1,则有许多小的 缓冲区中排队的块。有了文件缓冲区,它可能会消耗大量 当输出目标有问题时,fd资源。这个参数 缓解这种情况。
compress
[enum: text
/gzip
]
默认:文本
如果设置了gzip,Fluentd会在写入之前压缩数据记录 缓冲块。.
Fluentd会在之前自动解压缩这些压缩的块 将它们传递给输出插件(例外的情况是 输出插件可以以压缩形式传输数据。在这种情况下 数据将原样传递给插件)。
默认的text
表示不应用压缩。
刷新参数
以下是用于优化性能(延迟和吞吐量)的区块刷新参数:
flush_at_shutdown
[bool]
默认值:对于永久缓冲区(如buf_file)为false,对于 非持久缓冲区(例如buf_memory)为true
这指定是否在关闭时刷新/写入所有缓冲区块
flush_mode
[enum: default
/lazy
/interval
/immediate
]
默认:默认(如果时间被指定为块,则等于lazy
,否则为interval
)
lazy
: 每个timekey刷新/写入一次区块
interval
:通过在指定flush_interval
时间刷新/写入区块
immediate
: 在附加事件后立即刷新/写入区块
flush_interval
[time]
默认:60s
flush_thread_count
[integer]
默认值:1
并行刷新/写入区块的线程数
flush_thread_interval
[float]
默认值:1.0
线程等待下一次刷新尝试的睡眠间隔(秒) (当没有块等待时)
flush_thread_burst_interval
[float]
默认值:1.0
插件将等待的块刷新到下一个块
delayed_commit_timeout
[time]
Default: 60
输出插件决定异步写入的超时时间(秒)
overflow_action
[enum: throw_exception
/block
/drop_oldest_chunk
]
默认值:抛出_异常
当输出插件的缓冲队列满了时,它是如何处理的?
throw_exception
: 引发异常以在日志中显示错误
block
: 等待缓冲区可以存储更多数据。
缓冲区准备好存储更多数据后,将重试写入缓冲区。 由于这种行为,block适合于处理批处理执行, 因此不要用于提高处理吞吐量或性能。
drop_oldest_chunk
:丢弃/清除最旧的块,以便新接受 传入块
重试参数
retry_timeout
[time]
默认:72h
重试刷新失败区块的最长时间(秒), 直到插件丢弃缓冲区块
retry_forever
[bool]
默认值:false
如果为真,插件将忽略重试超时和重试最大次数 选项,并永远重试刷新ver
retry_max_times
[integer]
重试刷新失败区块的最大次数
重试刷新失败区块的最大次数
retry_secondary_threshold
[float]
默认值:0.8
失败时切换到使用辅助模式时重试超时的比率(最大有效值为1.0)
retry_type
[enum: exponential_backoff
/periodic
]
默认值: exponential_backoff
exponential_backoff
: 以秒为单位的等待时间将呈指数增长
periodic
: 输出插件将定期以固定的时间间隔重试 (通过retry_wait配置)
retry_wait
[time]
输出插件将定期以固定的时间间隔重试 (通过retry_wait配置)
在下一次重试刷新或常数因子之前等待秒数
retry_exponential_backoff_base
[float]
默认值:2
重试的基本指数回退次数
retry_max_interval
[time]
默认值:无
重试之间指数回退的最大间隔(秒)
retry_randomize
[bool]
默认值:true
如果为真,输出插件将在随机时间间隔后重试
disable_chunk_backup
[bool]
默认值:false
不要在备份目录中存储不可恢复的块,只需 扔掉它们。该选项在Fluent d 1 . 2 . 6中新引入的。
使用exponential_backoff
, retry_wait
将按如下方式计算:
c: 常数因子, @retry_wait
b: 基本因素, @retry_exponential_backoff_base
k:重试次数
总重试时间: c + c * b^1 + (...) + c*b^k = c*b^(k+1) - 1