ceph 的 pg
查看 pg 信息
-
查看 pg 信息
输出 json 格式 -
查看 pg 信息摘要
-
查看 pg 数据量
-
查看 pg 恢复状态
-
查看 pg 对应到的 osd
关于 pg 自动伸缩
每个存储池都有一个 pg_autoscale_mode 属性,可以设置为 off 、 on 、或 warn 。
- off: 此存储池禁用自伸缩。由管理员为各个存储池选择合适的 PG 数量。
- on: 在指定存储池上启用 PG 数的自动调整。
- warn: PG 数应该调整时发出健康报警。
为现有存储池设置自伸缩模式,
示例,给池 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 ,它将应用于以后创建的所有存储池:
更改 pg 回填或恢复优先级
提高 pg 回填或恢复优先级,命令下发后,要等当前正在执行的回填或恢复完后才对指定的 pg 开始操作。
示例
# 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
取消提高优先级
调整 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
后也是如此 )。
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
。
示例
# 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 映射关系
- 禁用平衡和恢复
-
调整映射
-
pg 的状态发生了改变
- 开启平衡和恢复
调整 Scrub 时间段
默认是全天都跑,这里改成晚上 22 点到 早上 09 点跑。
如果是容器跑的,注意看容器里的时间是否正确,以容器里的时间为准。
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 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。
更多请参考:
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,观察一会没进展。
后面陆续把 osd 都重启了一遍,还是没进展。
后面发现是系统慢,系统一直在刷新 pg,只是没有刷到告警的 pg,等排队到刷完后正常了。