- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
【免费下载链接】ceph
Ceph is a distributed object, block, and file storage platform
本文以 Ceph 官方发布说明 doc/releases/kraken.rst 为主体,结合当前仓库源码,系统梳理 Kraken 系列(v11.0.2 / v11.2.0 / v11.2.1)的核心技术变更:全新 BlueStore 存储后端、默认启用的 AsyncMessenger、新引入的 ceph-mgr 守护进程、EC 池覆盖写等实验特性,并给出从 Jewel 升级到 Kraken 的完整前置条件、操作顺序与新配置项速查表,帮助运维与开发人员安全评估、部署和升级该版本。
Kraken 是 Ceph 的第 11 个稳定版本系列,代号源自北欧传说中形似头足纲生物的传奇海怪。本文覆盖该系列的三个版本:作为开发检查点发布的 v11.0.2、作为首个稳定版的 v11.2.0,以及作为系列收尾补丁版的 v11.2.1。阅读本文后,你将掌握 Kraken 相比 Jewel 的架构级变化、BlueStore 的启用与创建方法、升级前的 CRUSH/标志位检查,以及一批影响运维行为的新配置参数。
Kraken 系列版本总览
Kraken 系列共包含三个公开发布版本,各自定位如下:
| 版本 | 定位 | 核心内容 |
|---|---|---|
| v11.0.2 | 开发检查点(development checkpoint) | 首次引入 ceph-mgr 守护进程;BlueStore 大量改进;RGW 引入 sync modules、multipart copy-part 与基于 ElasticSearch 的元数据检索(技术预览) |
| v11.2.0 | 首个稳定版(stable) | 稳定磁盘格式的 BlueStore;EC 覆盖写实验支持;默认 AsyncMessenger;OSD 故障快速检测;ceph-mgr 基础架构落地 |
| v11.2.1 | 系列补丁版(bugfix) | Kraken 系列最后一个版本,跨所有组件的大规模缺陷修复;Luminous 稳定后 Kraken 即宣告 EOL |
v11.2.0 稳定版会持续通过缺陷修复与 backport 得到维护,直到下一个稳定版 Luminous(v12.2.z)在 2017 年春季发布。v11.2.1 是 Kraken 的第一个补丁版,官方建议所有 v11.2.x 用户升级;完整逐条变更记录见 doc/changelog/v11.2.1.txt(仓库内保留的完整变更日志)。
v11.2.1 关键行为变化与安全操作
误定向操作(misdirected op)默认不再返回 ENXIO
在早期版本中,若客户端把操作发送到了错误的 OSD,OSD 会直接回复ENXIO(设备不存在),理由是“客户端或 OSD 显然存在 bug,应该把错误尽可能明显地暴露出来”。但这一行为对上层应用不友好:使用 librbd 的虚拟机原本只会收到EIO并转为只读,现在则会看到 IO 阻塞/挂起。
v11.2.1 起,只有显式开启osd_enxio_on_misdirected_op配置项(默认关闭)时才回复ENXIO。从当前仓库源码可以印证 OSD 对误定向操作的统一处理路径位于 OSDService::handle_misdirected_op:该函数先做各类断言与 EC PG 场景下的目标重算(EC 场景下 PG 分裂可能导致误判,此时直接丢弃、由客户端重发),最终通过clog->warn()记录一条“misdirected op”告警日志而非直接返回错误。PrimaryLogPG在 PrimaryLogPG.cc 中识别误定向场景并回调到该处理函数。
删除 OSD 前必须先将其从 CRUSH map 移除
Jewel 引入的缺陷(tracker #19119)破坏了如下场景的映射行为:一个仍存在于 CRUSH map 中的outOSD 被osd rm直接删除时,可能引发“misdirected op”等错误。v11.2.1 修复了该缺陷,但修复本身引入了同类风险——因为客户端与 OSD 的行为可能不一致。因此官方要求删除 OSD 时必须严格按以下顺序执行:
ceph osd crush rm osd.123 ceph osd rm osd.123即:先crush rm将其从 CRUSH map 中移除,再osd rm删除。
快照裁剪(snap trimmer)的并发控制
v11.2.1 显著改善了对快照裁剪任务的控制与节流:
osd max trimming pgs(默认 2):限制单个 OSD 上同时处于快照裁剪状态的 PG 数量。当前仓库中该配置项由 OSD.cc 动态接管:变更时调用service.snap_reserver.set_max(...)调整快照预留资源,支持在线调整而无需重启 OSD。osd snap trim sleep(默认 0):恢复该选项的安全使用,非零时在每次向底层系统派发裁剪操作之间插入指定秒数的延迟。实现位于 OSD::get_osd_snap_trim_sleep,并根据磁盘介质类型细分出osd_snap_trim_sleep_hdd、osd_snap_trim_sleep_ssd、osd_snap_trim_sleep_hybrid三个变体。
v11.2.0 自 Jewel 以来的重大变更
RADOS 层
- BlueStore 新后端:磁盘格式已稳定并通过故障与压力测试,但仍标记为实验性,官方鼓励在非生产集群和非关键数据集上试用(详见下文 BlueStore 专题)。
- EC 池覆盖写(实验性):RADOS 对纠删码池的实验性覆盖写支持。由于磁盘格式与实现尚未定稿,必须通过特殊池选项显式开启;一旦开启,该集群将被永久禁止升级到未来版本,务必在测试集群上评估。
- 默认启用 AsyncMessenger(
ms type = async):替代传统 SimpleMessenger。最显著的区别是网络连接改用固定大小线程池,而不是 SimpleMessenger 的“每 socket 两个线程”。 - OSD 故障快速检测:部分 OSD 故障现在几乎可以立即被感知,不再需要等待默认 20 秒的心跳超时(heartbeat timeout)到期。这避免了“主机仍在、ceph-osd 进程已退出”场景下 IO 长时间阻塞。
- 新 ceph-mgr 守护进程:默认与 monitor 共置,基础设施已就位(当前仓库的守护进程实现见 src/mgr),可对接外部监控/管理系统。
- OSDMap 编码体积缩小;OSD 在恢复或再平衡期间会暂停发起新的 scrub(详见下文升级注意事项)。
RGW 层
- 新增用于 ElasticSearch 元数据索引的新 zone 类型(sync modules)。
- 支持 S3 multipart 对象的 copy-part API。
- 支持对已有 bucket 进行 reshard(注意:reshard 期间要求该 bucket 的所有 IO(尤其是写)保持静默)。
- 支持对象级数据压缩。
- Civetweb 升级到 1.8。
- 支持 Swift 静态网站 API(S3 静态网站支持此前已加入)。
- 新增 S3 bucket lifecycle API(当前仅支持对象过期)。
- LDAP 认证实现支持自定义搜索过滤器。
- RGW NFS 网关支持 NFSv3;并创建了 librgw 的 Python 绑定。
RBD 层
- RBD 镜像可存储在使用新(实验性)覆盖写支持的 EC RADOS 池中。镜像必须用新的 rbd CLI 选项
--data-pool <ec pool>创建,以指定存放数据对象的 EC 池;直接在一个 EC 池上创建镜像不会成功,因为镜像的底层元数据仅支持副本池:
rbd create --data-pool <ec_pool> <image_name> --size <size>- rbd-mirror 守护进程现在支持将动态镜像 feature 更新与镜像 metadata 键值对从主镜像复制到非主镜像。
- 镜像快照数量可配置上限限制。
- rbd Python API 支持异步 IO 操作。
CephFS 层
- libcephfs 函数定义变更,以支持正确的 uid/gid 控制,库版本号相应提升。
- standby replay MDS 在执行删除类工作负载时内存占用更低。
- Scrub 现在可修复 backtrace,并将发现的问题填充到
damage ls。 cephfs-data-scan新增pg_files子命令,可识别受损坏或丢失 RADOS PG 影响的文件。- 修复了“failing to respond to cache pressure”误报告警。
BlueStore 专题:直接管理裸设备的新存储后端
BlueStore 是 Kraken 最受关注的新特性。与依赖 XFS 文件系统把对象存为文件的 FileStore 不同,BlueStore 直接管理底层块设备,实现了专为 Ceph OSD 工作负载设计的类文件系统磁盘结构。当前仓库中其实现位于 src/os/bluestore(核心为BlueStore.cc,配套 BlueFS 用于管理 RocksDB 元数据与 WAL)。
关键特性:
- 全量数据校验和:写入磁盘的所有数据带校验和,所有读取默认进行校验和验证。
- 内联压缩:可通过池属性按池启用,或通过客户端 hint 按对象启用。
- 高效日志(journal):与 FileStore 将所有数据写入日志设备不同,BlueStore 只记录元数据以及(某些场景下的)小写入,因此日志的体积与吞吐要求大幅降低。日志可与数据共置在同一设备,也可放到更小的高性能设备(如 SSD/NVMe);BlueStore 日志默认仅 512 MB。
BlueStore 磁盘格式预期会继续演进,但 OSD 会在升级时提供迁移到新格式的支持。
注意:BlueStore 在 Kraken 中仍标记为“experimental”。官方建议用于概念验证与测试环境,或可容忍数据丢失的场景。虽然在测试环境中表现稳定,但代码较新、缺陷不可避免;社区希望通过 Kraken 部署的反馈,在下一个大版本 Luminous 中将其标记为稳定(并设为默认)。
启用 BlueStore 需在 ceph.conf 中加入:
enable experimental unrecoverable data corrupting features = bluestore创建 BlueStore OSD 时,向 ceph-disk 或 ceph-deploy 传入--bluestore选项即可。
从 Jewel 升级到 Kraken 的完整指南
从 11.1.0 候选版升级
BlueStore 在 11.1.0 之后发生了磁盘格式变更,任何用 11.1.0 创建的 BlueStore OSD 都必须销毁并重建。
从 Jewel 10.2.z 升级
升级前置条件与顺序如下:
- 必须先升级到 Jewel 10.2.z:所有集群必须先升级到 Jewel 10.2.z,才能升级到 Kraken 11.2.z(或之后的 Luminous 12.2.z)。
- 必须设置
sortbitwise标志:升级到 Kraken 前,Jewel 集群必须已设置该标志。最新的 Jewel(10.2.8+)在未设置时会发出健康告警,因此通常已设置;若未设置,Kraken OSD 将拒绝启动并在日志中打印错误。 - 升级顺序:OSD、Monitor、MDS 可按任意顺序升级;RGW 守护进程应最后升级。
- ceph-mgr 自动创建:升级时,新的 ceph-mgr 实例会自动与各 monitor 一同创建(Jewel→Kraken 与 Jewel→Luminous 均如此,Luminous 之后的升级则不一定)。若不想让 ceph-mgr 与 ceph-mon 共置,可自行创建新的 ceph-mgr 实例并销毁自动创建的实例。
升级注意事项与新配置选项速查
以下为升级到 Kraken 后需要注意的行为变化与新增配置项(均来自原发布说明,并可在 src/common/options/global.yaml.in 中核对部分参数定义):
| 配置项 / 命令 | 默认值 | 说明 |
|---|---|---|
osd scrub during recovery | false | OSD 在恢复进行期间不再启动新的 scrub;如需恢复旧行为(不让恢复活动影响 scrub 调度)设为true |
mon_dns_srv_name | ceph-mon | 构建 monmap 的 monitor 主机/地址列表可通过 DNS SRV 记录获取,本项定义查询 DNS 时使用的服务名 |
osd class load list | 全部内置类 | 允许 OSD 加载的对象类名列表(*表示所有类),默认包含全部现有内置类以保持向后兼容 |
osd class default list | 全部内置类 | 客户端仅凭*、x、class-read、class-write能力即可调用的类名列表;不在列表中的类需要具名能力(如allow class foo) |
rgw rest getusage op compat | false | 控制 S3 GetUsage API 是否输出用户统计的描述性 JSON。true时输出"stats": { "TotalBytes": 516, "TotalBytesRounded": 1024, "TotalEntries": 1 };false时保持旧式数组[ 516, 1024, 1 ] |
osd out .../osd in ... | — | 现在会保留 OSD 权重:将 OSD 标记 out 再 in 后,权重与之前相同(此前显式操作会被重置为 1.0,只有 mon 自动标记时才保留) |
ceph osd perf | — | 列名由fs_commit_latency(ms)/fs_apply_latency(ms)改为commit_latency(ms)/apply_latency(ms),因这些指标并非 filestore 专属 |
mon_allow_pool_delete | false | Monitor 默认不再允许删除池;需显式设为true才允许删除,作为防误删的额外保护。当前仓库中该选项定义于 global.yaml.in,类型 bool、服务为 mon |
mon keyvaluedb = rocksdb | — | 若此前手工指定了该选项,需在 mon 数据目录手工添加kv_backend文件以保留设置:echo rocksdb > /var/lib/ceph/mon/ceph-<hostname>/kv_backend。新 monitor 默认使用 rocksdb,但若该文件不存在,既有 monitor 将使用 leveldb;mon keyvaluedb现在只影响创建时的后端选择 |
osd crush initial weight | -1(负值) | 为新 OSD 指定 CRUSH 权重。此前 0(默认)表示按 OSD 存储容量自动加权;现在 0 表示权重为 0,负值(新默认)表示按容量自动加权。若配置文件中显式写了 0,需改为负值(如 -1)以保持原行为 |
osd crush location | 已废弃 | 不再支持,请改用crush location配置项 |
osd_max_omap_entries_per_request | 131072(Kraken 时) | librados omap get_keys/get_vals 服务端单次响应键数上限 |
osd_max_omap_bytes_per_request | 4 MB(Kraken 时) | omap 单次响应总字节数上限,防止粗心用户单次请求过量数据(当前仓库默认值已演进,见 global.yaml.in) |
| 恢复优先级计算 | — | 已更新;升级过程中可能出现不符合直觉的恢复优先级排序(新旧 OSD 使用不同优先级区间),升级完成后集群将使用一致的值 |
其他需要注意的打包与生态变化:
- debian 开发包(lib*-dev)不再包含静态库与 libtool 伪库(.la 文件),共享库(.so)照常打包。
- jerasure 与 shec 插件可在运行时检测 SIMD 指令,不再需要为不同处理器显式配置。
jerasure_generic、jerasure_sse3、jerasure_sse4、jerasure_neon、shec_generic、shec_sse3、shec_sse4、shec_neon均已废弃,直接使用这些插件会在 mon 日志中看到告警,请改用jerasure或shec。
v11.2.1 各组件修复要点
v11.2.1 包含跨所有 Ceph 组件的大量缺陷修复,按主题整理如下(完整逐条清单见 doc/changelog/v11.2.1.txt):
- 构建与打包(build/ops):Ubuntu Xenial 上 ceph-base 缺少 psmisc 依赖;debian 包缺少 logrotate;SELinux 安装时并行 relabel;spec 文件引用不存在的 ceph-create-keys systemd 单元导致 ceph-mon 无法经 preset 启用;systemd 在 ceph-mon 启动失败后重启过快;systemd 调整为先启动 MON 再启动 OSD。
- ceph-disk:新增
fix子命令的 Kraken backport;不支持非ceph集群名的问题;启动时启用目录型 OSD;bluestore 下--setgroup组名错误、prepare组名错误;分区创建与设备节点创建的竞态;list在带 SELinux context 挂载选项时误报挂载错误。 - CephFS / MDS / client:修复 ceph-fuse 快照测试崩溃、与 MDS 断连后不恢复、两客户端访问同一文件死锁、大规模 cap/inode 下 rejoin 时心跳超时、超大 xattr 导致 MDS 崩溃、非本地 quota 变更需 IO 才可见、
readdir提速(跳过无关 dn)、rmfailed命令无输出、文件打开标志内部归一化、handle_client_caps段错误等。 - librbd / rbd / rbd-mirror / rbd-nbd:允许在不打开父镜像的情况下打开镜像;resize RPC 消息向后兼容;
is_exclusive_lock_ownerAPI 应 ping OSD;break lock 时防止自我 blacklist;rbd-mirror 补删快照读错误、漏检镜像重新同步、未修改镜像 failover/failback 导致 split-brain、克隆镜像镜像竞态;rbd-nbd 增加信号处理器并校验内核映射;EC 池不支持覆盖写时拒绝使用。 - mon / OSD / bluestore / msgr:缓存分层基础池
last_force_resend不被尊重;大 quorum 下msg/async忙循环;force_create_pg可能卡在 creating;osd crush move不生效;osd crush set crushmap缺健全性检查;客户端节流器可在线调整;默认不发送 ENXIO(见上文);scrub 请求优先级提升、异步 scrub sleep 实现;bluestore 的 statfs 不把 DB 分区计入可用空间、Allocator 整数截断、onode 深解码;PG 统计发布、pg log split 索引重建等。 - RGW / multisite:多站点大量修复(large period 解码失败、
data sync命令挂起、元数据同步崩溃、SLO 对象 EPERM、zonegroup 更新回退删除、短 zone id 未清理等);Swift API 系列修复(对象过期remove-x-delete、根级特性/crossdomain.xml、/info、/healthcheck、x-openstack-request-id 头、versioning 禁用等);S3 相关(X-Amz-Expires v4 认证、版本列表缺 VersionIdMarker、压缩对象范围下载内容错误、copy-part 后对象大小错误、lifecycle 线程处理已删除 bucket 等)。 - 测试与工具:ceph-object-corpus 增加 kraken 对象;
radosgw-admin增加object stat命令到 usage;rados/ceph-objectstore-tool等工具修复若干崩溃与返回值问题。
v11.0.2 开发检查点要点
v11.0.2 是 Kraken 的首个开发检查点,标志着:
- ceph-mgr 首次亮相:提供额外监控能力及外部监控/管理系统接口的新守护进程(当前仓库见 src/mgr),也是后续版本中 dashboard、prometheus 等模块的基座。
- BlueStore 密集迭代:大量关于 BlueFS(异步 compaction、direct IO、WAL)、bitmap/bit 分配器、2Q 缓存 trim、校验和、压缩、onode 内存占用与编码优化的改动(对应 src/os/bluestore 下的
BlueStore.cc、BlueFS.cc、Allocator.cc等文件)。 - RGW 新能力:sync modules、multipart copy-part、经 ElasticSearch 的元数据检索(技术预览)。
该版本同时将 AsyncMessenger 设为默认消息后端,并引入 EC 覆盖写的早期实现基础。
源码印证路径速览
以下仓库位置可帮助读者深入验证本文涉及的关键实现:
- src/os/bluestore:BlueStore/BlueFS 后端实现。
- src/osd/OSD.cc#L1653-L1706:
handle_misdirected_op误定向操作处理(ENXIO 行为的基础)。 - src/osd/OSD.cc#L3659-L3668:
osd_snap_trim_sleep系列选项取值逻辑;OSD.cc#L10089-L10188 为osd_max_trimming_pgs的在线调整入口。 - src/common/options/global.yaml.in:
mon_allow_pool_delete、osd_max_omap_entries_per_request、osd_max_omap_bytes_per_request等配置项的定义与默认值。 - src/mgr:ceph-mgr 守护进程源码。
- doc/changelog/v11.2.1.txt:v11.2.1 完整逐条变更日志。
结语
Kraken 是 Ceph 迈向 Luminous 的关键过渡版本:BlueStore 首次以稳定磁盘格式走向用户,AsyncMessenger 成为默认消息框架,ceph-mgr 架构正式落地,EC 覆盖写则开启了纠删码池的新可能。对运维而言,本文给出的升级顺序(先 Jewel 10.2.z、确保sortbitwise、最后升级 RGW)、OSD 删除顺序(先crush rm再osd rm)以及新配置项速查表,是安全完成此次升级的实用清单;对开发者而言,上述源码路径则为深入理解这些行为变化提供了起点。
- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
【免费下载链接】ceph
Ceph is a distributed object, block, and file storage platform
相关推荐
Joplin Web Clipper 完全指南:安装、配置、排障与 API 集成
Joplin Web Clipper 完全指南:安装、配置、排障与 API 集成 Web Clipper 是 Joplin 官方提供的浏览器扩展,用于从浏览器中
存储分布式文件系统对象存储后端高可用Drupal 文件上传存储型 XSS 漏洞(CVE-2019-6341)复现与原理剖析
Drupal 文件上传存储型 XSS 漏洞(CVE 2019 6341)复现与原理剖析 本篇指南以 Vulhub 漏洞环境仓库中的 drupal/CVE 201
存储分布式文件系统对象存储后端高可用Task Estimate: [Task Name]
Task Estimate: Task Name Generated: Date Task Description Restate the task clear
存储分布式文件系统对象存储后端高可用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考