Garage v2.4.1 配置参数详解
逐参数详解 Garage v2.4.1 的 garage.toml 配置文件,覆盖元数据存储与 db_engine、复制与一致性、RPC 集群通信、S3/K2V/Admin API、压缩与节点发现,全部参数附实测回显与无效值报错样例
Garage v2.4.1 配置参数详解
目标:逐参数讲透 Garage v2.4.1 的
garage.toml配置文件——每个参数的位置、类型、默认值、实测行为与无效值报错样例,并给出按场景划分的生产配置模板。全部参数行为均在 Ubuntu 22.04 + Garage v2.4.1 实测验证。
一、环境信息
- 操作系统:Ubuntu 22.04(x86_64)
- Garage:v2.4.1 静态二进制(features 含 fjall/lmdb/sqlite/k2v/consul-discovery/kubernetes-discovery)
- 配置文件:
/etc/garage.toml(CLI 默认路径;可用GARAGE_CONFIG_FILE或-c改变) - 实测方式:修改配置后前台启动
garage server观察日志与报错,或用garage -c <测试配置> server并行验证多套参数
二、前置条件
- Garage v2.4.1 已安装(安装见《Garage v2.4.1 Ubuntu 22.04 安装指南》);
- 能编辑
/etc/garage.toml并重启服务(systemctl restart garage); - 了解 Garage 基本架构:元数据(bucket/key/对象索引)存元数据引擎,对象内容按 1MiB 分块存数据目录,集群状态靠 RPC 同步。
三、参数查看与修改方式
3.1 查看当前生效配置
Garage 无 dump-config 子命令,当前配置即 /etc/garage.toml 内容;启动时加载的配置文件路径会打印在日志第一行:
systemctl status garage --no-pager | grep -m1 'Loading configuration'
实测回显:
Oct 17 04:29:53 garage-server garage[2937]: 2026-10-17T04:29:53.859942Z INFO garage::server: Loading configuration from /etc/garage.toml...
3.2 修改方式与生效条件
- 文件修改:编辑
/etc/garage.toml→systemctl restart garage生效(Garage 启动时一次性读取,不支持热加载); - 命令行覆盖:
garage -c /path/to/garage.toml指定配置文件;--rpc-secret、--admin-token等可临时覆盖密钥类参数(用于远程管理别的节点); - 环境变量覆盖:
GARAGE_前缀 + 大写路径,如GARAGE_METADATA_DIR=/var/lib/garage/meta、GARAGE_REPLICATION_FACTOR=1,优先级高于 toml 文件; - 集群布局类参数(节点容量、zone)不在 toml 里改,用
garage layout assign/apply(见《Garage v2.4.1 快速入门(集群初始化与 S3 实测)》)。
3.3 配置错误的第一现场
所有配置错误都在启动时报出且进程退出,看服务日志即可定位:
journalctl -u garage -n 5 --no-pager
实测回显(配置文件缺失时):
Oct 17 04:28:20 garage-server garage[1528]: 2026-10-17T04:28:20.684704Z INFO garage::server: Loading configuration from /etc/garage.toml...
Oct 17 04:28:20 garage-server garage[1528]: Error: Failed to read config file /etc/garage.toml: No such file or directory (os error 2)
四、参数总览
| 参数([节] 参数) | 类型 | 默认值 | 作用 |
|---|---|---|---|
| metadata_dir | 字符串 | 无(必填) | 元数据存储目录 |
| data_dir | 字符串 | 无(必填) | 对象数据块目录 |
| db_engine | 字符串 | fjall | 元数据引擎:fjall / lmdb / sqlite |
| metadata_fsync | 布尔 | false | 元数据写入 fsync(仅 lmdb/sqlite 支持) |
| data_fsync | 布尔 | false | 数据块写入 fsync |
| metadata_auto_snapshot_interval | 字符串 | 6h | 元数据自动快照间隔(0 关闭) |
| block_size | 整数 | 1 MiB | 对象分块大小 |
| compression | 整数/none | 1 | 数据块 zstd 压缩级别,0/none 禁用 |
| replication_factor | 整数 | 无(建议显式) | 每分区副本数(v2.x 新键) |
| consistency_mode | 字符串 | consistent | 一致性模式,v2.4.1 实测仅接受 consistent |
| rpc_bind_addr | 字符串 | 无(必填) | RPC 监听地址 |
| rpc_public_addr | 字符串 | 无(集群必填) | 集群内可达的本机地址 |
| rpc_secret | 字符串 | 无(集群必填) | 集群共享密钥(32 字节 hex) |
| rpc_secret_file | 字符串 | 无 | 从文件读 rpc_secret |
| bootstrap_peers | 字符串数组 | [] | 启动时尝试连接的节点列表 |
| allow_world_readable_secrets | 布尔 | false | 放宽密钥文件权限检查 |
| [s3_api] s3_region | 字符串 | 无(必填) | S3 region 名 |
| [s3_api] api_bind_addr | 字符串 | 无(必填) | S3 API 监听地址 |
| [s3_api] root_domain | 字符串 | 无 | 虚拟主机风格域名后缀 |
| [s3_web] bind_addr | 字符串 | 无 | 静态网站监听地址 |
| [s3_web] root_domain | 字符串 | 无 | 网站虚拟主机域名后缀 |
| [s3_web] index | 字符串 | index.html | 目录默认页文件名 |
| [k2v_api] api_bind_addr | 字符串 | 无 | K2V API 监听(需 k2v feature) |
| [admin] api_bind_addr | 字符串 | 无 | Admin API 监听地址 |
| [admin] admin_token | 字符串 | 无 | Admin API 令牌(/v2/* 鉴权) |
| [admin] metrics_token | 字符串 | 无 | /metrics 端点令牌 |
💡 技术拓展:元数据引擎(db_engine)三选一对比——
引擎 实测启动日志 特点 适用场景 fjall(v2 默认) Opening Fjall database at: .../db.fjallLSM 式 KV,写入吞吐好,不支持 metadata_fsync 默认选择,通用 lmdb Opening LMDB database at: .../db.lmdb内存映射 B+ 树,成熟稳定,支持 fsync/快照 追求久经考验的稳定性 sqlite Opening Sqlite database at: .../db.sqlite单文件,便于用 SQLite 工具直接查看 调试、元数据人工排查 本文默认采用 fjall(官方 v2.x 推荐);需要 metadata_fsync 强持久化时选 lmdb。切换引擎不会自动迁移数据,需用
garage convert-db子命令离线转换(garage convert-db --help可查参数)。
五、核心参数分类详解
5.1 存储路径与数据目录(metadata_dir / data_dir)
metadata_dir:元数据目录,存db.fjall(或 db.lmdb/db.sqlite)、集群布局cluster_layout、节点密钥node_key/node_key.pub、邻居列表peer_list等。IO 密集,建议独立 SSD;data_dir:对象数据块目录,按内容寻址散列存放 1MiB 块文件,可多盘扩展(data_dir可写多行声明多个目录实现盘间分散)。
实测目录结构(单节点初始化后):
/var/lib/garage/meta/
├── cluster_layout
├── data_layout
├── db.fjall/
├── lifecycle_worker_state
├── node_key
├── node_key.pub
└── peer_list
⚠️ 注意:两目录权限必须归运行用户(如 garage),root 手动启动会留下 root 属主文件导致后续启动
Permission denied(实测报错与修复见《Garage v2.4.1 Ubuntu 22.04 安装指南》FAQ 7.5)。
5.2 元数据引擎与持久化(db_engine / metadata_fsync / data_fsync / 快照)
db_engine = "fjall" | "lmdb" | "sqlite":三种引擎全部实测可用,无效值报错实测:
Error: Invalid `db_engine` value in configuration file: database error: Invalid DB engine: rocksdb (options are: lmdb, sqlite, fjall)
metadata_fsync:每次元数据提交都 fsync。fjall 引擎不支持,配 true 直接启动失败(实测):
2026-10-17T04:28:40.235172Z INFO garage_db::fjall_adapter: Opening Fjall database at: /var/lib/garage/meta/db.fjall
Error: Unable to open metadata db: database error: metadata_fsync is not supported with the Fjall database engine
用法:fjall 下删除该参数;lmdb/sqlite 下可设 metadata_fsync = true 换取断电安全(牺牲少量写延迟);
data_fsync = false:数据块落盘 fsync,默认关闭(性能优先);开启可进一步降低掉电丢块风险;metadata_auto_snapshot_interval = "6h":每 6 小时自动做一次元数据快照到metadata_dir/snapshots/<UTC 时间戳>/。手动快照命令(运行中可执行,实测):
garage meta snapshot
实测回显:
Node Result
d0bb67c993d97376 Snapshot created
实测快照落盘位置:
/var/lib/garage/meta/snapshots/2026-10-17T04:40:05Z/db.fjall/
5.3 分块与压缩(block_size / compression)
block_size:对象内容分块大小,默认 1 MiB。调大减少块数降低元数据压力,调小提升小改大对象时的去重粒度,一般不动;compression:数据块 zstd 压缩级别,默认 1;compression = 0或compression = "none"禁用压缩。实测compression = 5、compression = "none"均可正常启动。压缩对已存数据不追溯,仅对新写入块生效;二进制媒体(已压缩)建议 0 省 CPU。
5.4 复制与一致性(replication_factor / consistency_mode)
replication_factor:每个分区的副本数,数字类型(usize)。v2.x 必须用本参数,v1.x 的replication_mode已移除(实测报错):
Error: The legacy replication_mode is no longer supported. Use replication_factor and consistency_mode instead.
类型错误实测(写成字符串):
Error: TOML decode error: TOML parse error at line 8, column 22
|
8 | replication_factor = "none"
| ^^^^^^
invalid type: string "none", expected usize
取值 1/2/3:1 单副本(单机测试)、2 双副本、3 生产推荐。集群布局的有效容量按 总容量 / 副本数 计算(garage layout show 的 Effective capacity (replication factor N))。修改副本数是重大变更,需配合 layout 变更并在官方指引下执行;
consistency_mode:读一致模式,默认consistent。v2.4.1 实测仅接受consistent,写成 eventual / read-after-write / read_after_write 均报:
Error: Invalid consistency_mode in config file.
保持默认即可,v1.x 时代文档描述的 eventual 等模式在 v2.4.1 尚不可用。
5.5 RPC 集群通信(rpc_bind_addr / rpc_public_addr / rpc_secret / bootstrap_peers)
rpc_bind_addr = "[::]:3901":RPC 监听,[::]双栈;3901 是集群内部端口,不要暴露公网;rpc_public_addr:本节点在集群中的对外地址,集群部署必填。实测必须写 IP:port 形式(写主机名时 bootstrap 解析失败,实测日志):
WARN garage_rpc::system: Unable to parse and/or resolve peer hostname node1:3901
rpc_secret:32 字节 hex 集群密钥(openssl rand -hex 32生成),同集群全部节点必须一致。安全起见可用rpc_secret_file = "/etc/garage/rpc_secret"从 0600 权限文件读取;把密钥放进全组可读文件时会触发权限检查报错,此时才需要allow_world_readable_secrets = true(不推荐);bootstrap_peers:启动时自动连接的引导节点列表。v2.4.1 实测格式必须是<完整节点ID>@<IP>:<端口>(写裸IP:端口或主机名均报Unable to parse and/or resolve peer hostname)。完整 ID 用对端节点的garage node id获取:
garage node id | head -1
实测回显:
1f55dfb376baabbe29f0b4c1cdbdb97e91a8981b4d0ef56c73f177c76427c988@127.0.0.1:3901
集群配置写法(node2 的 toml 片段,实测可用):
bootstrap_peers = [
"d0bb67c993d97376770f9583a11c52512c1b81b5d31e82f8a234ee937c522a32@172.29.0.2:3901",
"37905798112536c4d676dec47938928afa54d161735f913b81d7cdc97dce9647@172.29.0.4:3901",
]
运行期临时连接可用 garage node connect <完整ID@IP:端口>;节点发现还支持 consul/kubernetes(feature 已编译启用,详见官方文档对应小节)。
5.6 S3 API([s3_api])
s3_region = "garage":region 名,客户端签名必须与此一致,不一致的实测报错:
aws: [ERROR]: An error occurred (AuthorizationHeaderMalformed) when calling the ListBuckets operation: Authorization header malformed, unexpected scope: '20261017/us-east-1/s3/aws4_request', expected: '20261017/garage/s3/aws4_request'
api_bind_addr = "[::]:3900":S3 兼容 API 监听;root_domain = ".s3.garage.localhost":虚拟主机风格访问的后缀(bucket.s3.garage.localhost → bucket)。仅用路径风格(endpoint/bucket/key)可不配;配了之后除 IP:3900 路径风格外,还接受子域访问。
5.7 静态网站托管([s3_web])
bind_addr = "[::]:3902":网站监听;root_domain = ".web.garage.localhost":网站域名后缀,bucket 需先开启网站访问(garage bucket website --allow <bucket>);index = "index.html":目录请求的默认页。
5.8 K2V API([k2v_api])
api_bind_addr:K2V 键值 API 监听(通常 3904)。二进制 features 含k2v才可用;K2V 面向「批量简单 KV 读写 + 队列语义」场景,普通 S3 需求不需要开启。
5.9 Admin API([admin])
api_bind_addr = "[::]:3903":管理监听。鉴权实测结论:根路径/health免令牌(返回 "Garage is fully operational"),/v2/*一律要求Authorization: Bearer <admin_token>,否则 403:
{
"code": "AccessDenied",
"message": "Forbidden: Bearer token must be provided in Authorization header",
"region": "garage",
"path": "/v2/GetClusterHealth"
}
admin_token:管理令牌(32 字节随机串,演示用q1w2e3r4-admin);支持admin_token_file从文件读取;命令行--admin-token可临时覆盖;metrics_token:/metricsPrometheus 端点专用令牌(与 admin_token 分离,便于给监控最小授权)。
5.10 其他系统参数
allow_world_readable_secrets = false:默认拒绝全组可读的密钥文件,防止误配泄露;- 日志输出:默认打 stdout(journald 收取);二进制 features 含 journald/syslog,可按需接入系统日志(详见官方配置参考的 log 部分)。
六、生产配置模板
6.1 单节点(开发/个人自托管,1 核 1GB 内存即可)
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "fjall"
metadata_auto_snapshot_interval = "6h"
replication_factor = 1
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "24ffffd3332bdb8cfcd478a3d8d652420d936ee9521fe780bafe8ef6874e8928"
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
[admin]
api_bind_addr = "[::]:3903"
admin_token = "q1w2e3r4-admin"
适用:单机、无冗余,数据可重建;实测空闲内存占用约 3MB 级。
6.2 三节点三 zone 生产(各节点 4 核 8GB、SSD、跨机房)
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "lmdb"
metadata_fsync = true
metadata_auto_snapshot_interval = "6h"
replication_factor = 3
consistency_mode = "consistent"
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "192.168.1.11:3901"
rpc_secret_file = "/etc/garage/rpc_secret"
bootstrap_peers = [
"d0bb67c993d97376770f9583a11c52512c1b81b5d31e82f8a234ee937c522a32@192.168.1.11:3901",
"146172322f18f7bab5ab8d7ca0f87c290a1d7a351ddb8f2668f8f2dd3c19708b@192.168.1.12:3901",
"37905798112536c4d676dec47938928afa54d161735f913b81d7cdc97dce9647@192.168.1.13:3901",
]
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
[admin]
api_bind_addr = "[::]:3903"
admin_token = "q1w2e3r4-admin"
适用:生产三副本跨 zone;rpc_public_addr 每节点各写自己的 IP(192.168.1.11/12/13);完整节点 ID 用各节点 garage node id 的实测输出替换;rpc_secret_file 指向 0600 权限的共享密钥文件。容灾能力与故障演练实测见《Garage v2.4.1 进阶实战与运维》。
七、常见问题(FAQ)
Q1:改完配置重启没生效?
Garage 仅在启动时读配置,确认执行了 systemctl restart garage;若 unit 里用了 GARAGE_CONFIG_FILE 环境变量,确认指向的文件才是你改的那份。环境变量 GARAGE_* 优先级高于 toml,逐一排查。
Q2:启动报 The legacy replication_mode is no longer supported?
v1.x 旧键。改为 replication_factor = <数字>;单机为 1。
Q3:启动报 metadata_fsync is not supported with the Fjall database engine?
fjall 引擎不支持该参数。要么删掉/注释 metadata_fsync,要么 db_engine = "lmdb" 后再启用。
Q4:Invalid consistency_mode in config file?
v2.4.1 只接受 consistency_mode = "consistent"(默认值,可直接删掉该行)。
Q5:Invalid DB engine:rocksdb?
db_engine 只接受 fjall/lmdb/sqlite(实测报错原文:Invalid DB engine: rocksdb (options are: lmdb, sqlite, fjall))。旧教程中的 sled 在 v2.x 已移除。
Q6:Unable to parse and/or resolve peer hostname?
bootstrap_peers 或 rpc_public_addr 写了主机名或裸 IP:端口。v2.4.1 要求:rpc_public_addr 用 IP:端口;bootstrap_peers 用 <完整节点ID>@<IP>:<端口>(对端 garage node id 获取)。
Q7:怎么把元数据从 fjall 迁到 lmdb?
先 garage meta snapshot 快照并停服备份元数据目录,再用 garage convert-db --help 按官方指引做离线转换(转换期间集群必须停写),转换后改 db_engine 启动验证。切换前务必演练备份恢复。