当前位置: 首页 > 工具软件 > Fluentd > 使用案例 >

Fluentd 缓冲区设置

纪成礼
2023-12-01

缓冲区配置

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_placeholdersfile输出插件

# 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>

注意:tagtime 是为tagtime保留的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

 类似资料: