Ceph怎么调整CRUSHMap规则将数据精确分布在不同机房与机架

夏辰酱_2264

夏辰酱_2264

2026-10-15

241人浏览

原创

要实现pg按机房→机架→主机→osd层级分布,必须显式建模物理拓扑:先用ceph osd crush add-bucket创建rack、room等bucket,再用ceph osd crush move逐级挂载;然后编写含chooseleaf firstn 3 type rack的crush规则,确保副本落于不同机架且最终收敛到osd;规则生效需配合扩容、重权或重建pool触发重分布。

ceph怎么调整crushmap规则将数据精确分布在不同机房与机架

要让 PG 真正按机房 → 机架 → 主机 → OSD 的层级分布,不能只靠默认 default root 和 host bucket;必须显式建模物理拓扑,并绑定规则到对应 failure domain。否则 CRUSH 会“以为”所有 OSD 都在同一个机架里,副本就可能落在同一台机器甚至同一块盘上。

怎么建模机房和机架的 bucket 层级

CRUSH Map 是树形结构,叶子是 OSD,中间节点是虚拟 bucket(如 rack、room、root)。默认只有一层 host,你要手动补全上层。

  • 先用 ceph osd tree 确认当前 OSD 所属主机名(比如 serverc0、serverd3),再按物理归属分组:哪些主机属于 rack1,哪些属于 rack2,哪些 rack 属于 room-a
  • 用 ceph osd crush add-bucket 创建新 bucket:ceph osd crush add-bucket rack1 rack、ceph osd crush add-bucket room-a room
  • 用 ceph osd crush move 把 host 挪进 rack,再把 rack 挪进 room:ceph osd crush move serverc0 rack=rack1,ceph osd crush move rack1 room=room-a
  • 最后把 room 挂到 root:ceph osd crush move room-a root=default(注意不要覆盖原有 default,可新建 root=dc-prod 更安全)

怎么写 rule 强制副本跨机房+跨机架

关键在 chooseleaf 的 type 和 num_reps 参数。想实现「3副本,分别落在不同机房、且每个机房内再落在不同机架」,rule 必须分两步选:

知了追踪
知了追踪

一款AI开发辅助工具,主要用于AI智能信息助手,智能追踪你的兴趣资讯,适合需要提升相关任务效率的用户。

下载
  • 第一步用 chooseleaf firstn 3 type room:从 room bucket 中选 3 个不同机房(要求集群至少有 3 个机房)
  • 第二步对每个选中的 room,再向下选 rack —— 但 CRUSH rule 不支持嵌套,所以实际得改成:chooseleaf firstn 1 type rack,并确保每个 rack 下至少有 1 个 OSD 可用
  • 更稳妥的做法是设 type rack + firstn 3,再靠 chooseleaf 自动落到 rack 下的 OSD:这样能保证 3 副本在 3 个不同机架,且只要每个 rack 有 ≥1 OSD 就能成功
  • 完整 rule 示例:
    rule dc-safe {
        ruleset 1
        type replicated
        min_size 1
        max_size 10
        step take dc-prod
        step chooseleaf firstn 3 type rack
        step emit
    }

为什么 choose firstn 不行,必须用 chooseleaf

choose 只选 bucket 节点(比如选中 3 个 rack),不往下钻;而 chooseleaf 会递归选到叶子 OSD。如果你写 choose firstn 3 type rack,CRUSH 返回的是 3 个 rack ID,客户端根本没法定位 OSD,写入直接失败,报错类似 error 22: Invalid argument 或卡在 pg is stuck inactive。

  • 只有 chooseleaf 才真正完成「从 rack → host → OSD」的路径收敛
  • 如果某 rack 下所有 OSD out 或 down,chooseleaf 会自动 fallback 到其他 rack,而 choose 会直接报错
  • 验证 rule 是否生效:用 ceph osd getcrushmap -o map.bin && crushtool -d map.bin -o map.txt 查看 rule 步骤,确认含 chooseleaf

调整后 PG 分布没立刻变化?别急着重刷

CRUSH rule 变更只影响新写入对象的 PG 映射,已有 PG 不会自动迁移。你看到 ceph -s 里 PG 状态还是 active+clean,不代表数据已跨机房。

  • 真正触发重分布靠两个动作:扩容(加新 OSD)、或执行 ceph osd reweight 改权重(让 CRUSH 认为某些 OSD “更值得放数据”)
  • 更可控的方式是重建 pool:删旧 pool → 用新 rule 创建同名 pool → 用 rbd export/import 或 ceph-migrate 迁移数据
  • 切记:改 rule 前先 ceph osd set noout,避免 reweight 过程中 OSD 临时 down 导致 PG remap 风险

最易被忽略的一点:CRUSH rule 里的 type 名称必须和 bucket 定义时完全一致(大小写敏感),rack 写成 Rack 或 rack1 都会导致 rule 加载失败且无明确提示,只会表现为 PG 永远无法进入 active 状态。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

550

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

513

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

283

6

Python uv使用教程
Python uv使用教程

本专题汇总了 Python uv 使用教程与高效使用指南,从 uv 安装配置、常用命令到虚拟环境、依赖管理与项目打包,系统讲解如何用 uv 替代 pip 与 poetry,全面提升 Python 项目开发效率,助你快速上手这一现代化包管理工具,打造干净高效的 Python 工作流。

2026.10.15

0

15

剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

2026.10.14

0

15

剧云AI剧本创作零基础入门
剧云AI剧本创作零基础入门

本专题系统讲解剧云AI剧本创作流程,涵盖灵感、梗概、大纲、分场与正文生成,帮助新手快速完成首个中文剧本项目。

2026.10.14

0

14

VibeKnow文档转视频操作指南
VibeKnow文档转视频操作指南

本专题讲解VibeKnow上传Word、TXT、Markdown等材料生成视频的方法,覆盖内容解析、脚本组织、画面生成与成片检查。

2026.10.14

0

15

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

2026.10.14

0

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习