SILO 20261026:多池删除、生命周期过期与复制校验和的 6 处行为变更
仓库 https://github.com/pgsty/silo | 文档 https://silo.pgsty.com
SILO、mcli 与 PGSTY KES 20261026 联合发布,配套 SILO Console 2.5.1 与 silo-pkg 3.15.2。三个可执行组件统一日期与包版本号,KES 仍作为可选外部密钥服务独立部署。以下按发布注记梳理自 20261018 正式版以来的变更,重点是可观测的行为差异和升级顺序。
发布组件
| 组件 | 版本 | 提交 | 交付形式 |
|---|---|---|---|
| SILO Server | 20261026000000.0.0 | c3ad836aed0d | 平台归档、Linux 软件包、Docker Hub 镜像 |
| mcli | 20261026000000.0.0 | 0ceb298cdcd0 | 平台归档、Linux 软件包、Docker Hub 镜像 |
| PGSTY KES | 20261026000000.0.0 | e9b4f1acebc1 | 平台归档、Linux 软件包、Docker Hub 镜像 |
| SILO Console | 2.5.1 | fff1618d9abb | Server 内嵌;独立二进制、软件包与镜像 |
| silo-pkg | 3.15.2 | 0416eb1f4505 | Go 源码模块 |
五个项目统一用 Go 1.27.3 构建。Server、Console 与 mcli 使用 silo-pkg v3.15.2 及固定的上游提交 minio-go v7.4.2-0.20261025165926-320af050c445(伪版本,上游尚未打 v7.4.2 标签)。Server 显式集成已发布的 Console 与 mcli 源码;单独升级独立部署的 Console 不会替换旧版 Server 内嵌的控制台界面。
Server:自 20261018 以来的修改
多池删除:先清非权威池,再删权威副本
#257、#256。普通删除与批量删除改为先清理非权威池中的旧副本,再删除权威池副本,部分失败时保住最新权威副本。同时为新建删除标记选择可用存储池,并保护仍被其他存活副本引用的远端分层对象。
触发条件是多池部署下的删除,尤其是删除中途出现节点或磁盘故障。旧行为可能先删掉权威副本,新行为把权威池删除放到最后。
版本桶生命周期过期只加删除标记时保留分层数据
#253、#252。当生命周期过期规则只是追加删除标记时,完整保留上一版本的远端分层数据,包括暂停版本控制桶中的非 null 版本;只有历史版本被真正永久清除、且没有任何存活引用依赖其底层载荷时,才回收远端分层数据。
触发条件是版本控制桶配置了生命周期过期规则、且规则效果仅为删除标记。提前回收会导致按版本号恢复时取不到载荷。
复合 CRC 分片复制透传 FULL_OBJECT
#255、#254。为复合 CRC 分片对象复制透传 FULL_OBJECT 校验和类型,避免目标站点按分片复合模式重算校验和而返回 BadDigest。
触发条件是跨站复制使用复合 CRC 校验和的分片上传对象。升级时先升发送端 Server,再检查待复制队列;接收端仍需能处理该校验和类型。
LDAP 超长 DN 登录
#250。修复规范化 LDAP DN 过长导致无法登录的问题。当合法 IAM 键的单个 ASCII 路径分量超过 255 字节时,可选 IAM 记录读取将其视为「记录不存在」,继续按组策略登录;无法读取的吊销记录与底层存储故障仍严格 Fail-Closed 拒绝,对象后端仍不支持直接写入超长路径记录。
同一提交调整了策略重载:访问底层存储期间不再持有认证缓存锁,仅在完整加载成功后原子替换缓存并保持 IAM 写入顺序;请求取消信号传递到 KMS 与 SSE-S3 解密路径,不缩短调用方的策略查询超时。
内置策略 Reset
对内置策略执行 Reset 后,首次读取立即恢复原生策略定义;延迟到达的 peer/etcd 通知会重新加载已提交状态,不会覆盖后续新修改。策略在用检查、删除修订号与自定义策略删除行为保持不变。
触发条件是集群中对内置策略做过 Reset、随后又有新的策略修改。若发现 Reset 后策略回弹到旧自定义内容,先确认所有节点都已升级到本版。
Console 的 account-info 接口改为读取实时存储桶清单,创建或删除桶后刷新页面即可看到最新结果;对象用量统计仍由后台扫描器异步更新。
存储 RPC 与超时语义
转发存储 RPC 删除选项,包括覆盖写回滚所需的旧数据目录;保持既有的磁盘/RPC 超时、请求取消、对象锁、读仲裁与自愈策略。正式版在 dcc2f20ba 中撤回了 20261025 草稿里的已接纳 I/O 排空等待与逐对象变更锁方案(含 #258)。
依赖与打包:更新 SFTP、etcd、NATS 及云厂商 SDK 等 Go 依赖;保留 Kafka 2.1 默认协议版本、CLI 输出格式与 NetBSD 兼容版本;修复旧版 DARE v1 解封逻辑(新写入继续用 v2)。容器镜像、校验安装脚本与 Helm 客户端任务统一内置 mcli 20261026。Windows 归档改用 ZIP,静态构建 curl 升级至 8.23.0,并修复最终刷新 SBOM 与构建溯源时的 RPM 签名校验。
文档合入单节点 MinIO 迁移指南(#228),校准运维默认参数,升级流程收敛至迁移指南。20261018 已交付的 Object Lock、IAM 授权、持久 STS 吊销、跨池迁移与 LIST 恢复修复在本版完整保留。
mcli:自 20261018 以来的修改
batch status 新增 pending
#53、#54。batch status 在实时指标暂缺时继续观察并输出新增的 pending 状态,不再把排队中或缺样本的任务误判为已完成;指标流中断时用带超时边界的持久化状态查询兜底;修复超大对象计数下的 IOPs 整数溢出。自动化脚本要适配这个新状态。
resync 与 admin info 的退出码
#51。resync start 与 resync cancel 在部分桶操作失败时保留逐桶错误详情并返回非零退出码;用 resync status 成功查询到一个已处于 Failed 或 Canceled 状态的任务仍正常退出 0。admin info --json 在请求失败时同样返回非零退出码,并保留 JSON 错误输出。
触发条件是脚本按退出码判断成败。此前部分失败可能返回 0,现在会如实返回非零。
其他客户端变更
- 客户端身份缓存隔离(#50、#55):S3 与管理客户端缓存按凭据、证书信任、代理、DNS 解析器及自定义请求头隔离,保留凭据自动刷新与 Web Identity token 文件轮换。
- Resync 状态与速率(#48、#49、#52):
admin replicate resync status --json持续消费状态流直至 Completed、Failed 或 Canceled 终态,保留已完成任务输出;桶未启用复制时明确输出结果;TTY 模式遇到 Failed 或 Canceled 立即结束等待;修复累计传输超过约 8.6 GiB 后吞吐量计算的整数溢出。 - 别名区域(#44):按 MC_REGION、AWS_REGION、持久别名配置的 region 字段、自动发现的优先级解析区域,并在客户端缓存中隔离签名区域(未新增
alias set --region命令行参数)。 - 底层 SDK 修复:拒绝被截短的顺序或并行分片读取流;修复 ReadAt 的 EOF 处理、负偏移校验及 Stat 之后的读取/Seek 边界;批量删除回退路径中的重复错误去重;移除桶复制配置时同时接受 HTTP 200 与 204(403 等真实鉴权或请求错误仍正常报错)。
- 打包(#45):升级至 Go 1.27.3 与 GoReleaser 2.19.0,Windows 归档改用 ZIP;更新命令行帮助链接以及已停用的服务端自更新/SUBNET 命令提示,保留既有 CLI 配置与 MC_* 环境变量兼容。
本次客户端升级无需变更服务端协议。下载流中途断开仍立即报错;分片上传被 SIGINT 中断时以退出码 130 退出,未完成的分片可能需显式清理。
KES
KES 20261026 汇总 Go 1.27.3 与云厂商 SDK 依赖维护,二进制、Linux 软件包与容器镜像对齐到 20261026 批次。HTTP API、配置文件格式与后端存储密钥格式保持兼容。Linux 软件包仅安装 /usr/local/bin/kes,不会自动启动未配置的服务。生产升级时保留持久化根密钥、证书与配置,并在重启 Server 后实际执行读取解密验证。
Console 2.5 与 silo-pkg 3.15
Console 2.5.1 包含 2.5 系列的整体界面重构、按权限裁剪导航、Overview 集群概览、对象预览、Tasks 任务中心、身份管理与高延迟网络下的诊断流修复;2.5.1 补丁版修复启停用户组时保留既有成员、OIDC 字符串数组组权限、反向代理后的安全会话 Cookie、凭据 JSON 导出、流式 ZIP 错误状态码以及键盘焦点与无障碍标签。Server 20261026 已内嵌此版本。
silo-pkg 3.15.2 汇总 3.15.0 的 Go 1.27.3 与依赖升级、3.15.1 的上游 SDK 修复,以及 3.15.2 移除复制配置时的 HTTP 204 状态码兼容。它仅作为 Go 源码模块发布,嵌入方需重新编译才能纳入更新。
升级与故障边界
协调升级:升级前备份 IAM 状态、配置文件与加密密钥,按 IAM 升级指南同步升级集群内所有 Server 节点与跨站复制站点。不支持新旧版本进程长期共用同一 IAM 后端或执行滚动降级。
升级后核验:逐一验证 LDAP/OIDC 登录、内置策略 Reset、存储桶清单刷新、多版本读取、跨站复制与加密对象解密。分片对象 FULL_OBJECT 校验和复制修复需要先升级发送端 Server,再检查待复制队列。
归档与脚本:Windows 平台归档改为 .zip(Linux 与 macOS 保持 .tar.gz);脚本适配 mcli batch status 的 pending 状态与 resync start/cancel 部分失败时的非零退出码。既有环境变量、配置文件名与磁盘存储格式保持不变。
已知边界:公开的 ListMultipartUploads 仍使用节点本地内存缓存与精确对象键查找,已退役的 strict 开关会被忽略并打印警告;#79 与 #217 尚未关闭,Webhook 热重载 PR #249 未纳入本版,更大范围的性能问题仍在 #251 中跟踪。
存储超时与一致性:客户端收到请求超时并不代表底层磁盘或 RPC I/O 已经停止,也不代表该次写入一定没有提交。部分磁盘故障、锁租约过期或网络分区下,仍可能出现迟到提交、延迟回滚或短暂读到旧值与旧标签。本版未引入分布式锁 fencing,也不会自动恢复升级前已损坏或丢失的对象、远端分层数据与元数据。
下载与验证
docker pull docker.io/pgsty/silo:RELEASE.2026-10-26T00-00-00Z
docker pull docker.io/pgsty/mc:RELEASE.2026-10-26T00-00-00Z
docker pull docker.io/pgsty/kes:RELEASE.2026-10-26T00-00-00Z
docker pull docker.io/pgsty/silo-console:v2.5.1
Server 标准镜像(Linux amd64/arm64 多架构 manifest):sha256:7bb2aff6b89efe1cb1303c10fc21d579447434ed06649ac9ec05a5e2dbf30ad7(与 latest 一致)。Server distroless 镜像:sha256:e6544a902f426f2b4e775b89f3c1cd78310dbffc262d1ed82e9800c1cb1b5885(与 distroless 标签一致,两个架构均保留 silo healthcheck ready 原生健康检查)。
本地验收在 Linux arm64 环境下完成:基线四节点 88 项、升级后四节点 88 项与八节点多池 136 项 S3 兼容性检查;历史对象、标签、加密对象及跨升级周期的分片上传均完整保留。滚动重启、SIGKILL 强杀与 75 秒进程挂起恢复测试中,408 个已确认写入的对象全部完整读回,哈希与列表校验通过。集群健康检查端点仅反映节点上报的磁盘仲裁状态,滚动重启或升级后恢复流量前,按启动就绪窗口指南验证实际数据面读写。