SILO 20261109:生命周期、对象锁与批处理授权
SILO Server 20261109 汇集了 20261026 之后的维护改动:多池生命周期与远端分层清理、两阶段原生恢复、Object Lock 保护,以及绑定提交者当前权限的批处理作业。该版本内嵌 Console 2.7.0、mcli 20261109 与 silo-pkg 3.16.0。
GitHub 发布 · 完整变更记录 · 升级指南 · 下载
组件
服务端软件包版本为 20261109000000.0.0。KES 保持独立、可选的 20261026 版本。单独升级 Console 或客户端不会替换旧 Server 二进制内嵌的组件。正式支持维护的 PGSTY 组件组合,对上游 MinIO/MC 尽最大努力兼容。
存储与恢复
- 多池生命周期: 在对象锁内,结合所有池的权威版本历史和保护状态决定过期;历史不完整或存在受保护版本时拒绝整键删除。精确键删除不再涉及子键。Decommission 与 rebalance 会迁移无法安全过期的版本。
- 远端分层: 只要其他池仍引用远端数据就保留它;普通版本历史排除 free version,已恢复副本到期时只清本地副本,不删底层对象,并只统计实际发生的移除。
- 原生恢复: 下载远端数据时释放对象写锁,发布前再验证本次恢复的所有权。失败或取消后先尝试 100 毫秒清理标记,再转为有界后台重试,避免同步等待对象锁约一分钟。
- 锁与条件写入: 单池修改统一使用对象所属纠删集的锁;修复 CopyObject 的锁顺序和饥饿问题;多池分片上传的发起条件按当前对象求值。普通批量删除的不同 set 分组可并发执行。
- 读取与自愈: 已知磁盘视图不完整时返回可重试错误;将元数据校验和错误归类供自愈处理;heal dry run 保留数据,并清除失败写入留下的空目录。
对象锁、IAM 与作业
S3 DeleteObjects 现在使用与保留期、法律保留更新相同的锁,在锁内检查物理版本清除,并合并其他池副本的保护状态。目录对象的 null 版本同样受保护。复制删除遵守目标端 Object Lock;源端绕过 GOVERNANCE 不会赋予目标端绕过权限,因此此类复制可能持续失败并重试。
批量过期和密钥轮换在执行期间持续检查经过认证的提交者是否拥有本地数据权限。身份撤销或发生绑定变化会终止作业;IAM 或授权依赖暂时不可用则暂停,记录原因并有界重试。启动发现会重试存储故障,已完成作业保持完成,复制作业可以恢复扫描。使用 mcli batch status 区分完成、拒绝、失败与暂停。外部授权插件必须返回成功 HTTP 状态与显式布尔决定(result 或 result.allow);缺失/null 决定、尾随 JSON 及超过 1MiB 的响应会被拒绝,每次调用上限为一分钟。升级前请验证自定义插件。
IAM 基于持久记录执行编辑,避免陈旧缓存恢复旧凭据或已删除身份。此版本还修复了纠删集上的长 DN LDAP 登录、启用 LDAP 时内嵌 Console 的 root 登录,以及各节点的 webhook 目标重载。Console 2.7.0 提供十种界面语言,并修复用量后台任务的 TLS 与预算、普通 HTTP 下的目录大小与密钥复制,以及格式错误的上传请求。
升级与回退
- 切换版本前停止提交 batch 作业。 排空或取消运行、等待、暂停中的全部作业。旧格式未完成作业在全部节点升级后需重交;已完成作业无需重交。新绑定清单与进度报告使用 20261026 拒绝的格式。仍有新作业未完成时不要降级,也不要期望旧执行器续跑。按批处理清单操作。
- 不兼容的单池布局必须排空重启。 如果各 set 不全位于同一组主机上(自动布局通常为 18 台及以上),先停止所有旧进程,再启动新版。此布局的旧、新锁域不能安全滚动混用。
- 混合版本期间暂停新恢复。 只要还有旧节点或不可达节点,新节点对
POST ?restore返回503。多池生命周期和批量 Object Lock 的完整保护也需要全部服务节点升级。 - 重启后验证实际 S3 访问。
ready保持进程与已配置依赖的探针语义;cluster成功时,节点仍可能在重连远端磁盘。恢复应用前,执行有界的逐节点签名写入、回读检查;保持节点发现与 KubernetespublishNotReadyAddresses。详见健康检查。 - 固定 Helm 镜像。 Chart 7.0.4 默认使用此版本。
helm upgrade --reuse-values会保留已有标签,因此显式设置image.tag=RELEASE.2026-11-09T00-00-00Z。
代价与限制
安全检查有意增加元数据读取,并拒绝无法证明安全的操作。分片上传发起时可能持有对象锁更久,多池过期需要读取和合并历史。Object Lock 桶中,批量请求的物理版本清除逐项走单对象路径,大批量清除会更慢;普通桶和创建删除标记仍走批量路径。有界 Linux ARM64 双池测试中,1000 个可删除版本的每轮中位数均值约从 202ms 增至 310ms。这是有意承担的安全成本,不是生产吞吐估计。稳态 HEAD/GET 中位数约变化 +1.5%/+3.4%,此前 macOS 上的读取变慢没有在 Linux 稳态读测试中重现。持久化写入在同一二进制自身对比中也出现明显波动。固定数据目录与键集合、交替三轮后,4KiB 覆盖写中位数约 +2.1%,1MiB 覆盖/新建写约 −8%;tmpfs 与底层调用追踪没有显示同量级请求路径开销增加。这些测量不承诺生产存储上的写入尾延迟保持不变。
生命周期产生的删除不复制。已知限制仍包括分片上传列表(#79)、多站点删除标记清除(#217)、重放创建桶(#241),以及仅按对象标签授权时、对象不可读导致返回 403(#293)。固定的上游 SDK 在完成分片上传时可能丢失条件头,因此 mcli put --if-not-exists 不能保证整个分片上传期间都不会覆盖。升级不会解决这些限制。
发布验收覆盖精确源码的 Go/race 和打包门禁、双池与四节点运行、S3/客户端/Console 兼容,以及已测对象和 IAM 数据的升级回退。本地性能测试使用 Linux ARM64 虚拟机和目录模拟的数据盘,不代表生产磁盘或跨主机容量;这些有界测试也不构成长时间稳定性压测。上线前仍需验证自身拓扑与负载。