Apache Iggy 配置参数详解
Apache Iggy 0.9.0 配置文件 config.toml 与 IGGY_ 环境变量全参数详解,覆盖监听端口、内存池、日志、加密、集群 VSR、分片、分区与消息总线,附带生产配置模板,已逐项对照仓库配置实测核对。
Apache Iggy 配置参数详解
目标:系统讲解 Apache Iggy 0.9.0 服务端配置——
core/server/config.toml的完整参数段(监听、内存池、日志、加密、集群 VSR、分片、分区、消息总线)以及对应的IGGY_环境变量覆盖方式,并给出生产配置模板。所有默认值均对照仓库server-0.9.0的core/server/config.toml实测核对。
一、环境信息
- 组件:Apache Iggy 0.9.0(
iggy-server) - 默认配置文件:仓库源码
core/server/config.toml(相对工作目录解析) - 覆盖方式:环境变量
IGGY_<嵌套键>(下划线分隔),或IGGY_CONFIG_PATH指向自定义 TOML - 数据目录:
local_data(IGGY_PATH覆盖) - 监听端口:TCP
8090、QUIC8080、WebSocket8092、HTTP3000
二、前置条件
- 具备
iggy-server可执行文件(安装见《Ubuntu 22.04 安装 Apache Iggy 0.9.0 指南》篇)。 - 具备任意文本编辑器编辑 TOML。
- 了解 TOML 语法(
[h2]段、key = value)。
三、参数查看与修改方式
- 默认配置来源:
iggy-server启动时从当前工作目录解析core/server/config.toml。仓库源码自带完整示例(含每项注释)。
cd /opt/iggy
sed -n '1,80p' core/server/config.toml
实际首屏回显(示意):
# Root directory for server data. Environment override: IGGY_PATH.
path = "local_data"
[consumer_group]
rebalancing_timeout = "30s"
[data_maintenance.messages]
cleaner_enabled = true
interval = "1 m"
[http]
enabled = true
address = "127.0.0.1:3000"
# 其余段落从略,完整示例见仓库源码 core/server/config.toml
- 指定自定义配置:
IGGY_CONFIG_PATH=/etc/iggy/config.toml iggy-server
- 环境变量覆盖:任何键都可用
IGGY_前缀 + 下划线嵌套覆盖,优先级高于配置文件。示例见iggy-server --help:
IGGY_PATH=/data/iggy # 数据目录
IGGY_TCP_ADDRESS=127.0.0.1:8090 # TCP 监听
IGGY_HTTP_ADDRESS=0.0.0.0:3000 # HTTP 监听
IGGY_NODE_ADVERTISED_ADDRESS=localhost # 客户端拨号地址
IGGY_LOGGING_LEVEL=debug # 日志级别
IGGY_ROOT_USERNAME=root # root 用户名
IGGY_ROOT_PASSWORD=q1w2e3r4 # root 密码
- 命令行参数:
iggy-server -h仅提供少量启动开关(--fresh清空数据、--with-default-root-credentials、--replica-id N选集群节点);配置主体都在 TOML/环境变量。
四、参数总览(config.toml 全段)
| 段 | 职责 | 主要键 |
|---|---|---|
| 顶层 | 数据目录 | path |
[consumer_group] | 消费组再平衡 | rebalancing_timeout |
[data_maintenance.messages] | 段清理 | cleaner_enabled,interval |
[heartbeat] | 心跳 | enabled,interval |
[http] | HTTP/REST | enabled,address,max_request_size,web_ui |
[http.cors] | CORS | enabled,allowed_methods,allowed_origins |
[http.jwt] | JWT | algorithm,issuer,audience,access_token_expiry |
[http.metrics] | Prometheus | enabled,endpoint |
[http.tls] | HTTPS | enabled,cert_file,key_file |
[tcp] | TCP 二进制 | enabled,address |
[quic] | QUIC | enabled,address |
[websocket] | WebSocket | enabled,address |
[tcp.tls]/[quic.certificate]/[websocket.tls] | 各传输 TLS | enabled,cert_file,key_file |
[personal_access_token] | PAT | enabled |
[telemetry] | 遥测 | enabled,service_name |
[runtime] | 运行时 | path |
[logging] | 日志 | level,file_enabled,max_file_size 等 |
[encryption] | 加密 | enabled,key |
[memory_pool] | 内存池 | enabled,size,bucket_capacity |
[sharding] | 分片 | cpu_allocation,pin_cores 等 |
[cluster] | 集群/VSR | enabled,name,超时项,[[cluster.nodes]] |
[metadata] | 元数据共识 | prepare_queue_depth,journal_slots,clients_table_max |
[partition] | 分区共识 | wal_bytes_max,prepare_queue_depth 等 |
[message_bus] | 消息总线 | max_batch,max_message_size 等 |
五、核心参数分类详解
5.1 监听与传输段([tcp] [http] [quic] [websocket])
| 参数 | 默认值 | 说明 |
|---|---|---|
tcp.enabled / tcp.address | true / 127.0.0.1:8090 | TCP 二进制协议监听 |
http.enabled / http.address | true / 127.0.0.1:3000 | HTTP REST;web_ui=true 时 /ui 提供 Web 控制台 |
http.web_ui | false | 是否启用内置 Web UI(需 iggy-web feature 编译) |
http.max_request_size | 2 MB | HTTP 请求体上限,安全限制 |
quic.enabled / quic.address | true / 127.0.0.1:8080 | QUIC 监听 |
websocket.enabled / websocket.address | true / 127.0.0.1:8092 | WebSocket 监听 |
http.cors.allowed_origins | ["*"] | 允许跨域来源 |
http.jwt.algorithm / issuer | HS256 / iggy.apache.org | JWT 签名算法与签发者 |
http.jwt.access_token_expiry | 1h | 访问令牌有效期 |
http.metrics.endpoint | /metrics | Prometheus 指标端点 |
node.advertised_address | 派生自绑定地址 | 客户端拨号地址,绑定通配时必填 |
实测补充:IGGY_NODE_ADVERTISED_ADDRESS=localhost 在 Compose/通配绑定场景必须设置,默认监听本机 loopback 对外不可达。
5.2 内存池段([memory_pool])
内存池为消息缓冲复用,Iggy 是 Rust 服务无 JVM 堆,此段直接控制原生内存:
| 参数 | 默认值 | 说明 |
|---|---|---|
memory_pool.enabled | true | 是否启用内存池 |
memory_pool.size | 4 GiB | 池总预算,需为 4096 倍数,最小 512 MiB;超出部分用池外内存 |
memory_pool.bucket_capacity | 8192 | 每桶最大缓冲数(共 28 桶,4 KiB~512 MiB),需为 2 的幂,最小 128 |
环境变量:IGGY_MEMORY_POOL_SIZE、IGGY_MEMORY_POOL_BUCKET_CAPACITY。生产按内存调整,例如低内存服务器可 IGGY_MEMORY_POOL_SIZE=512MiB。
5.3 日志段([logging])
| 参数 | 默认值 | 说明 |
|---|---|---|
logging.path | logs | 日志相对 path 的子目录 |
logging.level | info | 日志级别;RUST_LOG 优先级更高 |
logging.file_enabled | true | 是否落盘到 local_data/logs |
logging.max_file_size | 500 MB | 单日志文件轮转阈值 |
logging.max_total_size | 4 GB | 全部归档日志上限,超出删最旧 |
logging.rotation_check_interval | 1 h | 轮转检查间隔 |
logging.retention | 7 days | 日志保留时长 |
环境变量:IGGY_LOGGING_LEVEL(如 debug)。诊断设 debug、生产默认 info。
5.4 加密段([encryption])
| 参数 | 默认值 | 说明 |
|---|---|---|
encryption.enabled | false | 是否对消息载荷与用户头做 AES-256-GCM 加密(元数据与结构头不加密) |
encryption.key | 空 | 32 字节 base64 密钥,enabled=true 时必填 |
5.5 集群与 VSR 段([cluster],多节点高可用)
默认单机 enabled=false;为高可用将 enabled=true 并给出本节点 --replica-id:
| 参数 | 默认值 | 说明 |
|---|---|---|
cluster.enabled | false | 是否集群模式 |
cluster.name | iggy-cluster | 集群名,等宽,变更需空数据目录(永久落盘身份) |
cluster.heartbeat_timeout | 5s | 主节点存活窗口,至少 2s 且 ≥4×commit_broadcast_interval |
cluster.commit_broadcast_interval | 500ms | 主节点向备份广播提交点周期 |
cluster.prepare_retransmit_interval | 250ms | 备份未确认时主节点重传 prepare 周期 |
cluster.view_change_retransmit_interval | 500ms | 视图切换期间重传周期 |
cluster.view_change_status_timeout | 5s | 视图切换卡死的兜底,≥4×重传间隔 |
cluster.request_start_view_retransmit_interval | 1s | 恢复节点请求 StartView 周期 |
cluster.view_probe_attempts_max | 5 | 恢复节点重探次数上限(1~100) |
cluster.repair_retry_interval | 1s | 日志修复窗口重请求周期 |
cluster.repair_gap_debounce_interval | 1s | 备份落后触发修复的窗口 |
cluster.repair_chunk_max | 128 | 每轮修复服务的 chunk 数,须 < peer_queue_capacity |
cluster.superblock_wedged_fatal_timeout | 2m | 超级块不可写导致 fail-stop 的超时,0 禁用,非零须 ≥30s |
[[cluster.nodes]] | 示例两节点 | name/ip/replica_id/ports{tcp,quic,http,websocket,tcp_replica} |
示例(仓库 config.toml 内置):
[cluster]
enabled = true
name = "iggy-cluster"
[[cluster.nodes]]
name = "iggy-node-1"
ip = "127.0.0.1"
replica_id = 0
ports = { tcp = 8090, quic = 8080, http = 3000, websocket = 8092, tcp_replica = 9090 }
[[cluster.nodes]]
name = "iggy-node-2"
ip = "127.0.0.1"
replica_id = 1
ports = { tcp = 8091, quic = 8081, http = 3001, websocket = 8093, tcp_replica = 9091 }
⚠️ 注意:集群模式下每个启用的传输在
ports须显式声明端口;节点用iggy-server --replica-id <N>选定自身配置。ip是副本级地址(字面 IP),客户端拨号地址用advertised_address。
[cluster.auth] / [cluster.tls]:副本间认证(PSK+BLAKE3)与 TLS(enabled、shared_secret、证书);[cluster.coordinator] 控制分片 0 的协调者放置。
5.6 分片段([sharding])
| 参数 | 默认值 | 说明 |
|---|---|---|
sharding.cpu_allocation | numa:auto | CPU 分配:all、数值、区间、NUMA 配置 |
sharding.pin_cores | true | 是否把分片线程钉到专属核心 |
sharding.inbox_capacity | 65536 | 每分片共享收件箱容量 |
sharding.reply_inbox_capacity | 1024 | 回复通道容量 |
sharding.poll_completion_capacity | 1024 | 单分片磁盘轮询容量 |
sharding.shutdown_drain_timeout | 10 s | 关闭时 drains 预算 |
sharding.shutdown_join_timeout | 30 s | 分片线程 join 硬超时 |
sharding.shutdown_poll_interval | 50 ms | 关闭轮询节奏 |
sharding.reconcile_periodic_interval | 1 s | 分区对账节拍 |
5.7 元数据共识段([metadata],分片 0 的 VSR 副本)
| 参数 | 默认值 | 说明 |
|---|---|---|
metadata.prepare_queue_depth | 32 | 元数据在途操作深度,上限 127(受视图切换位图限制) |
metadata.journal_slots | 1024 | 元数据 WAL 内存索引槽位数,须 ≥4×max(64,depth) |
metadata.clients_table_max | 8192 | 同时持有会话状态的客户端槽位数(2~65536) |
5.8 分区段([partition],每分区共识与存储)
| 参数 | 默认值 | 说明 |
|---|---|---|
partition.wal_bytes_max | 256 MiB | 分区 WAL 字节预算(4 KiB 倍数,128 MiB+8 KiB ~ 4 GiB) |
partition.wal_group_commit_delay_micros | 0 | 持久化前组提交等待(0~10000 微秒) |
partition.validate_checksum | true | 读段时校验校验和 |
partition.prepare_queue_depth | 32 | 分区在途 produce/offset 深度(1~127) |
partition.dedup_clients_max | 4096 | 每分区组追踪去重请求水位的客户端数(1~65536) |
partition.consumer_offsets_max | 4096 | 消费者 offset 槽位 |
partition.offset_reservation_lease | 65536 | offset 预留租约 |
partition.evicted_ring_capacity | 65536 | 逐出环形缓冲容量 |
partition.evicted_ring_bytes_max | 67.11 MiB | 逐出环形缓冲字节上限 |
💡 说明:
partition是逐分区的共识管线,调大prepare_queue_depth会按分区数倍增钉住内存,生产须克制。
5.9 消息总线段([message_bus])
| 参数 | 默认值 | 说明 |
|---|---|---|
message_bus.max_batch | 256 | 合并进单次 writev 的最大条目,上限 IOV_MAX/2=512 |
message_bus.max_message_size | 64 MiB | 单帧消息上限,冻结 256 MiB 兜底;超 64 MiB 会破坏 Go 客户端 |
message_bus.peer_queue_capacity | 4096 | 副本对等 mpsc 队列容量 |
message_bus.client_queue_capacity | 256 | 每 SDK 连接出入队容量 |
message_bus.reconnect_period | 1 s | 对更大 peer_id 的重连周期 |
message_bus.close_peer_timeout | 2 s | 对等关闭排空超时 |
message_bus.close_grace | 2 s | stream.shutdown/ws.close 宽限 |
message_bus.handshake_grace | 10 s | 单连接握手阶段超时(防 slowloris) |
六、Topic 级选项(iggy options topic,创建时可配)
以下选项不在 config.toml,而是创建 topic 时通过 CLI --set key=value 或 HTTP options 字段设置;服务端 options 子命令输出如下(0.9.0 实测):
| 键 | Kind | 默认值 | 说明 |
|---|---|---|---|
compression_algorithm | string | none | 压缩算法(none/gzip),仅记录不实际压缩 |
message_expiry | uint64 | 18446744073709551615 | 消息过期(微秒或 "7 days") |
max_topic_size | uint64 | 18446744073709551615 | 全 topic 密封段大小上限(跨分区均摊) |
segment_size | uint64 | 1073741824 | 段大小(1 MiB~1 GiB,512 倍数) |
durability | string | replicated | 消息完成策略:replicated/persisted |
consumer_offset_durability | string | replicated | offset 完成策略:replicated/persisted |
messages_required_to_save | uint32 | 1024 | 消息条数刷盘触发 |
size_of_messages_required_to_save | uint64 | 1048576 | 字节数刷盘触发 |
preallocate_segments | bool | false | 段打开时是否预分配磁盘 |
CLI 查看方式:
iggy options topic
实际回最后一次(节选关键行,表格完整列见 iggy options topic 全量输出)。
七、生产配置模板
适用场景:16 GB 内存、NVMe SSD、单机(cluster.enabled=false)、OLTP 消息流(低延迟读写混合),端口对外 0.0.0.0。
/etc/iggy/config.toml:
path = "/var/lib/iggy"
[tcp]
address = "0.0.0.0:8090"
[http]
address = "0.0.0.0:3000"
web_ui = true
cors = { allowed_origins = ["*"], allowed_methods = ["GET", "POST", "PUT", "DELETE"] }
[http.jwt]
encoding_secret = "a3Zlcm5hdGVkLWlnZ3ktJTQyLXNlY3JldC0yMDI2LS1zZWNyZXQtZW5jb2RlLTE="
decoding_secret = "a3Zlcm5hdGVkLWlnZ3ktJTQyLXNlY3JldC0yMDI2LS1zZWNyZXQtZGVjb2RlLTE="
[quic]
enabled = false
[websocket]
enabled = false
[memory_pool]
enabled = true
size = "2 GiB"
bucket_capacity = 4096
[logging]
level = "info"
max_file_size = "500 MB"
max_total_size = "4 GB"
retention = "7 days"
[partition]
prepare_queue_depth = 32
dedup_clients_max = 4096
[message_bus]
max_batch = 256
max_message_size = "64 MiB"
💡 说明:内存 16 GB 场景把内存池压到 2 GiB,其余留给消息缓冲与系统;NVMe 场景可保持
max_batch=256以增大 writev 批量;QUIC/WebSocket 按需关闭以少开端口。JWT 的encoding_secret/decoding_secret用于重启后令牌仍有效(否则每次重启重生成随机密钥)。
内存/磁盘选型对照:
| 场景 | 内存池 | 建议 |
|---|---|---|
| 8 GB 入门 | 512 MiB~1 GiB | 低并发,bucket_capacity=2048 |
| 16 GB OLTP(本文档) | 2 GiB | 中并发,JDK 无堆,partition.prepare_queue_depth=32 |
| 64 GB 高吞吐 | 8~16 GiB | 高并发,prepare_queue_depth 视分区数权衡 |
八、常见问题
Q1:配置变更后如何生效?
配置文件/环境变量在启动时读取,需重启 iggy-server(systemd:systemctl restart iggy)。
Q2:改了 cluster.name 后无法启动?
cluster.name 经哈希写入首个启动数据的集群 ID;改后会因恢复的 ID 与配置不符而拒绝启动。需用空数据目录启动(改名即换新目录)。
Q3:为什么 IGGY_HTTP_ADDRESS=0.0.0.0:3000 后客户端仍连不上?
通配绑定需同时声明客户端拨号地址 IGGY_NODE_ADVERTISED_ADDRESS=<主机名或IP>(node.advertised_address),否则集群元数据/重定向拿不到可路由地址。
Q4:JWT 重启后失效?
未配 http.jwt.encoding_secret/decoding_secret 时每次启动随机生成,旧 token 失效。生产务必配置固定密钥。
Q5:如何提高写入吞吐?
调大 message_bus.max_batch(≤512)、memory_pool.size,并把存储放 NVMe;Iggy 无 JVM 堆,核心是内存池与磁盘 IO 并行度([sharding] CPU 分配)。