跳转到主要内容

SILO 20261109:生命周期、对象锁与批处理授权

SILO Server 20261109 发布说明:多池生命周期与两阶段恢复修复、S3 DeleteObjects 与复制删除的 Object Lock 保护、绑定提交者权限的批处理作业、Console 2.7.0、mcli 20261109 与 silo-pkg 3.16.0。

SILO Server 20261109 已正式发布。 标签为 RELEASE.2026-11-09T00-00-00Z,软件包版本为 20261109000000.0.0,源码提交为 d998292387cc。本版本汇总了 Server 20261026 之后的全部服务端维护修复,并内嵌 Console 2.7.0、mcli 20261109 与 silo-pkg 3.16.0。

GitHub Release · 完整变更日志 · 升级指南 · 下载安装

组件版本

组件 正式版本 固定源码
SILO Server RELEASE.2026-11-09T00-00-00Z,包版本 20261109000000.0.0 d998292387ccf1d2907749e0fb1575ef5fb93fda
内嵌/独立 Console v2.7.0 4e91ae506e706ccdecb512b1d8b5ab4d9871d505
MC 模块/镜像内置 mcli 20261109 e1d4cc5abfe00b674eb36347399e7398990be467
共享包 silo-pkg v3.16.0 b7aeea85e84e8888d6ab424c7123a1297711bc3f
可选外部 KES 20261026 e9b4f1acebc11d61b42f876da8df48f548750cc9
Go/上游 S3 SDK Go 1.27.3/固定上游 minio-go/v7 v7.4.2-0.20261025165926-320af050c445

完整 Go 模块版本见组件版本矩阵。单独升级独立版 Console、mcli 或 silo-pkg 不会替换旧版 Server 二进制中的内嵌组件。KES 保持独立、可选的外部密钥服务与独立发版节奏。正式支持维护中的 PGSTY 组件栈;对上游 MinIO/MC 保持尽最大努力兼容。

生命周期、多池与远端分层

  • 跨池生命周期仲裁: 在对象锁内结合该 key 在所有池中的权威版本历史与锁保护状态重新核验过期条件。历史或锁状态缺少权威仲裁时拒绝删除;rebalance 与 decommission 会迁移这些无法安全过期的版本。获准的版本过期会清除各池中的全部副本。
  • 精确 key 整键删除: ExpiredObjectAllVersions、DelMarkerExpiration 与批处理 retainVersions: 0 仅删除精确匹配的 key,不再波及同前缀下的子键;整键清理若包含分层版本或受 Object Lock 保护的版本则拒绝执行。见精确 key 删除。
  • 远端分层与恢复副本: --days 到期时仅移除本地临时恢复副本,保留底层分层版本;只要其他池仍引用远端载荷就保留该远端对象,并将分层清理使用的内部 free version 排除在可见版本历史与生命周期判定之外。
  • 规则执行与统计: 启用仅含 DelMarkerExpiration 的生命周期规则,仅统计实际发生的移除,并在版本历史损坏阻碍过期时排队触发修复。生命周期生成的删除标记与版本清理不再进入复制队列,与 S3 生命周期语义一致。
  • 存储池迁移: 支持跨不同纠删码布局迁移版本,在 rebalance 与 decommission 中迁移已被 ILM 判定过期的当前版本;单个存储桶退役失败时继续迁移其余存储桶并保持取消能力;无 rebalance 元数据时执行 rebalance stop 不再触发 panic。

详见多池生命周期与恢复副本过期。升级无法找回旧版本已误删的对象或远端载荷。

原生恢复、锁与读取

原生恢复改为两阶段执行:先在对象写锁之外下载远端分层数据,再持锁校验所有权并提交目标版本,解决多池恢复挂起、恢复到错误版本及普通分片上传完成失败后无法重试的问题。恢复失败或取消时,同步清理进行中标记最多等待 100 毫秒,随后交由有界后台重试循环继续清理,避免阻塞调用方长达 60 秒。见两阶段恢复。

单池写入与删除统一锁定在对象所属纠删集的锁域;CopyObject 正确处理规范化键别名且等待源对象锁时不再占住目标锁;普通批量删除的不同纠删集分组可并发执行;多池 CreateMultipartUpload 针对跨池逻辑当前对象评估 If-Match 与 If-None-Match。

节点仅观察到已有对象的部分磁盘视图时返回可重试的 503,避免误报 404 NoSuchKey;mcli admin heal --dry-run 保留悬空数据并将 dry-run 标志传递给远端节点存储桶修复;失败写入清理空对象目录,并将 xl.meta 校验和失败归类为可自愈损坏。

Object Lock、IAM 与批处理授权

S3 DeleteObjects 现在在保留期与法务保留更新共用的修改锁内重新核验物理版本删除,合并跨池保护状态并与并发锁状态变更串行互斥(6ef3a52fc);目录对象的 null 版本在批量删除前同样受锁校验。复制删除保留目标端的法务保留与保留期:源端绕过 GOVERNANCE 保留期执行的版本清除不会赋予目标端绕过权限,仍处于有效保留期内的目标副本会拒绝该清除并由源端重试。

批处理过期、密钥轮换与复制在执行全程强制校验已认证提交者的本地 S3 数据权限,并保留受 Object Lock 保护的版本。多池密钥轮换仅改写获准的池副本,保持其他池副本可读。身份撤销或绑定关系变化会终止作业;暂时性 IAM 或授权故障会暂停作业、记录原因并有界重试。启动发现支持在存储故障后重试恢复已保存作业,已完成的过期作业重启后保持完成状态,复制作业支持断点续扫。请通过 mcli batch status 区分 complete、complete-with-skips、paused 与 failed。

外部授权插件必须返回 HTTP 2xx 且携带显式布尔判定(result 或 result.allow);缺失/null 判定、尾随 JSON 或超过 1 MiB 的响应会被拒绝,单次调用超时上限为 1 分钟。升级前请验证自定义授权插件。

IAM 拒绝不完整的策略加载,在惰性加载期间保持已缓存认证可用,并直接基于持久化记录执行用户修改、服务账号变更与 LDAP 组刷新,防止旧缓存节点恢复旧凭据或复活已删除身份。同时修复纠删集上的长 DN LDAP 登录、启用 LDAP 时内嵌 Console 的 root 登录,以及节点间配置重载后的日志与审计 webhook 目标存活问题。

Console、客户端与依赖

内嵌与独立版 Console 2.7.0 将 2.6 的目录与存储桶用量扫描及可选 PostgreSQL worker 带入 SILO Server,新增十种界面语言与阿拉伯语 RTL,修复普通 HTTP 下的目录大小计算与解密密钥复制,为 console usage-worker 增加 --certs-dir CA 信任与仅计列举耗时的扫描预算,在 worker 停止时持久化待刷新的存储桶变更,拒绝畸形分片上传而不再 panic,并将 /api/v1/docs 路由至 Redoc 3。启动 2.7.0 worker 前须先停止旧版 worker;仅该可选服务需要 PostgreSQL。

mcli 20261109 修复 rm --purge --dry-run 误删、多源复制/搬移别名复用、自身搬移检查、分片 od 下载、mc cors、MC_REGION 与别名 region 签名、元数据处理及部分失败退出码。

silo-pkg 3.16.0 将 go-jose/v4 升至 v4.1.9、cpuid/v2 升至 v2.4.2、yaml/v3 升至 v3.0.6。Server 同步升级 gjson v1.20.1、NATS jwt/v2 v2.8.3 与 nkeys v0.4.17(拒绝单位点与小阶公钥)、Google Cloud auth v0.24.3 与 oauth2adapt v0.3.1、golang.org/x/net v0.62.0 及固定提交的 golang.org/x/crypto 2f1f834330b2。标准与 Distroless 容器镜像共享相同的 UBI CA 根证书束(/etc/ssl/certs/ca-certificates.crt)并在 /licenses/mcli 中附带 mcli 许可文件;Helm Chart 7.0.4 默认部署 SILO 与 mcli RELEASE.2026-11-09T00-00-00Z。

升级与回滚

  1. 切换版本前停止提交 Batch 作业,排空或取消全部运行中、等待中与暂停中的作业。 旧格式未完成作业需在全部节点升级后重新提交;已完成作业保持完成。新版提交者绑定清单与进度报告使用 20261026 拒绝的格式:仍有新格式作业未完成时切勿降级。请按 Batch 升级清单操作。
  2. 不兼容的单池布局必须排空停机升级。 若单池内各纠删集不全位于同一组主机上(自动布局通常为 18 台及以上主机),必须先停止全部旧进程再启动新进程;该布局下新旧删除/复制锁域不支持滚动混跑。
  3. 混合版本期间暂停新建恢复请求。 只要存在旧版本或不可达节点,新节点对 POST ?restore 返回 503。完整的多池生命周期与批量删除 Object Lock 保护同样要求所有服务节点完成升级。
  4. 重启后逐节点验证真实 S3 数据路径。 silo healthcheck ready 仅检查 HTTP 监听及已配置的 KMS / etcd,可能在存储或 IAM 完成加载前返回成功;cluster 仲裁成功也可能早于本机重连远端磁盘。恢复业务流量前,请对每个节点执行有界超时的签名写入与回读校验,并保留节点发现配置(包括 Kubernetes publishNotReadyAddresses: true)。详见健康检查探针。
  5. 复用 Helm values 时显式指定镜像标签。 helm upgrade --reuse-values 会保留此前保存的标签,请显式传入 --set image.tag=RELEASE.2026-11-09T00-00-00Z。

代价与限制

安全检查有意增加跨池元数据读取,并拒绝无法证明安全的操作。Object Lock 存储桶在 DeleteObjects 中的物理版本清除改为在单对象路径上顺序执行,大批量版本清除耗时相应增加(普通存储桶与创建删除标记仍走批量路径)。在有界 Linux ARM64 双池验证中,删除受锁桶中 1,000 个可删版本的每轮中位数均值约由 202 ms 增至 310 ms;稳态 HEAD/GET 中位数变化约 +1.5%/+3.4%,交替 4 KiB/1 MiB 写入轮次处于常规存储波动范围内且未增加底层请求路径系统调用。上述目录模拟盘测量用于说明安全代价,不构成生产磁盘吞吐承诺。

存储超时仍不证明底层磁盘写入未提交,本版本不新增分布式 fencing,也不会恢复历史已删除数据。已知限制仍包括 ListMultipartUploads 前缀与分页(#79)、多站点删除标记清除(#217)、站点复制重放建桶(PR #241)、仅由对象标签授权时底层对象不可读返回 403(#293),以及上游 SDK 在分片完成重试时可能丢失条件请求头(mcli put --if-not-exists;见分片完成重试分析)。

交付与验证

发布提交 d998292387cc 已通过 Go CI、VulnCheck、Test Release Pipeline 与标签发布构建,并完成双池与四节点运行验收、S3/客户端/Console 集成验证及对象与 IAM 升级回滚验证。

GitHub Release 提供 36 个 Server 制品(Linux/macOS tar.gz 与 Windows ZIP 归档、x86_64 与 arm64 的 RPM、DEB、APK 软件包、SHA-256 校验和、SPDX SBOM、Sigstore 签名包及构建溯源证明),配套独立发布的 44 个 Console 制品、19 个 mcli 制品、19 个 KES 20261026 制品及仅源码发布的 silo-pkg 模块。多架构容器镜像(linux/amd64 与 linux/arm64)已发布至 Docker Hub:

  • docker.io/pgsty/silo:RELEASE.2026-11-09T00-00-00Z(latest):sha256:08ce1505b5eacefbad1ca07159b242b9ce045a11c2817e3bc257b25f77bbc02d
  • docker.io/pgsty/silo:RELEASE.2026-11-09T00-00-00Z-distroless(distroless):sha256:fdf726815e38c2d1cb06c640e237daa83b3914e58099aecd073fef9d8e42cb00

感谢 @botdeniska 提供存储、生命周期、恢复与 IAM 问题报告和修复,@dihmandrake 提供 heal dry-run 保护方案,@haf 报告 webhook 重载问题。Console 与客户端贡献者详见各自发布说明及社区贡献者记录。

源码变更日志 · 相对 20261026 的完整对比

表格阅读