Ceph PG介绍及故障状态和修复
1 PG介绍
pg的全称是placement group,中文译为放置组,是用于放置object的一个载体,pg的创建是在创建ceph存储池的时候指定的,同时跟指定的副本数也有关系,比如是3副本的则会有3个相同的pg存在于3个不同的osd上,pg其实在osd的存在形式就是一个目录,可以列出来看下:
[root@abc ~]# ll /var/lib/ceph/osd/ceph-/current/
total
drwxr-xr-x root root Sep : .11_head
drwxr-xr-x root root Sep : .14_head
drwxr-xr-x root root Sep : .1f_head
drwxr-xr-x root root Sep : .24_head
drwxr-xr-x root root Sep : .24_TEMP
drwxr-xr-x root root Sep : .25_head
drwxr-xr-x root root Sep : .2d_head
drwxr-xr-x root root Sep : .2_head
drwxr-xr-x root root Sep : .34_head
这里只列出来一部分,可以看到有1.24这样开头的,这其实就是pg的id,前面的1表示这个pg是对应哪个存储池的,存储池id可以通过ceph df看到:
[root@u131Oi ~]# ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
10704G 9808G 896G 8.37
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
volumes 116M 3059G
images 29218M 0.92 3059G
backups 3059G
vms 269G 8.09 3059G
snapshots 3059G
gnocchi 394M 0.01 3059G
说明该pg是属于volumes存储池的,后面的24是用于区分同个池中的不同的pg的,两者结合起来就作为pg的id了,crush map通过pgid可以计算出该pg是分布在哪组osd上的,可以通过如下命令查看pg分布于哪些osd上:
[root@abc ~]# ceph pg map 1.24
osdmap e1008 pg 1.24 (1.24) -> up [,,] acting [,,]
可以看到该pg的3副本分别是分布在osd.0,osd.2和osd.8上的,其中最前面的0表示主副本存在于osd.0上。
2 PG在ceph中的作用
从上面可以看到所有数据其实都是抽象成多个object,每个object都会对应到唯一的一个pg上(多副本表示有多个相同的pg,当然object也自然是多副本的),然后pg映射到osd上存储,所以pg可以说是ceph的核心概念了,那为什么要引进pg这个概念呢?
这是因为如果要追踪的目标如果是object,那么要追踪的数量就太多了,这样可能会加大复杂性,而且也会带来不小的开销,于是引进pg这个概念,把object装进pg中,以pg为存储单元个体,直接追踪pg状态,一般pg数量是远远小于object数量的。
3 PG数量计算方法
官方给出的计算公式是这样的:
Total PGs = (Total_number_of_OSD * 100) / max_replication_count
但每个池中pg数量最好接近或等于2的次方
例:
有100个osd,2副本,5个pool
Total PGs =100*100/2=5000
每个pool 的PG=5000/5=1000,那么创建pool的时候就指定pg为1024
ceph osd pool create pool_name 1024
下面给出我在程序中写的pg计算函数(仅供参考):
def pg_calc(osd_count, pool_count, rep_size):
osd_count = int(osd_count)
pool_count = int(pool_count)
rep_size = int(rep_size)
pg_num = 512
if rep_size == 2:
if osd_count > 0 and osd_count < 5:
pg_num = 128
elif osd_count >= 5 and osd_count <= 10:
pg_num = 512
else:
pg_num = int((osd_count * 100) / (rep_size))
else:
pg_num = int((osd_count * 100) / (rep_size))
per_pool_pg = pg_num / pool_count
for i in range(0, 21):
tmp = 2 ** i
if tmp >= per_pool_pg:
pg_num = tmp
break return pg_num
4 PG的状态有哪些
从第2点我们知道由于pg的引进,我们只要追踪pg的状态即可,因此pg在集群中是存在多种状态的,pg的状态也决定着当前集群数据的健康状态。
(1)Active:当前拥有最新状态数据的pg正在工作中,能正常处理来自客户端的读写请求。
(2)inactive:正在等待具有最新数据的OSD出现,即当前具有最新数据的pg不在工作中,不能正常处理来自客户端的读写请求。
(3)Clean:PG所包含的object达到指定的副本数量,即object副本数量正常。
(4)Unclean:PG所包含的object没有达到指定的副本数量,比如一个PG没在工作,另一个PG在工作,object没有复制到另外一个PG中。
(5)Peering:PG所在的OSD对PG中的对象的状态达成一个共识(维持对象一致性)。
(6)Degraded:主osd没有收到副osd的写完成应答,比如某个osd处于down状态。
(7)Stale:主osd未在规定时间内向mon报告其pg状态,或者其它osd向mon报告该主osd无法通信。
(8)Inconsistent:PG中存在某些对象的各个副本的数据不一致,原因可能是数据被修改。
(9)Repair:pg在scrub过程中发现某些对象不一致,尝试自动修复。
(10)Undersized:pg的副本数少于pg所在池所指定的副本数量,一般是由于osd down的缘故。
(11)Scrubbing(deep + Scrubbing):pg对对象的一致性进行扫描。
(12)Recovering:pg间peering完成后,对pg中不一致的对象执行同步或修复,一般是osd down了或新加入了osd。
(13)Backfilling:一般是当新的osd加入或移除掉了某个osd后,pg进行迁移或进行全量同步。
(14)down:包含必备数据的副本挂了,pg此时处理离线状态,不能正常处理来自客户端的读写请求。
5 PG修复
5.1 通常查看集群是否正常都是通过ceph -s命令查看,如果显示是HEALTH_OK则表示集群是健康的,一切运行正常,比如:
[root@ctl0 ~]# ceph -s
cluster ce0d75a9-9d6a-4b8e-ab4c-c3645f69506a
health HEALTH_OK
monmap e3: mons at {ctl0=10.16.30.16:/,ctl1=10.16.30.14:/,ctl2=10.16.30.15:/}
election epoch , quorum ,, ctl1,ctl2,ctl0
osdmap e39: osds: up, in
pgmap v58: pgs, pools, bytes data, objects
MB used, MB / MB avail
active+clean
但有时也会遇见ceph -s显示的是HEALTH_WARN,如下所示:
[root@ctl0 ~]# ceph -s
cluster ce0d75a9-9d6a-4b8e-ab4c-c3645f69506a
health HEALTH_WARN
pgs degraded
pgs stuck unclean
pgs undersized
/ in osds are down
monmap e3: mons at {ctl0=10.16.30.16:/,ctl1=10.16.30.14:/,ctl2=10.16.30.15:/}
election epoch , quorum ,, ctl1,ctl2,ctl0
osdmap e41: osds: up, in
pgmap v64: pgs, pools, bytes data, objects
MB used, MB / MB avail
active+undersized+degraded
active+clean
可以看到很多pg的状态是不健康的了,但从中其实也可以发现有一个osd挂了,其实只要把该osd重新拉起来就好了,拉起来后集群会自动重新恢复健康状态。但是也有可能出现这个osd再也起不来了,比如硬盘损坏了,这时多副本就发挥作用了,因为还有其它副本在其它osd上,这时我们可以通过均衡数据的方法来将集群恢复并将该osd踢出集群。
这里我们以osd.2为例子。
均衡数据恢复步骤:
# 先将该osd reweight 到0,也就是将权重降低到0,让数据副本分散到其它osd上
ceph osd reweight 0.0
# 待集群重新恢复为ok后执行以下命令将osd踢出集群
service ceph stop osd.
ceph osd out
ceph osd crush remove osd.
ceph auth del osd.
ceph osd rm osd.
5.2 有时可能碰上osd拉起后还是有些pg不健康的,比如:
(1)Unfound objects
ceph集群知道该对象存在,但无法定位该object在哪时会报这个错误。
解决办法:
<1>尝试让失败的osd起来,如果起来后集群恢复正常,则结束
<2>尝试将该pg的unfound对象回滚到上一个版本,ceph pg $pgid mark_unfound_lost revert,如果恢复正常,则结束
<3>如果还是不行,那只有将该object删除掉了,注意这会导致丢失数据,ceph pg $pgid mark_unfound_lost delete
(2)inconsistent objects
pg中保存的object中有些副本数据不一致,有些事伴随着scrub errors错误
<1>ceph health detail 找出问题pg
<2>尝试ceph pg repair $pgid,若成功,则结束(这个执行修复后一般要等久点,实在不能自动repair,再用以下方式)
<3>通过ceph pg map $pgid,找出主osd,打开其日志查看是哪个object不一致
<4>找出所有该objects所有副本存放的位置,用摘要算法(md5sum,sha256)等计算出其hash值,如果是3副本,删除与其他副本不一致的;如果是2副本,则可能会误删。
<5> 再次执行 ceph pg repair $pgid
(3)stale pg
pg出现stale状态,也就是pg处于僵死状态,该状态是无法处理新的请求了的,新的请求过来只会block,这种情况一般是由于所有副本pg的osd都挂了,要模拟其实也很简单,比如设置2副本,然后将2个不同故障域的osd挂掉即可出现,最好的恢复方法当然是重新拉起这两个osd,但有时可能出现这样的情况,两个osd永远也拉不起来了,然后你把这两个osd清理出去了,清理完后这些pg当然就是stale的状态,这时的恢复方法只能是丢掉这个pg里的数据了,重新创建pg:
<1>使用命令ceph pg dump |grep stale 找出所有的stale的pg,也可以ceph health detail |grep stale
<2>执行ceph pg force_create_pg $pg_id命令强制重新创建pg,这时可以看到pg会转为creating状态
<3>重启ceph集群中的所有OSD
Ceph PG介绍及故障状态和修复的更多相关文章
- ceph PG数量调整/PG的状态说明
优化: PG Number PG和PGP数量一定要根据OSD的数量进行调整,计算公式如下,但是最后算出的结果一定要接近或者等于一个2的指数.调整PGP不会引起PG内的对象的分裂,但是会引起PG的分布的 ...
- 记一次ceph pg unfound处理过程
今天检查ceph集群,发现有pg丢失,于是就有了本文~~~ 1.查看集群状态 [root@k8snode001 ~]# ceph health detail HEALTH_ERR 1/973013 o ...
- 利用火焰图分析ceph pg分布
前言 性能优化大神Brendan Gregg发明了火焰图来定位性能问题,通过图表就可以发现问题出在哪里,通过svg矢量图来查看性能卡在哪个点,哪个操作占用的资源最多 在查看了原始数据后,这个分析的原理 ...
- [ ceph ] 基本介绍及硬件配置
1. Ceph简介 所有的 Ceph 存储集群的部署都始于一个个 Ceph节点.网络和 Ceph存储集群.Ceph 存储集群至少需要一个 Ceph Monitor.一个 Manager和一个Ceph ...
- [转] 关于 Ceph PG
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- ceph卡在active+remapped状态
最近看到了有人的环境出现了出现了卡在active+remapped状态,并且卡住不动的状态,从pg的状态去看,这个pg值分配了主的pg,没有分配到副本的osd,集群的其他设置一切正常 这个从网上搜寻到 ...
- REST构架风格介绍之一:状态表述转移
转载自:Todd Wei http://www.cnblogs.com/weidagang2046/archive/2009/05/08/1452322.html REST(Representat ...
- Ceph pg分裂流程及可行性分析
转自:https://www.ustack.com/blog/ceph-pg-fenlie/ 1 pg分裂 Ceph作为一个scalable的分布式系统,集群规模会逐渐增大,为了保证数据分布的均匀性, ...
- useState 的介绍和多状态声明(二)
useState的介绍 useState是react自带的一个hook函数,它的作用是用来声明状态变量. 那我们从三个方面来看useState的用法,分别是声明.读取.使用(修改).这三个方面掌握了, ...
随机推荐
- Ionic3 UI组件之 Gallery Modal
Gallery Modal可以理解为相册的预览界面.可以显示网络图片,也可以显示base64Image. 在这个例子中,我用来实现图片的预览功能. 相机拍照,或者相册选择图片后,用缩略图组件显示缩略图 ...
- Mysql汉字乱码的解决
在安装Mysql时其实可能选择使用GBK来处理汉字,由于以前没使用,所以就按默认的英语处理.不过,也可以C:\Program Files\MySQL\MySQL Server 6.8安装路径下的my文 ...
- iOS系统库头文件中NS_AVAILABLE相关
转载: NS_AVAILABLE_IOS(5_0) 这个方法可以在iOS5.0及以后的版本中使用,如果在比5.0更老的版本中调用这个方法,就会引起崩溃. NS_DEPRECATED_IOS(2_0, ...
- 悟空模式-java设计模式
目前已定义的java设计模式细分下来有二十余种,这篇博客主要是想从大家所熟知的孙悟空入手,阐述各个设计模式的概念和优缺点,以及他们之间的联系. 在下面介绍的每个设计模式里,都会有与西游记相关的具体案例 ...
- Spring学习手札(三)理解IoC 拯救不开心
Inverse of Control,翻译成“控制反转”,是Spring的核心.IoC不是一种技术,而是一种设计思想.就是将原本在程序中手动创建对象的控制权(new Object() ),交由Spri ...
- Dubbo安装及其实战1
一.Dubbo安装 (1)安装zk和tomcat yum 安装tomcat 默认路径为 /usr/share/tomcat zookeeper 我这里采用的是使用zookeeper管理的.所以要安装z ...
- 【HTML&CSS】搜狐页面代码编写
<!DOCTYPE html> <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"& ...
- 超级简单的jquery轮播图demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- RNN & LSTM & GRU 的原理与区别
RNN 循环神经网络,是非线性动态系统,将序列映射到序列,主要参数有五个:[Whv,Whh,Woh,bh,bo,h0][Whv,Whh,Woh,bh,bo,h0],典型的结构图如下: 和普通神经网 ...
- Storm监控文件夹变化 统计文件单词数量
监控指定文件夹,读取文件(新文件动态读取)里的内容,统计单词的数量. FileSpout.java,监控文件夹,读取新文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...