Ceph问题解决操作和维护记录

1.如何导出和导入osdmap

1.1首先停止坏的osd和好的osd(因为执行ceph-objectstore-tool时需要停止osd),然后执行导出和导入。

命令示例:84是好的osd,85是坏的OSD。

ceph-objectstore-tool-op get-OSD map-epoch 145039-data-path/data 1/ceph-OSD/-journal-path/var/log/ceph/ceph-84/journal-type file store-file OSD map 145039

ceph-objectstore-tool-op set-OSD map-epoch 145039-data-path/data 2/ceph-OSD/-journal-path/var/log/ceph/ceph-85/journal-type file store-file OSD map 145039

PS:其中145039是对应的版本号,data-path和journal-path填写各自对应osd的路径。

2.找到正确的纪元版本。

这应该通过报告错误的osd日志来查看。启动时,osd将加载一个正在执行的纪元版本A,缺失的纪元版本在它之前。然后在最近事件的转储中找到已经执行的epoch版本B和ecoch版本C。导入max(B,C)到A之间的所有版本(也可以导入一个版本开始观察,太麻烦)。在我的日志里,A = 145068,B = 145011,C=145012,所以我把145013放到1438。我的日志如下所示。

1,原因:

如果osdmap的两个osd版本相差太大(可能相差50左右),会导致两个osd通信上报给错误的节点。如果偶尔出现错误节点,问题不大,因为一个osd操作卡住了,然后恢复最新版本的osdmap。如果osd日志一直报,说明osd同步osdmap有问题,会导致osd宕机,心跳超时(有可能),甚至osd吃掉大量内存,导致服务器挂机。日志如下所示:

2.查看osd的OSD地图版本。

按命令查看:ceph守护进程osd.xx状态?-对应于——xx标记的osd编号

命令结果示例:

{

" cluster _ fsid ":" df 181181-2154-4816-a2b 7-D6 EAE 79980 FB ",

" OSD _ fsid ":" D5 edac 3-CEE 7-45e b-90df-e 381d 8684 DFB ",

“whoami”:15,

“状态”:“活动”,

“最旧_地图”:92570,

"最新_地图":158146,

" num_pgs": 2105

}

其中latest _ map表示osd的最新版本号。

3.检查集群的osdmap版本号。

命令:ceph -s

这里:最新版本号在178170。

4.确定osd版本是否有问题。

每隔一段时间执行几次命令ceph daemon osd.xx status,以检查osd版本号。正确的状态如下:

4.1.查询到的版本号始终与集群版本号一致。

4.2.它小于集群版本号,但它会不断增加,最终会达到集群版本号。

5.osd出现时不更新OSD地图的解决方案。

到目前为止,我还没有找到osd不更新osdmap的根本原因。我用过ceph daemon osd.xx?Dump_blocked_ops检查是否有阻塞的操作,解决阻塞,但是还是不行,即使返回no blocking,还是不更新。更新osd的可能方法:

1,把对应的osd出簇(osd或up),过一段时间观察版本号(我就是这么回答的)。

2.重启osd

1,问题日志

2.解决方案:

1.检查服务器时间是否一致。

2.检查集群中的密匙环与本地osd中的密匙环是否一致:

使用命令:?

ceph?auth?List从mon获取所有osd密匙环,

cat/var/lib/ceph/osd/ceph-xx/key ring来获取本地OSD的密匙环。

3.删除验证,重新启动所有mon和osd,并修改ceph.conf中的以下参数,如下所示

授权群集必需=无

授权服务要求=无

授权客户端要求=无

1,问题日志

2.解决方法

1,检查服务器时间和服务器网络(我的不是问题)

2.一般心跳超时是由其他问题引起的。这里可以先增加心跳超时(我已经增加了心跳超时,解决其他问题后就没有心跳超时了)修改合作文件ceph.conf的参数

mon _ OSD _ report _ time out = 1800

文件存储操作线程自杀超时= 1800

文件存储操作线程超时= 600

osd_heartbeat_grace = 600

osd _ op _ thread _自杀_超时=1800

osd_op_thread_timeout=36000

这个配置可以先放在【全局】里,等问题解决后再移除,也可以根据实际情况自己调整参数。

1.检查日志以查看osd卡的位置。

日志调整级别:修改配置文件的ceph.conf参数,增加debug_osd=10(15/20)。该值越高,打印的数量越多。如果osd已经启动,并且您想要更改日志级别,您可以使用命令:ceph tell OSD。xx注入args-debug-osd5。

2.根据日志信息解决问题。

我卡在load_pgs上了,因为整个集群状态不对,pg很多,所以加载很慢。这时候就需要考虑服务器压力了,可以一个一个慢慢启动,不要一下子全部启动。

1,问题的原因

不完整状态表示无法选择权威日志或者通过choos_acting选择的动作不足以完成数据恢复(例如对于纠删码,存活副本数小于k),导致peer无法正常完成。也就是说,pg元数据丢失,pg状态无法恢复。

2.解决问题

1.使用ceph-objectstore-tool工具来标记不完整的pg。

2、操作步骤:

操作前提:设置集群标志:noout nodown noup noin?PS:这里的目的是防止pg的分布发生变化。因为osd打开了,所以我只设置了noout nodown。

第一步:传递命令ceph pg dump _ stuck | grep complete >;Inincomplete.txt从集群中导出所有处于完成状态的pg。

第二步:通过第一步,我知道pg的两个osd在哪里,并阻止这两个osd。

第三步:用命令在两个osd上标记pg,命令如下

ceph-objectstore-tool-data-path/data 4/ceph-OSD/-journal-path/var/log/ceph/ceph-15/journal-type file store-pgid 9 . ea8-op mark-complete

ceph-objectstore-tool-data-path/data 8/ceph-OSD/-journal-path/var/log/ceph/ceph-91/journal-type file store-pgid 9 . ea8-op mark-complete

第四步:启动这两个osd(启动顺序无关)。

第五步:观察集群中是否有不完整的。

第六步:重复第二次及后续操作,直到不完整为止。

3.特殊说明

3.1,标记完成的过程可能会导致降级和错位簇的增加,这是正常的。

3.2.原因:因为我在阅卷的过程中错过了导入导出pg的步骤。我这里没有操作导入导出是因为pg数量有点多,导入导出会让两个osd停太久,我觉得还是让集群自己恢复比较好。

3.3.导入和导出pg命令:

ceph-objectstore-tool-data-path/data 3/ceph-OSD/-journal-path/var/log/ceph/ceph-2/journal-type file store-pgid 4.15 D5-op export-file/data 10/55/pg 4.15 D5

ceph-objectstore-tool-data-path/data 8/ceph-OSD/-journal-path/var/log/ceph/ceph-5/journal-type file store-pgid?4.15d5 - op导入-文件/数据10/55/pg4.15d5

选择一个osd作为主要OSD,另一个作为次要OSD,并将其中一个导入另一个pg。导入和导出时需要停止osd。以上是将4.15d5从osd.2导入OSD.5。

1.如果能重启pg对应的osd就最好了,问题自然就解决了。

2.如果osd对应的数据盘损坏或其他原因无法启动。

步骤1:删除这个osd和命令

ceph osd crush重新称重osd.xx 0

ceph osd out osd.xx

ceph osd碾压移除osd.xx

ceph osd rm osd.xx

ceph auth del osd.xx

?第二步:清理当前osd的硬盘或添加新硬盘。

第三步:用同样的号码启动一个新的osd。

?第四部分:重复上述操作,去掉所有有问题的osd。如果还有down,没关系,等待集群恢复处理(我刚启动了一个新的osd,pg处理了income plete+down。在我标记了Incomplept之后,down就自行消失了)。

1,原因

PG在这种状态下还没有?ceph-osd?更新,表示所有存储这个PG的节点可能是?下来?是的。带有PG副本的OSD可能都会失败。在这种情况下,对象存储的该部分不可用,并且监视器将不会接收到这些pg的状态更新,并且这些pg将被标记为陈旧的。

2.解决办法

第一种:OSD osd down后,可以正常,直接启动即可。

第二种类型:

1.使用命令ceph pg dump |grep stale来查找stale的pg。

2.使用命令ceph pg force _ create _ pg$pg _ id,pg状态将更改为creating。

3.重新启动集群中的所有osd。

3.特殊说明

?我是第二种情况,然后按照上面的步骤。结果,所有osd启动都卡住了。我猜测可能的原因:当时我的force_create_pg的数量是3000,有点多,所以osd卡了很多,启动时间很长,可能几个小时。所以这个操作要谨慎,建议如下。

1,这个陈腐的pg终于处理完了。

2.不要一次有太多的force_create_pg。osd重启时,一次重启成功后,重启另一次。

这个比较简单,直接执行命令:ceph pg repair $pg_id repair。

说明集群中osd有问题,需要解决osd问题。我只是有三个osd问题。我省略了这三个osd,这两个状态很快就消失了。

1.发现的问题:ceph -s或mon进程死亡并看到日志。

2.原因

产生了大量的epoch,导致mon的store.db的数据迅速膨胀这是我的集群出现问题后才出现的。之前集群正常的时候我没有这种现象。不知道集群正常后会不会恢复正常。

3.解决办法

第一种:压缩数据,使用命令?ceph tell mon . ceph 163 compact?Ceph163是我的mon的名字。

第二种:使用ceph-mon?-我?主持人?-压缩启动紧凑。我这里用ceph163做主机,主机名。

注意:不管用哪一个,都要注意一点:压缩的时候硬盘会先膨胀后收缩,要留足空间。第二种方法的优点是可以修改ceph.conf中的参数mon _ data =/data 10/ceph 153使其生效。我后来的mon数据太大了,就更新了数据盘的路径:把对应的mon数据保存到另一个目录就行了。

第三种:集群正常时,尝试修改mon的配置参数(未验证,参数可降)。

mon_min_osdmap_epochs=500

mon_max_pgmap_epochs=500

mon_max_mdsmap_epochs=500

4.请特别注意:

?默认情况下,当mon所在的存储有5%空闲时,mon进程会自杀。

只需将对应的osd节点设置为out (osd进程依然存在),它就会自动移除数据,删除对应数据盘的数据。当数据被删除时,通常关闭并删除osd。

命令:ceph osd out osd.xx

当服务器需要迁移,集群需要关闭时,先设置ceph osd set nodown?ceph osd set noup?ceph osd set noout?ceph osd设置nobackfill?Ceph osd set norecover保持集群不变,然后关闭每个osd、mon和rgw。

ceph osd设置no平衡

-禁止集群pg进行从属平衡。出现问题时,可以设置为故障排除。

ceph osd设置nobackfill

-严禁修复数据回填。出现问题时,我们暂时不想修复数据,可以和nobackfill一起使用。

ceph osd set norecover?

-严禁修复数据恢复。出现问题时,我们暂时不想修复数据,可以和nobackfill一起使用。

ceph osd设置nodown

-当集群中出现问题时,osd会上升和下降一段时间,您可以使用此命令禁用osd下降。

ceph osd set noup?

?-集群出现问题时,osd会一会儿上一会儿下,可以用这个命令禁止OSD上。

ceph osd set noout?

-禁止集群中的osd长时间自动下线并出局?

ceph OSD set no deep-scrub?

-取消使用相应的unset而不做进一步处理,如ceph osd unset noout。

ceph osd out osd.xx?将单个osd的状态设置为out。

osd.xx中的Ceph osd将单个osd的状态设置为in。

ceph osd down osd.xx?将单个osd的状态设置为关闭。

ceph tell osd.xx injectargs?-debug-osd20实时修改osd.xx的日志级别,无需重启osd。

ceph tell?mon.xx injectargs?- debug-mon?20?实时修改mon的日志级别,而无需重新启动mon。

ceph?告诉?osd。*?注射剂?-OSD _恢复_睡眠?1?单位二,最初设置为1,怕服务器有压力,观察后可以去掉设置为0。

ceph?告诉?osd。*?注射剂?- osd_max_backfills?1?调整恢复线程的数量,可根据实际情况进行调整。

ceph?告诉?osd。*?注射剂?- osd_recovery_op_priority?60?调整回收线的高度

ceph守护进程osd.xx状态?检查osd.xx的状态,主要看osdmap版本号。

Ceph pg转储查看所有pg信息。

Ceph pgdump _ stuck stall查看pg状态为stall的数据。

Ceph pg dump_stuck inactive查看pg状态为非活动的数据。

Ceph pgdump _ stuck不清楚的视图数据,pg状态为不干净。

Ceph -s查看集群。

Ceph osd树视图osd状态树

Ceph运行状况详细信息视图集群运行状况详细信息

Ceph pg pg_id查询以查看pg信息。

Ceph osd getmap -o osdmap.bin查看osdmap地图。

ceph-dencoder?类型?OSDMap?进口?osdmap_197?解码?Dump_json将osdmap导出为json格式。