当前位置: 首页 > 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.lryc.cn/news/618728.html

相关文章:

  • 【Docker项目实战】使用Docker部署Vikunja任务管理工具
  • 熟悉并使用Spring框架 - XML篇
  • 破译真实感:渲染参数进阶指南——告别塑料感,唤醒材质生命力
  • 98、【OS】【Nuttx】【构建】cmake 配置问题定位:menuconfig.dir/build.make
  • 【力扣494】目标和
  • 笔试——Day36
  • Unity-VR插件AutoHand
  • Day 10-2: Mini-GPT完整手写实战 - 从组件组装到文本生成的端到端实现
  • 武汉火影数字|VR红色文化馆打造 沉浸式体验红色文化
  • Coze开源 Agent 的“乐高时代”
  • 【19】万集科技——万集科技嵌入式,校招 一面,二面,面试问答记录
  • Java 编程每日一题:实现一个简易的 LRU 缓存
  • 站在Vue的角度,对比鸿蒙开发中的递归渲染
  • C++单继承虚函数表探索
  • 什么是跨域访问问题,如何解决?
  • 使用 rsync 上传下载文件:详解原理、目录同步和常见问题
  • 间隙锁(Gap Lock)
  • 【C++】5. 内存管理
  • 卫生间装修防水怎么做合适?
  • redis原理篇--Dict
  • 《Linux基础知识-1》
  • Linux随记(二十二)
  • Secure 第二天作业
  • SM2和SM4加密算法详解
  • 防火墙快速管理软件,66K超小巧
  • 【网络运维】Linux和自动化:Ansible
  • WEB虚拟主机3种部署方式全解析
  • Linux软件编程(三)文件操作-文件 I/O
  • Outstanding和Credit的概念详解
  • 动态路由协议(一)