跳到主要内容
版本:Nightly

服务端写入批量处理

GreptimeDB 可以在将写入刷写到存储之前进行批量处理。请在 standalone 或 frontend 配置文件中配置。写入批量处理默认关闭。

[pending_rows_batcher] 对写入普通表的请求进行批量处理。[pending_rows_batcher.logical_table] 对使用 metric engine 逻辑表的 Prometheus Remote Write 和 Prometheus 兼容格式的 OTLP 指标进行批量处理。

普通表批量处理​

要为普通表启用批量处理,请配置至少一个协议和非零刷写间隔:

[pending_rows_batcher]
protocols = ["influxdb"]
pending_rows_flush_interval = "500ms"

此批量写入器支持 influxdb、opentsdb、otlp、logs、loki、splunk、elasticsearch、http_sql、mysql、postgres 和 prom。

未启用 metric engine 时,Prometheus Remote Write 使用此批量写入器。OTLP 日志、追踪和未使用 metric engine 的 OTLP 指标也使用它。MySQL 和 PostgreSQL 对符合条件的 INSERT 使用它。它不支持流式 Flow 源表。

Metric engine 逻辑表批量处理​

此批量写入器仅支持 prom 和 otlp。启用 metric engine 后,它处理 Prometheus Remote Write 和 Prometheus 兼容格式的 OTLP 指标:

[prom_store]
with_metric_engine = true

[pending_rows_batcher.logical_table]
protocols = ["prom"]
pending_rows_flush_interval = "500ms"

日志、追踪和使用旧写入格式的 OTLP 指标不使用此批量写入器。它的配置独立于 [pending_rows_batcher]。省略的字段使用该配置节的默认值,不会继承父配置节的值。

配置空 protocols 数组或 0s 间隔会禁用逻辑表批量处理,且不会回退到旧配置。

备注

为保持兼容性,仅当省略 [pending_rows_batcher.logical_table] 且 [pending_rows_batcher] 未启用 prom 时,GreptimeDB 才使用现有的 [prom_store] 批量写入配置。

配置项​

两个批量写入器使用以下配置项,且默认值相互独立。

配置项默认值描述
protocols[]使用批量写入器的协议。空数组会禁用批量处理。逻辑表批量写入器仅支持 prom 和 otlp。
pending_rows_flush_interval"0s"待处理批次的刷写间隔。从开始累积该批次时计时。需设为非零时长以启用批量处理。
max_batch_rows100000触发刷写的累计行数阈值。请参阅批次刷写条件。
max_concurrent_flushes256最大并发刷写操作数。
worker_channel_capacity65536每个表 worker 最多可排队的提交数。
max_inflight_requests3000等待批次完成的最大原始写入请求数。
flow_notification_queue_capacity1024最大排队 Flow 通知数。该值必须大于 0。

批次刷写条件​

满足以下任一条件时,GreptimeDB 会刷写批次:

  • 从开始累积该批次时计时,达到 pending_rows_flush_interval;
  • GreptimeDB 追加一笔完整的传入写入请求后,批次行数达到 max_batch_rows。

max_batch_rows 不是批次大小的硬性限制。GreptimeDB 不会为了满足该值而拆分传入的写入请求。

请求确认和 HTTP 超时​

默认情况下,GreptimeDB 在将批次写入存储后返回响应。将 PENDING_ROWS_BATCH_SYNC 设为 false 后,GreptimeDB 接受请求进行批量处理后即返回响应。此后发生的存储错误无法返回给客户端。同步模式下,单连接写入和 INSERT SELECT 可能需要等待一次刷写。

同步模式下,GreptimeDB 会将非零的 http.timeout 与 [pending_rows_batcher] 和 [pending_rows_batcher.logical_table] 中当前启用的最大刷写间隔比较。如果超时不大于该间隔加 1 秒,GreptimeDB 会将其提高到该值。此规则适用于 Prometheus Remote Write、启用 metric engine 的 Prometheus 兼容格式 OTLP 指标和写入普通表的 HTTP 请求。MySQL 和 PostgreSQL 的批量写入不会调整 HTTP 超时。将 http.timeout = "0s" 设为可禁用 HTTP 超时。