Repository navigation
v1.28.0
v1.28.0
升级与安全加固版:Raft 日志格式标记与旧区间有界压缩,M8 follower restore 以 applied 行自身 fence_term 收口,AP 新增直连 mTLS 与 AWS PrivateLink API 验证,CMK 支持离线全量迁移回 legacy provider,Level C 只读排空,JWT 多密钥轮换,feature 9 提供 opt-in 复制用量账本(严格硬配额),并补上真实 v1.26.0 蓝绿、MPU 排空与单机→集群 e2e。
新增
- Raft 日志加固:
raft_meta.raft_log_format记录日志格式(缺失/1= 旧格式,2= 压缩/分段;更高或无法解析的值 fail-closed)。v1.27 建库但尚无标记的库,open 时若发现z1:行或分段即在同一BEGIN IMMEDIATE事务内补写2;append每次最多做两段有界压缩(最新连续段 + 一段更旧区间,各 ≤1024 行/16 MiB),旧区间不会永久停滞;20k entry soak 通过。 - M8 Restore fencing:follower 发起的
TierRestoreDelete在UNFENCED(term 0)时不再盲删,改用本地 applied 行自身的fence_term作为 token;行缺失时不 append(由 leader reaper 收敛),apply 端按fence_term <= token幂等删除。新增 3-voterraft_restore_failover演练。 - AP 端点身份:新增
OSS_AP_ENDPOINT_VERIFIER=mtls与aws-api。mtls把 rustls 握手已验证的客户端叶证书 SHA-256 经ApConnInfo映射到端点,配置OSS_AP_MTLS_ENDPOINTS=<sha256>=<vpce>[=<vpc>[=<account>]];...(重复指纹/畸形 ID 拒绝启动);aws-api用 SigV4 调 EC2DescribeNetworkInterfaces/DescribeVpcEndpoints,按直连源 IP 解析 ENI→VPC endpoint(唯一命中且State=available),源 IP+60s TTL 缓存,API 错误 fail-closed;要求 NLB/网关保留客户端源 IP,可选OSS_AP_VPC_ID/OSS_AP_AWS_ACCOUNT_ID交叉校验。 - CMK→legacy 迁移:
oss-server cmk rewrap --name <cmk> --to-legacy sse-s3|sse-kms [--apply]把引用该 CMK 的对象版本逐版本全量重加密为 pre-CMK provider(sse-s3file key,或sse-kms默认环当前k<n>)。在扫描/写入前 fail-closed 拒绝在途 MPU、桶默认引用与缺失目标 provider;每个版本独立重加密,绝不自动删除 CMK。旧文档中「不能迁移到 legacy」的说法已更正:现在可以显式离线迁移,但 meta-only 降级仍不可能。 - Level C 只读排空:顶层
read_only = true让节点从客户端写路径摘除;写请求返回 503 并带x-oss-read-only: 1,GET/HEAD/OPTIONS、精确POST /api/v1/login、健康/指标与 Raft RPC 保持可用,/health/cluster暴露read_only。 - JWT 密钥轮换:
jwt_previous_secrets接受旧签名密钥数组(每项 ≥32 字节、互不重复且不同于jwt_secret);验证阶段多密钥共享黑名单与过期检查。轮换顺序:把当前密钥加入jwt_previous_secrets→ 全部节点重启 → 切换jwt_secret→ 全部节点重启 → 12 小时后移除旧密钥。登录限流与审计仍为节点本地。 - 严格硬配额(feature level 9):新增
AccountUsageReserve/AccountUsageRelease/AccountUsageAdjust复制账户用量账本(account_usage_ledger,OSSCTL3 快照ControlData携带);[quota].strict = true(或OSS_ACCOUNT_QUOTA_STRICT=1)时 xl-s3 的 Put/Complete/Copy 经 Raft 预留,删除/失败释放或校准,判定只读复制后的账本。默认仍为各节点account_usage本地缓存(30s 惰性/60s 采样、有界陈旧),非严格模式行为不变。Raft 模式要求[raft].feature_level = 9,全 peer 生效 9 才可 append;level <9 快照装到已有账本行的库会拒绝。严格模式是保守口径:首次触达按 leader 本地缓存播种(最旧 60s)、未知长度 Put 写后校准可短暂超额、版本定向/SSE-C 删除不释放、预留后崩溃留账、命令非幂等且结果不明 fail-closed 不重试;会多记/阻塞至人工对账。 - 升级与运维:
tests/e2e_blue_green.sh用真实 v1.26.0 → 当前二进制在同一数据目录切换并验证冷备回滚(22/22 PASS);scripts/mpu-drain.sh列出/中止在途 MPU(只处理未完成上传,绝不删除已提交对象),自检 43/0;tests/e2e_single_to_cluster_real.sh用两个回环服务器跑 plan/copy/verify/resume(6/6 PASS);upgrade-preflight.sh自检 109/0、blue-green-preflight.sh自检 78/0。混合 v1.16 MPU e2e(tests/e2e_mpu_mixed.sh)已编写但未执行。
兼容性 / 升级前置
- Raft 日志格式是单向门:新二进制写过格式
2后旧二进制无法读取;升级仍按停写蓝绿执行,回滚只在未发生新格式/CMK 写入时成立。日志格式没有 feature-level 门控。 - CMK 迁移守卫:
--to-legacy仅在离线 CLI、非集群([cluster]/[stretch]会拒绝)下可用;迁移前必须 Complete/Abort 全部 MPU、把桶默认加密切到目标 provider,并确认目标 provider 已配置。迁移不删除 CMK;meta-only 降级仍不可能;回滚到 pre-CMK 二进制必须完成全量迁移或迁移到新集群。 - 只读排空:
read_only只约束新二进制。旧二进制没有该开关,混版窗口内必须由 LB/客户端移除旧节点的写流量;不能把只读开关当作跨版本写保护。 - JWT 轮换:多节点必须逐台重启,旧密钥保留至少 12 小时;登录限流与审计仍按节点本地,不做集群级复制。
- 严格硬配额(feature 9):opt-in,默认关闭;Raft 模式要求全集群
[raft].feature_level = 9且所有 peer 生效 9,旧节点会在 append 前被拒。账本命令非幂等,append 结果不明时写入 fail-closed 且不重试;版本定向/SSE-C 删除不释放、预留后崩溃留账、首次触达播种最旧 60s、未知长度写后校准可短暂超额。启用后不要按本地缓存口径对账;自动对账/存量精确迁移未交付。 - OSSCTL3 快照:feature 9 账本行随快照复制;level <9 快照装到本机已有账本行的库会拒绝安装(避免整表替换静默丢用量),需要先按 level 9 恢复或人工导出账本。
- 真实 AWS PrivateLink 验收:
aws-api只用本地 mock 覆盖签名请求形状、响应解析、状态判定与缓存;上线前必须在真实 AWS 账号中验证,并确认 NLB/网关保留客户端源 IP。 - 混合 v1.16 MPU e2e 未执行:受宿主 I/O 饱和影响,v1.16 二进制未能构建,
tests/e2e_mpu_mixed.sh未运行;不得据此宣称混合版本 MPU 通过。
验证
wave-5 分套件闸门:
raft::store26/0(含 20k entry soak、格式 marker 回归、旧区间压缩、未知格式 fail-closed)。xl-s3ap 37/0、m8_ap_trust22/0、ap_aws4/0。xl-storecmk 23/0、CLI 18/0。read_only2/0、config 1/0;jwt_rotation4/0、config 2/0。- lib restore 3/0、
raft_restore_failover1/0、restore/lease 3/0。 - feature 9:lib
quota2/0、accounts --testquota 7/0、raft_quota_ledger4/0、snapshot 18/0、compat 20/0;xl-s3 lib 通过(未单独计数);合并后oss-server --lib279/0。 - 脚本:蓝绿 e2e 22/22 PASS、
mpu-drain.sh自检 43/0、upgrade-preflight109/0、blue-green-preflight78/0;单机→集群真实 e2e 6/6 PASS。
完整 cargo test --workspace 未在宿主高负载下聚合运行,发布以分 crate/分套件闸门为准。
仍未交付
- 严格配额账本的自动对账/存量精确迁移:feature 9 已提供 opt-in 复制账本,但严格模式会多记/阻塞至人工对账(首次触达播种最旧 60s、未知长度写后校准可短暂超额、版本定向/SSE-C 删除不释放、预留后崩溃留账、命令非幂等且结果不明不重试);默认硬配额仍为 30s/60s 有界陈旧本地缓存。
- 集群级登录限流与审计复制:两者按设计保持节点本地,JWT 轮换不改变这一点。
- 真实 AWS PrivateLink 端到端验收:仅 mock 测试,需要真实 AWS 账号并保留客户端源 IP。
- 混合 v1.16 MPU e2e 执行:脚本已编写,v1.16 二进制在宿主负载下构建失败。
- 任意双向混写:不打补丁的旧二进制无法安全写新数据;安全运维模型是只读排空 + 从 LB 移除旧节点。
- 集群在线 CMK→legacy 迁移:
--to-legacy是离线 CLI,[cluster]/[stretch]配置会拒绝。 - 站点部署凭据:仓库没有 deploy target,线上站点为人工 VPS 发布。
- Raft 日志格式的 feature-level 门控:当前只能按停写蓝绿约束。