Pg和pgp的含义:
PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
PG的增加会引起PG内的数据进行分裂,分裂到相同的OSD上新生成的PG当中
PGP的增加会引起部分PG的分布进行变化,但是不会引起PG内对象的变动
存储池pg的计算:
Pg数量=(osd数量*200)/副本数
例子 1:创建存储池时,有 10 个硬盘,副本数为 2。
PgNumBase = (10 * 200) / 2 = 1000,找到的 N 为 9,即 29 < 1000 < 210 ,因为 1000 > ( 29 * 1.25 ),所以最后得到 PgNum = 1024。
例子 2:创建存储池时,有 9 个硬盘,副本数为 3。
PgNumBase = (9 * 200) / 3 = 600,找到的 N 为 9,即 29 < 600 < 210 ,因为 600 <= ( 29 * 1.25 ),所以最后得到的 PgNum = 512。
Pg的角色
正常情况下同一个pg所有的实例保存的内容完全相同,原则上不需要对它们的身份加以区分,但是出于数据一致性考虑,仍然需要从中选出一个起主导作用的实例,称为Primary,由其作为集中点对所有任务进行统筹管理。Primary之外的实例统称为Replica(副本),所有的写操作都是写道primary完后再由主传递到其他的副本。这样能够保证数据的一致性
Pg的常见状态
状态 |
描述 |
Activating |
Peering即将完成,PG正在等待所有PG实例同步并固化Peering的结果(Info、Log等) |
Active |
PG可以正常处理来自客户端的读写请求 |
Backfilling |
正在后台填充态。 backfill是recovery的一种特殊场景,指peering完成后,如果基于当前权威日志无法对Up Set当中的某些PG实例实施增量同步(例如承载这些PG实例的OSD离线太久,或者是新的OSD加入集群导致的PG实例整体迁移) 则通过完全拷贝当前Primary所有对象的方式进行全量同步 |
Backfill-toofull |
某个需要被Backfill的PG实例,其所在的OSD可用空间不足,Backfill流程当前被挂起 |
Backfill-wait |
等待Backfill 资源预留 |
Clean |
PG当前不存在待修复的对象, Acting Set和Up Set内容一致,并且大小等于存储池的副本数 |
Creating |
PG正在被创建 |
Deep |
PG正在或者即将进行对象一致性扫描清洗(Deep-Scrub) |
Degraded |
降级状态。Peering完成后,PG检测到任意一个PG实例存在不一致(需要被同步/修复)的对象,或者当前ActingSet 小于存储池副本数 |
Down |
Peering过程中,PG检测到某个不能被跳过的Interval中(例如该Interval期间,PG完成了Peering,并且成功切换至Active状态,从而有可能正常处理了来自客户端的读写请求),当前剩余在线的OSD不足以完成数据修复 |
Incomplete |
Peering过程中, 由于 a. 无非选出权威日志 b. 通过choose_acting选出的Acting Set后续不足以完成数据修复,导致Peering无非正常完成 |
Inconsistent |
不一致态。集群清理和深度清理后检测到PG中的对象在副本存在不一致,例如对象的文件大小不一致或Recovery结束后一个对象的副本丢失 |
Peered |
Peering已经完成,但是PG当前ActingSet规模小于存储池规定的最小副本数(min_size) |
Peering |
正在同步态。PG正在执行同步处理 |
Recovering |
正在恢复态。集群正在执行迁移或同步对象和他们的副本 |
Recovering-wait |
等待Recovery资源预留 |
Remapped |
重新映射态。PG活动集任何的一个改变,数据发生从老活动集到新活动集的迁移。在迁移期间还是用老的活动集中的主OSD处理客户端请求,一旦迁移完成新活动集中的主OSD开始处理 |
Repair |
PG在执行Scrub过程中,如果发现存在不一致的对象,并且能够修复,则自动进行修复状态 |
Scrubbing |
PG正在或者即将进行对象一致性扫描 |
Unactive |
非活跃态。PG不能处理读写请求 |
Unclean |
非干净态。PG不能从上一个失败中恢复 |
Stale |
未刷新态。PG状态没有被任何OSD更新,这说明所有存储这个PG的OSD可能挂掉, 或者Mon没有检测到Primary统计信息(网络抖动) |
Undersized |
PG当前Acting Set小于存储池副本数 |
Ceph pg map 1.6c //查看pg和osd的映射关系
Ceph pg 1.6c query //查看pg的详细信息
Ceph pg scrub {pg-id} //清洗单个pg意思就是将这个pg中的数据和主pg同步达到数据一致性。
Ceph pg dump //查看pg的map
Ceph pg ls-by-osd 0 //指定osd.0查看pg的状态
Ceph pg ls-by-pool mytest //指定mytest池查看pg的状态
Ceph pg ls-by-primary osd.0 //指定osd.0查看主pg的状态
如果pg的状态一直卡在recovery_wait或backfill_wait这俩个状态中
1、查看卡住PG的具体信息
# ceph pg $pgid query (重点关注recovery_state信息)
2、查看pg分布及各个分布osd上的资源预留情况
查看pg分布的osd
# ceph pg map $pgid
3、查看osd的资源预留情况(主要针对流控,涉及对端和本地)
# ceph daemon osd.$id dump_reservations
Local_reservations为本地资源预留信息,remote_reservations为远端信息
可以通过手动触发资源预留比如ceph osd down $id