注意

本文档适用于 Ceph 的开发版本。

Tentacle

Tentacle 是 Ceph 的第 20 个稳定版本。

v20.2.0 Tentacle

发布日期

2025 年 11 月 18 日

亮点

有关这些项目的更多详细信息,请参阅以下部分。

CephFS

  • 现在可以配置目录,使其目录条目名称不区分大小写或规范化。

  • 当集群不健康时修改 FS 设置变量 max_mds,现在需要用户传递确认标志(--yes-i-really-mean-it)。

  • 对于默认情况(即 mode == 0),CephFS FUSE 客户端现在为 fallocate 返回 EOPNOTSUPP(操作不支持)。

仪表盘

  • 增加了对 NVMe/TCP 网关组和多个命名空间、多集群管理、OAuth 2.0 集成以及增强的 RGW/SMB 功能的支持,包括多站点自动化、分层、策略、生命周期、通知和精细复制。

集成的 SMB 支持

  • Ceph 集群现在提供一个 SMB Manager 模块,其工作方式类似于现有的 NFS 子系统。新的 SMB 支持允许 Ceph 集群自动创建连接到 CephFS 的 Samba 支持的 SMB 文件共享。smb 模块可以配置基本的 Active Directory 域或独立的身份验证。Ceph 集群可以托管一个或多个虚拟 SMB 集群,这些集群可以使用 Samba 的 CTDB 技术实现真正的集群化。smb 模块需要一个启用 cephadm 的 Ceph 集群,并部署由 samba-container 项目提供的容器镜像。Ceph 仪表盘可用于配置 SMB 集群和共享。会自动部署一个新的 cephfs-proxy 守护程序,以提高 Samba 连接到 CephFS 时的可扩展性和内存使用率。

MGR

  • 用户现在能够强制禁用始终开启的模块。

  • restfulzabbix 模块(自 2020 年以来已弃用)已被正式移除。

RADOS

  • FastEC:为纠删码池添加了期待已久的性能和空间放大优化。

  • BlueStore:改进了压缩和新的、更快的 WAL(预写日志)。

  • 数据可用性评分:用户现在可以跟踪集群中每个池的数据可用性评分。

  • OMAP:所有组件都已切换到更快的 OMAP 迭代接口,这改进了 RGW 存储桶列表和 scrub 操作。

Crimson

  • SeaStore 技术预览:SeaStore 对象存储现在可以与 Crimson-OSD 一起部署,主要用于早期测试和实验。鼓励社区提供反馈,以帮助未来的改进。

RBD

  • 新的实时迁移功能:RBD 镜像现在可以从另一个 Ceph 集群(原生格式)或从各种外部来源/格式即时导入。

  • 现在支持在 Ceph 集群之间镜像时重新映射 RBD 命名空间。

  • 添加或改进了几个与组和组快照信息相关的命令,rbd device map 命令现在默认为 msgr2

RGW

  • 增加了对 S3 GetObjectAttributes 的支持。

  • 为了与 AWS S3 兼容,LastModified 时间戳现在截断到秒。请注意,在升级过程中,用户可能会因此观察到这些时间戳向后移动。

  • 存储桶重新分片现在在其开始阻止写入操作之前完成了大部分处理。这应该会显著减少重新分片对大存储桶的客户端可见影响。

  • RGW:Squid 中引入的用户帐户功能为 IAM API 和策略提供了第一类支持。我们初步的 STS 支持基于租户,并且只向管理员公开了一些 IAM API。现在不推荐使用这种租户级 IAM 功能,转而使用帐户。虽然我们将继续支持租户功能本身用于命名空间隔离,但以下功能将不早于 V 版本移除

    • 租户级 IAM API,包括 CreateRole、PutRolePolicy 和 PutUserPolicy,

    • 在 IAM 策略文档中使用租户名称而不是帐户,

    • 在没有跨帐户策略评估的情况下解释 IAM 策略,

    • S3 API 对跨租户名称的支持,例如 Bucket=’tenant:bucketname’

    • STS Lite 和 sts:GetSessionToken

Cephadm

  • 一个新的 cephadm 管理的 mgmt-gateway 服务为 Ceph 管理端点(例如仪表盘和监控堆栈)提供了一个单一的、以 TLS 终止的入口点。该网关实现为基于 nginx 的反向代理,位于 Prometheus、Grafana 和 Alertmanager 的前面,因此用户不再需要直接连接到这些守护程序或知道它们在哪个主机上运行。当与新的 oauth2-proxy 服务结合使用时,该服务使用 OpenID Connect (OIDC) / OAuth 2.0 协议与外部身份提供程序集成,网关可以为 Ceph 仪表盘和监控堆栈的其余部分实施集中式身份验证和单点登录 (SSO)。

  • Ceph 仪表盘和基于 Prometheus 的监控堆栈的高可用性现在通过 cephadm 管理的 mgmt-gateway 提供。nginx 高可用性机制允许 mgmt-gateway 检测仪表盘、Prometheus、Grafana 和 Alertmanager 的健康实例,相应地路由流量,并透明地处理管理器故障转移。当部署了虚拟 IP 和多个 mgmt-gateway 实例时,这种架构即使在守护程序或主机故障期间也能保持管理访问可用。

  • 一个新的 certmgr cephadm 子系统集中管理 cephadm 管理的服务的证书生命周期。certmgr 充当 cephadm 签名的证书的集群内部根 CA,它还可以使用用户提供的证书,并跟踪每个证书是如何配置的。它标准化了 RGW 和 mgmt-gateway 等服务的 HTTPS 配置,自动化了 cephadm 签名证书的续订和轮换,并在证书无效、即将过期或配置错误时发出健康警告。使用 certmgr,cephadm 签名的证书在所有 cephadm 管理的服务中都可用,开箱即用提供了安全的默认设置。

CephFS

  • 现在可以配置目录,使其目录条目名称不区分大小写或规范化。这是一种可继承的配置,使其适用于整个目录树。

    有关更多信息,请参阅 CephFS 目录条目名称规范化和大小写折叠

  • 现在可以通过使用配置选项 mgr/volumes/pause_purging 来暂停异步清除已删除子卷的线程。

  • 现在可以通过使用配置选项 mgr/volumes/pause_cloning 来暂停异步克隆子卷快照的线程。

  • 当集群不健康时修改设置 max_mds,现在需要用户传递确认标志(--yes-i-really-mean-it)。添加此功能是为了提醒用户,修改 max_mds 可能对故障排除或恢复工作没有帮助。相反,它可能会使集群进一步不稳定。

  • 对于默认情况(即 mode == 0),CephFS FUSE 客户端现在为 fallocate 返回 EOPNOTSUPP(操作不支持),因为 CephFS 不支持磁盘空间预留。唯一支持的标志是 FALLOC_FL_KEEP_SIZEFALLOC_FL_PUNCH_HOLE

  • ceph fs subvolume snapshot getpath 命令现在允许用户获取子卷快照的路径。如果快照不存在,则返回 ENOENT

  • ceph fs volume create 命令现在允许用户传递元数据和数据池名称以用于创建卷。如果未传递其中任何一个,或者如果其中任何一个是空池,则命令将中止。

  • CephFS 卷的池命名空间名称格式已从 fsvolumens__<subvol-name> 更改为 fsvolumens__<subvol-grp-name>_<subvol-name>,以避免当位于不同子卷组中的两个子卷具有相同名称时发生命名空间冲突。即使存在命名空间冲突,也没有安全问题,因为 MDS auth cap 仅限于子卷路径。现在,通过此更改,命名空间已完全隔离。

  • 如果传递给命令 ceph fs subvolume info 的子卷名称是克隆,则输出现在还将包含一个“source”字段,告知用户源快照的名称以及源快照所在的卷、子卷组和子卷的名称。对于使用 Tentacle 或更早版本创建的克隆,此字段的值将为 N/A。常规子卷没有源子卷,因此无论版本如何,它们的输出都不会包含“source”字段。

Crimson / SeaStore

Crimson 项目持续取得进展,Squid 版本标志着 Crimson 的第一个技术预览版。Tentacle 版本引入了大量改进和新功能,增强了 Crimson-OSD 和 SeaStore 对象存储的稳健性、性能和可用性。在此版本中,SeaStore 现在可以与 Crimson-OSD 一起部署!强烈鼓励早期测试和实验,我们将非常感谢社区提供的任何初步反馈,以帮助指导未来的改进。请查看 Tentacle 的 Crimson 项目更新博客文章,其中我们重点介绍了最新版本中包含的一些工作,使我们更接近于在未来完全取代现有的 Classical OSD:https://ceph.net.cn/en/news/blog/2025/crimson-T-release/

如果您是 Crimson 项目的新手,请访问项目页面以获取更多信息和资源:https://ceph.net.cn/en/news/crimson

仪表盘

  • 现在增加了对 NVMe/TCP 网关组和多个命名空间、多集群管理、OAuth 2.0 集成以及增强的 RGW/SMB 功能的支持,包括多站点自动化、分层、策略、生命周期、通知和精细复制。

MGR

  • Ceph Manager 的始终开启的模块/插件现在可以强制禁用。这在某些情况下是必要的,即当我们希望防止 Ceph 服务关闭或降级时,管理器被模块命令淹没。

  • mgr/restful, mgr/zabbix:这两个模块自 2020 年以来已被弃用,现在最终被移除。它们在过去几年中没有得到积极维护,并开始在依赖链中出现漏洞(例如:CVE-2023-46136)。restful 模块的替代品是 dashboard 模块,它提供了更丰富、维护更好的 RESTful API。至于 zabbix 模块,还有其他监控解决方案,例如 prometheus,这是 Ceph 用户社区中最广泛采用的解决方案。

RADOS

  • 为纠删码池添加了期待已久的性能和空间放大优化(FastEC),包括部分读取和部分写入。

  • 纠删码 I/O 代码的新实现提供了实质性的性能改进和一些容量改进。新代码旨在优化将纠删码与块存储 (RBD) 和文件存储 (CephFS) 结合使用时的性能,但也将对对象存储 (RGW) 有益,尤其是在使用较小对象时。必须在每个池上设置一个新标志 allow_ec_optimizations 才能切换到使用新代码。一旦 OSD 和 Monitor 守护程序更新后,现有池就可以升级。无需更新客户端。

  • 纠删码池的默认插件已从 Jerasure 更改为 ISA-L。在 Tentacle 或更高版本上创建的集群在创建新池时将使用 ISA-L 作为默认插件。升级到 T 版本的集群将继续使用其现有的默认值。可以通过创建新的纠删码配置文件并在创建新池时选择它来覆盖默认值。建议新池使用 ISA-L,因为 Jerasure 库不再维护。

  • BlueStore 现在具有更好的压缩和新的、更快的 WAL(预写日志)。

  • 所有组件都已切换到更快的 OMAP 迭代接口,这改进了 RGW 存储桶列表和 scrub 操作。

  • 现在可以在极端情况下绕过 ceph_assert() 以帮助灾难恢复。

  • 添加了 dencoding 验证的测试改进。

  • 添加了一个新命令 ceph osd pool availability-status,允许用户查看集群中每个池的可用性评分。如果池中的任何 PG 不是 active,或者存在未找到的对象,则认为该池不可用。否则,认为该池可用。默认情况下,评分每秒更新一次。可以使用新的配置选项 pool_availability_update_interval 更改此间隔。默认情况下,该功能处于关闭状态。如果需要,可以使用新的配置选项 enable_availability_tracking 来打开该功能。添加了另一个命令来清除特定池的可用性状态。

    ceph osd pool clear-availability-status <pool-name>
    

    此功能处于技术预览阶段。

    相关链接

  • Leader monitor 和拉伸模式状态现在包含在 ceph status 输出中。

    相关跟踪器:https://tracker.ceph.com/issues/70406

  • 当 CRUSH 规则对数据中心使用多个 take 步骤时,ceph df 命令报告拉伸模式池的 MAX AVAIL 不正确。PGMap::get_rule_avail 错误地仅从一个数据中心计算可用空间。作为一种解决方法,使用 take defaultchoose firstn 0 type datacenter 定义 CRUSH 规则。有关详细信息,请参阅 https://tracker.ceph.com/issues/56650#note-6

    升级配置了具有多个 take 步骤的 CRUSH 规则的集群可能会导致数据洗牌,因为新的 CRUSH 更改可能需要重新分配数据。相比之下,具有单 take 配置的拉伸规则在升级过程中不会导致任何数据移动。

  • 添加了便利函数 librados::AioCompletion::cancel(),其行为与 librados::IoCtx::aio_cancel() 相同。

  • 配置参数 osd_repair_during_recovery 已移除。该配置标志过去用于控制是否允许在正在执行恢复的 OSD 上启动操作员发起的“repair scrub”。在此 Ceph 版本中,操作员发起的 scrub 和 repair scrub 永远不会被正在执行的修复阻止。

  • 修复了由于 dmclock 的后台清理线程中对项目的处理不当导致的恢复/回填挂起问题。

    相关跟踪器:https://tracker.ceph.com/issues/61594

  • mClock 调度程序使用的 OSD 的 IOPS 容量现在也会被检查,以确定它是否低于由

    • osd_mclock_iops_capacity_low_threshold_hdd – 设置为 50 IOPS

    • osd_mclock_iops_capacity_low_threshold_ssd – 设置为 1000 IOPS

    定义的已配置阈值。该检查旨在处理测量的 IOPS 不切实际地低的情况。如果检测到这种情况,IOPS 容量将设置为最后一个有效值或配置的默认值,以避免影响集群性能(操作缓慢或停滞)。

  • 文档已更新,包含覆盖 OSD IOPS 容量配置的步骤。

    相关链接

  • pybind/rados:修复 WriteOp.zero() 中原始的反转参数顺序 offsetlength。当 pybind 调用 WriteOp.zero() 时,传递的参数与 rados_write_op_zero 不匹配,并且 offset 和 length 被交换,导致意外响应。

RBD

  • RBD 镜像现在可以从另一个 Ceph 集群即时导入。用于 native 格式的迁移源规范已增加了 cluster_nameclient_name 可选字段,用于在解析各自的 ceph.conf 类似配置文件后连接到源集群。

  • 在新 NBD 流("type": "nbd")的帮助下,RBD 镜像现在可以从各种外部来源/格式即时导入。支持的精确格式集及其功能取决于 NBD 服务器的功能。

  • 在 Ceph 集群之间镜像时,本地和远程 RBD 命名空间不再需要相同(但池名称仍然需要)。使用 rbd mirror pool enable 命令的新选项 --remote-namespace,现在可以在配置镜像时将本地命名空间与相应池中的任意远程命名空间配对,包括将默认命名空间映射到非默认命名空间,反之亦然。

  • 所有生成时间戳的 Python API 现在都返回“aware” datetime 对象,而不是“naive”对象(即,包含时区信息而不是不包含时区信息的对象)。所有时间戳都保留在 UTC 中,但包含 timezone.utc 使其明确,并避免返回的时间戳被误解的可能性。在 Python 3 中,许多 datetime 方法将“naive” datetime 对象视为本地时间。

  • 引入了 rbd group inforbd group snap info 命令,分别显示有关组和组快照的信息。

  • rbd group snap ls 输出现在包括组快照 ID。未格式化的 CLI 输出中显示组快照状态的列标题已从 STATUS 更改为 STATE。以前显示为 ok 的组快照状态现在显示为 complete,这更具描述性。

  • rbd mirror image statusrbd mirror pool status --verbose 输出中,mirror_uuids 字段已重命名为 mirror_uuid,以强调该值始终是单个 UUID,而不是任何列表。

  • 不再允许将属于组的镜像移动到垃圾箱。rbd trash mv 命令现在在这种情况下与 rbd rm 的行为相同。

  • rbd device map 命令现在默认为所有设备类型使用 msgr2-o ms_mode=legacy 可以传递以继续将 msgr1 与 krbd 一起使用。

  • diff-iterate API 系列已扩展为允许从或在非用户类型快照之间进行 diff,这些快照只能通过其 ID 引用。

  • 如果镜像未启用镜像,则获取镜像的镜像模式无效。公共 API -- C++ mirror_image_get_mode()、C rbd_mirror_image_get_mode() 和 Python Image.mirror_image_get_mode() -- 在禁用镜像时将返回 EINVAL

  • 如果镜像未启用镜像,则升级镜像无效。公共 API -- C++ mirror_image_promote()、C rbd_mirror_image_promote() 和 Python Image.mirror_image_promote() -- 在未启用镜像时将返回 EINVAL 而不是 ENOENT。

  • 如果镜像未启用镜像,则请求对镜像重新同步无效。公共 API -- C++ mirror_image_resync()、C rbd_mirror_image_resync() 和 Python Image.mirror_image_resync() -- 在未启用镜像时将返回 EINVAL 而不是 ENOENT。

RGW

  • 多项修复:Lua 脚本不再无用地针对健康检查运行,S3 CopyPartPostObjectCompleteMultipartUpload 响应返回的 ETag 值正确加引号。

  • IAM 策略评估现在支持条件 ArnEqualsArnLike,以及它们的 NotIfExists 变体。

  • 添加了 BEAST 前端选项 so_reuseport,它有助于通过共享单个 TCP 端口在同一主机上运行多个 RGW 实例。

  • 复制策略现在使用 s3:ReplicateObjects3:ReplicateDeletes3:ReplicateTags 验证目标存储桶的权限。对于源存储桶,支持 s3:GetObjectVersionForReplications3:GetObject(Version)。在获取源对象时,还会考虑 s3:GetObjectAcls3:GetObjectLegalHolds3:GetObjectRetention 等操作。标签的复制由 s3:GetObject(Version)Tagging 权限控制。

  • 为 S3 CopyPartPostObjectCompleteMultipartUpload 响应返回的 ETag 值添加缺少的引号。

  • PutObjectLockConfiguration 现在可用于在现有已启用版本控制但未启用对象锁创建的存储桶上启用 S3 对象锁。

  • PutBucketPolicy 现在支持 x-amz-confirm-remove-self-bucket-access 标头。此外,即使当前策略明确拒绝访问,根用户也将始终具有修改存储桶策略的权限。

  • 增加了对 S3 PublicAccessBlock 配置的 RestrictPublicBuckets 属性的支持。

  • HeadBucket API 现在仅在 API 请求中明确包含 read-stats 查询字符串时才报告 X-RGW-Bytes-UsedX-RGW-Object-Count 标头。

遥测

  • 遥测中的 basic 频道现在捕获 ec_optimizations 标志,这将使我们能够衡量新 FastEC 改进的功能采用情况。要选择加入遥测,请运行 ceph telemetry on

从 Reef 或 Squid 升级

在开始之前,请确保您的集群稳定且健康,没有 downrecoveringincompleteundersizedbackfilling PG。您可以通过在开始之前运行 ceph osd pool set noautoscale 来暂时禁用所有池的 PG 自动缩放器,如果在升级成功确认后需要自动缩放器,则在升级完成后运行 ceph osd pool unset noautoscale

注意

您可以使用 ceph versions 命令监控升级的每个阶段的进度,该命令将告知您每种类型的守护程序正在运行的 Ceph 版本。

升级 Cephadm 集群

如果您的集群是使用 cephadm 部署的(首次在 Octopus 中引入),则升级过程是完全自动化的。要启动升级,

ceph orch upgrade start --image quay.io/ceph/ceph:v20.2.0

相同的过程用于升级到未来的次要版本。

可以使用以下命令监控升级进度:

ceph orch upgrade status

也可以使用 ceph -s(提供简单的进度条)或更详细地使用以下命令监控升级进度:

ceph -W cephadm

可以使用以下命令暂停或恢复升级:

ceph orch upgrade pause  # to pause
ceph orch upgrade resume # to resume

或使用以下命令取消:

ceph orch upgrade stop

请注意,取消升级只是停止该过程。无法降级回 Reef 或 Squid。

升级非 cephadm 集群

注意

  1. 如果您的集群正在运行 Reef (18.2.x) 或更高版本,您可以选择首先将其转换为使用 cephadm,以便升级到 Tentacle 自动化(见上文)。有关更多信息,请参阅 https://docs.ceph.net.cn/en/latest/cephadm/adoption/

  2. 如果您的集群正在运行 Reef (18.2.x) 或更高版本,systemd 单元文件名已更改为包含集群 fsid。要查找集群的正确 systemd 单元文件名,请运行以下命令:

    systemctl -l | grep <daemon type>
    

    示例

    systemctl -l | grep mon | grep active
    
    ceph-6ce0347c-314a-11ee-9b52-000af7995d6c@mon.f28-h21-000-r630.service                                           loaded active running   Ceph mon.f28-h21-000-r630 for 6ce0347c-314a-11ee-9b52-000af7995d6c
    
  1. 在升级期间设置 noout 标志。(可选,但推荐。)

    ceph osd set noout
    
  2. 通过安装新软件包并重新启动 Monitor 守护程序来升级 Monitors。例如,在每个 Monitor 主机上:

    systemctl restart ceph-mon.target
    

    所有 Monitors 启动后,通过在 mon map 中查找 tentacle 字符串来验证 Monitor 升级是否完成。命令

    ceph mon dump | grep min_mon_release
    

    应报告

    min_mon_release 20 (tentacle)
    

    如果不是,则意味着一个或多个 Monitors 尚未升级和重新启动和/或仲裁不包括所有 Monitors。

  3. 通过安装新软件包并重新启动所有 Manager 守护程序来升级 ceph-mgr 守护程序。例如,在每个 Manager 主机上:

    systemctl restart ceph-mgr.target
    

    通过检查 ceph -s 来验证 ceph-mgr 守护程序是否正在运行

    ceph -s
    
    ...
      services:
       mon: 3 daemons, quorum foo,bar,baz
       mgr: foo(active), standbys: bar, baz
    ...
    
  4. 通过安装新软件包并重新启动所有 OSD 主机上的 ceph-osd 守护程序来升级所有 OSD

    systemctl restart ceph-osd.target
    
  5. 升级所有 CephFS MDS 守护程序。对于每个 CephFS 文件系统:

    1. 禁用 standby_replay

      ceph fs set <fs_name> allow_standby_replay false
      
    2. 将排名数减少到 1。(如果您计划稍后恢复,请先记下原始 MDS 守护程序数。)

      ceph status # ceph fs set <fs_name> max_mds 1
      
    3. 通过定期检查状态等待集群停用任何非零排名:

      ceph status
      
    4. 在适当的主机上使用以下命令使所有 standby MDS 守护程序离线:

      systemctl stop ceph-mds@<daemon_name>
      
    5. 确认只有一个 MDS 在线并且是您的 FS 的排名 0:

      ceph status
      
    6. 通过安装新软件包并重新启动守护程序来升级最后剩下的 MDS 守护程序:

      systemctl restart ceph-mds.target
      
    7. 重新启动所有已离线的 standby MDS 守护程序:

      systemctl start ceph-mds.target
      
    8. 恢复卷的 max_mds 原始值:

      ceph fs set <fs_name> max_mds <original_max_mds>
      
  6. 通过升级所有主机上的软件包并重新启动守护程序来升级所有 radosgw 守护程序:

    systemctl restart ceph-radosgw.target
    
  7. 通过禁止 pre-Tentacle OSD 并启用所有新的 Tentacle-only 功能来完成升级:

    ceph osd require-osd-release tentacle
    
  8. 如果您在开始时设置了 noout,请务必使用以下命令将其清除:

    ceph osd unset noout
    
  9. 考虑将集群转换为使用 cephadm 部署和编排框架,以简化集群管理和未来的升级。有关将现有集群转换为 cephadm 的更多信息,请参阅 将现有集群转换为 cephadm

升级后

  1. 使用 ceph health 验证集群是否健康。

  2. 考虑启用 遥测模块,将匿名使用统计信息和崩溃信息发送给 Ceph 上游开发人员。要查看将报告的内容而不实际向任何人发送任何信息,请执行以下操作:

    ceph telemetry preview-all
    

    如果您对报告的数据感到满意,可以选择自动报告高级集群元数据:

    ceph telemetry on
    

    聚合 Ceph 遥测数据的公共仪表盘位于 https://telemetry-public.ceph.com/

从 Pre-Reef 版本(如 Quincy)升级

必须先升级到 Reef (18.2.z) 或 Squid (19.2.z),然后才能升级到 Tentacle。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入