跳转至

ceph 的 pg

查看 pg 信息

  • 查看 pg 信息

    ceph pg dump
    ceph pg ls
    ceph pg ls-by-osd osd.1
    ceph pg ls-by-pool virt.tier
    ceph pg ls-by-primary osd.1
    
    输出 json 格式
    ceph pg dump_json
    

  • 查看 pg 信息摘要

    # ceph pg dump pgs_brief | head
    dumped pgs_brief
    PG_STAT  STATE                        UP         UP_PRIMARY  ACTING     ACTING_PRIMARY
    19.1b                   active+clean  [4,17,11]           4  [4,17,11]               4
    18.1a                   active+clean   [3,14,9]           3   [3,14,9]               3
    14.6                    active+clean  [16,11,5]          16  [16,11,5]              16
    

  • 查看 pg 数据量

    ceph pg 7.15 query | jq .info.stats.stat_sum.num_bytes 
    

  • 查看 pg 恢复状态

    ceph pg 13.12 query | jq .recovery_state
    

  • 查看 pg 对应到的 osd

    # ceph pg map 7.1e
    osdmap e21288 pg 7.1e (7.1e) -> up [1,14,8] acting [1,14,8]
    


关于 pg 自动伸缩

每个存储池都有一个 pg_autoscale_mode 属性,可以设置为 off 、 on 、或 warn 。

  1. off: 此存储池禁用自伸缩。由管理员为各个存储池选择合适的 PG 数量。
  2. on: 在指定存储池上启用 PG 数的自动调整。
  3. warn: PG 数应该调整时发出健康报警。

为现有存储池设置自伸缩模式,

ceph osd pool set <pool-name> pg_autoscale_mode <mode>

示例,给池 virt-rbd 关闭自动伸缩 :

# ceph osd pool set virt-rbd pg_autoscale_mode off  # 设置
set pool 18 pg_autoscale_mode to off

# ceph osd pool get virt-rbd pg_autoscale_mode      # 查看
pg_autoscale_mode: off

# ceph osd pool autoscale-status                    # 查看

也可以配置默认的 pg_autoscale_mode ,它将应用于以后创建的所有存储池:

ceph config set global osd_pool_default_pg_autoscale_mode <mode>

更改 pg 回填或恢复优先级

提高 pg 回填或恢复优先级,命令下发后,要等当前正在执行的回填或恢复完后才对指定的 pg 开始操作。

ceph pg force-recovery PG1 [PG2] [PG3 ...]
ceph pg force-backfill PG1 [PG2] [PG3 ...]

示例
# ceph pg force-recovery 7.5 7.13
instructing pg(s) [7.5] on osd.14 to force-recovery; instructing pg(s) [7.13] on osd.29 to force-recovery;

# ceph pg force-backfill 7.5 7.13
instructing pg(s) [7.5] on osd.14 to force-backfill; instructing pg(s) [7.13] on osd.29 to force-backfill;

# ceph -s | grep -A10 pgs:
    pgs:     75480/94798503 objects degraded (0.080%)
             23654791/94798503 objects misplaced (24.953%)
             255 active+remapped+backfill_wait
             174 active+clean
             2   active+remapped+backfilling
             1   active+forced_recovery+undersized+degraded+remapped+backfilling+forced_backfill
             1   active+undersized+degraded+remapped+backfill_wait+forced_backfill

取消提高优先级

ceph pg cancel-force-recovery PG1 [PG2] [PG3 ...]
ceph pg cancel-force-backfill PG1 [PG2] [PG3 ...]

调整 pg 数量

调整 pg 后还要调整 pgp,数据才开始平衡,pg 和 pgp 两者的值要一样。

# ceph osd pool get virt-rbd pg_num
pg_num: 32
# ceph osd pool get virt-rbd pgp_num
pgp_num: 32

# ceph osd pool set virt-rbd pg_num 256
set pool 18 pg_num to 256
# ceph osd pool set virt-rbd pgp_num 256
set pool 18 pgp_num to 256

在 ceph 16 版本中,pgp_num 慢慢涨上去(发现关掉 autoscale 后也是如此 )。

pg_num 256 pgp_num 221 pgp_num_target 256
pgp_num 还没有达到 pgp_num_target 时,pg 在恢复过程中可能会出现以下告警并反复跑恢复。达到后恢复过程才能顺利进行下去。
[WRN] Health check failed: Reduced data availability: 1 pg peering (PG_AVAILABILITY)
[INF] Health check cleared: PG_AVAILABILITY (was: Reduced data availability: 1 pg peering)
[INF] Cluster is now healthy
[INF] overall HEALTH_OK
[INF] overall HEALTH_OK
[WRN] Health check failed: Reduced data availability: 2 pgs peering (PG_AVAILABILITY)
[INF] Health check cleared: PG_AVAILABILITY (was: Reduced data availability: 2 pgs peering)
[INF] Cluster is now healthy

更改 min_size

如果设置的是 min_size=2 ,如果存活 osd 数少于 2 时 Ceph 就不会响应客户端的 IO 请求。

可在线修改。

# ceph osd pool get virt-rbd min_size
min_size: 2                              # 修改前

# ceph osd pool set virt-rbd min_size 1  # 修改
set pool 18 min_size to 1

# ceph osd pool get virt-rbd min_size
min_size: 1                              # 修改后

临时变更 pg 主 osd

此命令为developers only

osd primary-temp <pgid> <id|osd.id>

示例

# ceph pg dump pgs_brief | egrep -w "^7.1|ACTING_PRIMARY"
PG_STAT  STATE         UP         UP_PRIMARY  ACTING     ACTING_PRIMARY
7.1      active+clean   [8,29,3]           8   [8,29,3]               8   # 变更前主在 osd.8

# ceph osd primary-temp 7.1 29                                            # 变更主为 osd.28
set 7.1 primary_temp mapping to 29

# ceph pg dump pgs_brief | egrep -w "^7.1|ACTING_PRIMARY"
PG_STAT  STATE         UP         UP_PRIMARY  ACTING     ACTING_PRIMARY
7.1      active+clean   [8,29,3]           8   [8,29,3]              29   # 过一会变更完成

ceph pg dump osds 里的 PRIMARY_PG_SUM 数量不会因此命令变化。

更新指定 pg 映射关系

此命令为developers only

修改后提示成功,但映射没有改变,有可能是目标的 osd 不满足迁移条件(比如 crush weight 满了)。 做一次变更成功后,如果下次变更时检查到有 osd 不满足条件(虽然提示已经映射)则映射会变回原来的值。

# ceph pg map 7.5
osdmap e21621 pg 7.5 (7.5) -> up [14,0,8] acting [14,0,8]

ceph osd pg-upmap-items 7.5 14 23            # 只修改第 1 个:14 -> 23
ceph osd pg-upmap-items 7.5 0 26             # 只修改第 2 个:0 -> 26
ceph osd pg-upmap-items 7.5 14 23 0 26       # 修改第1、2个:14->23,0->26
ceph osd pg-upmap-items 7.5 14 23 0 26 8 29  # 3 个一起修改:14->23,0->26,8->29

ceph osd pg-upmap 7.5 23 23 26 29            # 3 个一起修改:14->23,0->26,8->29

修改前设置禁止回填和恢复,在做映射变更后如果想撤销可把映射回退。

案例:更新一 pg 的 osd 映射关系
  1. 禁用平衡和恢复
    ceph osd set nobackfill ; ceph osd set norecover 
    
  2. 调整映射

    # ceph pg map 7.5                                                  # 查看映射
    osdmap e21748 pg 7.5 (7.5) -> up [14,0,8] acting [14,0,8]
    
    # ceph osd pg-upmap-items 7.5 0 23                                 # 把 0 重新映射到 23
    set 7.5 pg_upmap_items mapping to [0->23]
    
    # ceph pg map 7.5                                                  # 确认映射
    osdmap e21751 pg 7.5 (7.5) -> up [14,23,8] acting [14,8,0]
    

  3. pg 的状态发生了改变

    [root@telecom-ceph-phy01 ~]# ceph pg dump pgs_brief | egrep "^7.5"
    dumped pgs_brief
    PG_STAT  STATE                        UP         UP_PRIMARY  ACTING     ACTING_PRIMAR
    7.5      active+remapped+backfilling  [14,23,8]          14   [14,8,0]              14
    

  4. 开启平衡和恢复
    ceph osd unset nobackfill ; ceph osd unset norecover 
    

调整 Scrub 时间段

默认是全天都跑,这里改成晚上 22 点到 早上 09 点跑。

如果是容器跑的,注意看容器里的时间是否正确,以容器里的时间为准。

下面配置是临时生效,osd 重启后配置会丢失。
ceph tell osd.* injectargs --osd_scrub_begin_hour 22
ceph tell osd.* injectargs --osd_scrub_end_hour 09

调整 recover 速度

调整前先把默认值(或当前值)纪录下来。以便恢复。

  • 恢复(下面是 ceph version 16.2.7 的默认值)

    下面配置是临时生效,osd 重启后配置会丢失。
    ceph tell osd.* injectargs '--osd_max_backfills 1  --osd_recovery_max_active 0  --osd_recovery_max_single_start 1 --osd_recovery_sleep_hdd 0.1 '
    

  • 加大恢复速度(注意对业务的影响)

    下面配置是临时生效,osd 重启后配置会丢失。
    ceph tell osd.* injectargs '--osd_max_backfills 16 --osd_recovery_max_active 16 --osd_recovery_max_single_start 16 --osd_recovery_sleep_hdd 0  '
    

    运行上面命令后,新加的 osd 或重启过的 osd 还是默认的参数,涉及此 osd 的恢复速度还是会慢。

    pg 数计算

( Target PGs per OSD ) x ( OSD # ) x ( %Data ) / ( Size )

( 100 ) x ( osd 个数 ) x ( 池数据占比 ) / ( 副本数 )

50 个 osd 以下,Target PGs per OSD 用 100。

更多请参考:

  1. PG Calc — Ceph Documentation
  2. 3.4. 放置组计数 Red Hat Ceph Storage 7 | Red Hat Customer Portal

pgs not deep-scrubbed in time

结论:手动下发 ceph pg deep-scrub pgid,如果系统在刷新中则等系统刷新完成。

系统报 3 pgs not deep-scrubbed in time,同时发现 5 active+clean+scrubbing+deep 。 有几个 pg 挂在 scrubbing+deep 好久了。怀疑卡住或速度慢,导致 pg 没有及时刷新完成。

手动触发报 not deep-scrubbed in time 的 pg,观察一会没进展。

ceph pg deep-scrub 7.1e
手动下发下面的命令,观察一会还是没进展。
ceph pg scrub 7.1e
ceph pg repair 7.1e

后面陆续把 osd 都重启了一遍,还是没进展。

ceph orch daemon restart osd.8 

后面发现是系统慢,系统一直在刷新 pg,只是没有刷到告警的 pg,等排队到刷完后正常了。

创建时间: 2024-06-06 09:14:32 最后更新: 2024-06-13 12:56 更新次数: 5 浏览次数: