Skip to content

v1.28.0

Choose a tag to compare

@erikwang2013 erikwang2013 released this 31 Oct 18:48
· 180 commits to main since this release

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-voter raft_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 调 EC2 DescribeNetworkInterfaces/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-s3 file 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::store 26/0(含 20k entry soak、格式 marker 回归、旧区间压缩、未知格式 fail-closed)。
  • xl-s3 ap 37/0、m8_ap_trust 22/0、ap_aws 4/0。
  • xl-store cmk 23/0、CLI 18/0。
  • read_only 2/0、config 1/0;jwt_rotation 4/0、config 2/0。
  • lib restore 3/0、raft_restore_failover 1/0、restore/lease 3/0。
  • feature 9:lib quota 2/0、accounts --test quota 7/0、raft_quota_ledger 4/0、snapshot 18/0、compat 20/0;xl-s3 lib 通过(未单独计数);合并后 oss-server --lib 279/0。
  • 脚本:蓝绿 e2e 22/22 PASS、mpu-drain.sh 自检 43/0、upgrade-preflight 109/0、blue-green-preflight 78/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 门控:当前只能按停写蓝绿约束。