当前位置: 首页 > news >正文

Ceph存储池参数中pg_num和pgp_num的关系

在 Ceph 中,pg_num(Placement Group 数量)和 pgp_num(Placement Group for Placement 数量)是存储池的两个关键参数,虽然通常设置为相同值,但它们的职责完全不同。以下是详细对比和解释:


1. 核心区别

参数作用范围影响阶段修改代价
pg_num数据逻辑分片数量数据写入阶段高(触发数据迁移)
pgp_numCRUSH 计算时的可用 PG 范围数据分布阶段低(仅影响新写入)

2. 具体功能解析

(1) pg_num:逻辑 PG 数量
  • 作用:决定存储池中逻辑分片(PG)的总数,直接影响:
    • 数据分布的粒度(PG 越多,分布越均匀)。
    • 每个 OSD 承载的 PG 数量(需满足 (pg_num × 副本数) / OSD总数 ≈ 100)。
  • 修改影响
    • 增加 pg_num 会触发 数据重平衡(大规模数据迁移)。
    • 减少 pg_num 通常不允许(可能导致数据丢失)。
(2) pgp_num:CRUSH 计算时的 PG 范围
  • 作用:限定 CRUSH 算法在计算数据分布时可用的 PG 数量(必须 ≤ pg_num)。
    • 仅影响新写入数据的分布位置。
    • 不改变现有数据的 PG 映射(除非手动触发重平衡)。
  • 修改影响
    • 增加 pgp_num 仅影响新数据,无数据迁移。
    • 减少 pgp_num 可能导致新数据分布更集中(但旧数据不变)。

3. 为什么通常设置为相同值?

  • 默认最佳实践
    pgp_num == pg_num 时,所有 PG 均可用于数据分布,确保:
    • 最大化的数据分散性。
    • 避免人为限制 CRUSH 算法的选择范围。
  • 例外情况
    在特殊场景下(如临时优化性能),可能会设置 pgp_num < pg_num,但通常不推荐。

4. 工作流程对比

(1) 数据写入流程
  1. 计算 PGhash(object) % pg_num → 确定对象所属的 PG(逻辑分片)。
  2. 计算 OSD:CRUSH 从 pgp_num 范围内的 PG 中选择目标 OSD。
(2) 修改参数的影响
操作pg_num 变化pgp_num 变化
增加触发数据迁移(分裂 PG)仅影响新数据分布
减少通常禁止可能导致新数据分布收缩

5. 生产环境示例

(1) 创建存储池
# 创建池时通常设置 pg_num = pgp_num
ceph osd pool create mypool 128 128  # pg_num=128, pgp_num=128
(2) 调整 PG 数量
# 扩容时同时增加 pg_num 和 pgp_num(避免数据分布受限)
ceph osd pool set mypool pg_num 256
ceph osd pool set mypool pgp_num 256  # 必须手动执行,不会自动同步
(3) 特殊场景:临时限制分布
# 临时缩小 pgp_num 以减少数据分散(如调试性能问题)
ceph osd pool set mypool pgp_num 64  # 仅新数据使用前64个PG

6. 监控与调优建议

  • 检查当前设置
    ceph osd pool get mypool pg_num
    ceph osd pool get mypool pgp_num
    
  • 确保一致性
    # 如果 pgp_num < pg_num,建议调整为相同值
    ceph osd pool set mypool pgp_num <pg_num_value>
    
  • 重平衡触发
    • 修改 pg_num 后,Ceph 会自动启动数据迁移。
    • 可通过 ceph -w 监控迁移进度。

7. 总结

关键点pg_numpgp_num
定义逻辑 PG 总数可用于 CRUSH 计算的 PG 数
主要作用控制数据分片粒度控制数据分布范围
修改影响触发数据迁移(高代价)仅影响新数据(低代价)
最佳实践按 OSD 数量和副本数计算通常与 pg_num 相同

简单记忆

  • pg_num 是“总房间数”,决定能放多少数据。
  • pgp_num 是“可选的房间数”,决定新数据能放哪些房间。
  • 两者一致时,所有房间均可自由使用。
http://www.xdnf.cn/news/1285273.html

相关文章:

  • 终端安全检测和防御技术
  • 华为发布AI推理新技术,降低对HBM内存依赖
  • 负载均衡详解
  • 纯CSS+JS制作抽奖大转盘
  • C#教程之NPOI读写excel文件XLS,XLSX格式
  • 【vue(二)Vuex】
  • damn the jvm again(2)
  • 《Qwen2.5-VL 》论文精读笔记
  • 【测试】Bug+设计测试用例
  • 【Bug经验分享】由jsonObject-TypeReference引发的序列化问题
  • 无人机在环保监测中的应用:低空经济发展的智能监测与高效治理
  • 从0开始的中后台管理系统-5(菜单的路径绑定以及角色页面的实现)
  • Javase 之 字符串String类
  • 《飞算Java AI:从安装到需求转实战项目详细教学》
  • 机器学习算法篇(十):TF-IDF算法详解与应用实战
  • 线性代数 · 矩阵 | 最小多项式
  • IoTDB与传统数据库的核心区别
  • Spring Boot项目使用WebClient调用第三方接口详细教程
  • Elasticsearch Node.js 客户端连接指南(Connecting)
  • 一起来聊聊GPT-5
  • 面试经典150题[001]:合并两个有序数组(LeetCode 88)
  • 从零开始手搓一个GPT大语言模型:从理论到实践的完整指南(一)
  • 安全合规5--终端安全检测和防御技术
  • MySQL基础面试
  • MySQL 索引优化实战:从执行计划分析到优化策略落地
  • 【狂热算法篇】探寻图论幽径之SPFA算法:图论迷宫里的闪电寻径者(通俗易懂版)
  • 【Unity笔记】视频播放控制器全攻略:支持延迟播放、事件回调与多视频管理的完整实现
  • 数据结构:图
  • 【力扣494】目标和
  • 【代码随想录day 17】 力扣 98.验证二叉搜索树