pglog出错导致osd启动失败的解决办法

背景

由于异常断电导致三个副本所在的故障域,都各有两个osd处于down的状态,情况非常危机,需要现场去修复,防止数据丢失。
ceph 版本:0.94.10


pgdown.png

image.png

上述是由于三个domain里面各有两个osd处于down的状态。

原因:

  In certain cases, the ceph-osd Peering process can run into problems, preventing a PG from becoming active and usable.

这是因为peering block啦
当然peering过程是一个非常复杂的过程,后面的需要的话一定要整理一番。
注:
除了在上述故障域的pg,其他pg在数据恢复的过程中都从down的状态,变到正常的状态。我们需要关心2.9a4,2.eac这两个pg的问题。(其实这两个pg在断电之后是处于stale状态,后面我们那边运维人员意外拉起了一个osd后就处于pg down情况)。
事实上我们要解决的问题是pg stale问题,所以我们要拉起相关的osd。

解决方案

找到osd

命令:
ceph-objectstore-tool --data-path xxx --journal-path xxx --op list-ops
ceph tell <pgid> query
ceph pg <pgid> query

我们这边是514osd的问题。

查看514启动失败日志:

    -3> 2019-07-09 22:13:40.493486 7f97a6d81880 20 read_log coll 2.9a4_head log_oid 2/9a4//head
    -2> 2019-07-09 22:13:40.493565 7f97a6d81880 20 read_log 231404'10412575 (231404'10412574) modify   2/2d7009a4/rbd_data.d0dbe05a5f008d.0000000000004532/head by client.156138418.0:1761183652 2019-07-04 03:44:14.804189
    -1> 2019-07-09 22:13:40.493582 7f97a6d81880 20 read_log 233319'10412574 (100460'2793103) modify   2/c03f99a4/rbd_data.c2639d7eb9c025.000000000000a802/head by client.232205693.0:3303 2019-07-05 07:43:03.907875
     0> 2019-07-09 22:13:40.495397 7f97a6d81880 -1 osd/PGLog.cc: In function 'static void PGLog::read_log(ObjectStore*, coll_t, coll_t, ghobject_t, const pg_info_t&, std::map<eversion_t, hobject_t>&, PGLog::IndexedLog&, pg_missing_t&, std::ostringstream&, std::set<std::basic_string<char> >*)' thread 7f97a6d81880 time 2019-07-09 22:13:40.493592
osd/PGLog.cc: 911: FAILED assert(last_e.version.version < e.version.version)

 ceph version 0.94.10.1 (c5ce8260cade179b7dd358a340351c4029e239c1)
 1: (ceph::__ceph_assert_fail(char const*, char const*, int, char const*)+0x85) [0xbdf665]
 2: (PGLog::read_log(ObjectStore*, coll_t, coll_t, ghobject_t, pg_info_t const&, std::map<eversion_t, hobject_t, std::less<eversion_t>, std::allocator<std::pair<eversion_t const, hobject_t> > >&, PGLog::IndexedLog&, pg_missing_t&, std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >&, std::set<std::string, std::less<std::string>, std::allocator<std::string> >*)+0x1a38) [0x7751e8]
 3: (PG::read_state(ObjectStore*, ceph::buffer::list&)+0x34f) [0x7f852f]
 4: (OSD::load_pgs()+0xa99) [0x6bd539]
 5: (OSD::init()+0x181a) [0x6c10da]
 6: (main()+0x29dd) [0x64854d]
 7: (__libc_start_main()+0xf5) [0x7f97a411daf5]
 8: /usr/bin/ceph-osd() [0x661f39]
 NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.

在read_log 过程中出现的问题,查看ceph这部分代码


image.png

具体代码在这里出现的断言错误。
分析原因:
osd在异常断电(机械磁盘异常掉电导致一部分pglog出错)中相关pglog未写正确。

解决办法:

删除由于pglog 出错的object

1.使用ceph-kvstore-tool工具。

但由于这个命令没有rm 子命令(L版本才支持),因为工具都是向下兼容的,我们需要移植L版本的这个工具,拷贝ceph-kvstore-tool 到目标机/usr/bin/下,同时拷贝 /usr/lib64/ceph/libceph-common.so /usr/lib64/ceph/libceph-common.so.0到规定目录 。

2.使用ceph-objectstore-tool

2因为删除这个log ,需要具备prefix 和key 。所以我们需要在ceph-objectstore-tool中read log 的逻辑中加上获取相关信息的代码,代码如下:

diff --git a/src/os/DBObjectMap.cc b/src/os/DBObjectMap.cc
index b856849..7946763 100644
--- a/src/os/DBObjectMap.cc
+++ b/src/os/DBObjectMap.cc
@@ -250,12 +250,14 @@ int DBObjectMap::DBObjectMapIteratorImpl::init()
 }

 ObjectMap::ObjectMapIterator DBObjectMap::get_iterator(
-  const ghobject_t &oid)
+  const ghobject_t &oid, std::ostream *out)
 {
   MapHeaderLock hl(this, oid);
   Header header = lookup_map_header(hl, oid);
   if (!header)
     return ObjectMapIterator(new EmptyIteratorImpl());
+  if (out)
+    *out << "header seq: " << header_key(header->seq) << std::endl;
   DBObjectMapIterator iter = _get_iterator(header);
   iter->hlock.swap(hl);
   return iter;
diff --git a/src/os/DBObjectMap.h b/src/os/DBObjectMap.h
index de80d6f..7ec43b0 100644
--- a/src/os/DBObjectMap.h
+++ b/src/os/DBObjectMap.h
@@ -219,7 +219,7 @@ public:
   int list_objects(vector<ghobject_t> *objs ///< [out] objects
     );

-  ObjectMapIterator get_iterator(const ghobject_t &oid);
+  ObjectMapIterator get_iterator(const ghobject_t &oid, std::ostream *out = NULL);

   static const string USER_PREFIX;
   static const string XATTR_PREFIX;
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index e0afbd0..bce7d6d 100644
--- a/src/os/FileStore.cc
+++ b/src/os/FileStore.cc
@@ -4747,7 +4747,10 @@ ObjectMap::ObjectMapIterator FileStore::get_omap_iterator(coll_t c,
     if (r < 0)
       return ObjectMap::ObjectMapIterator();
   }
-  return object_map->get_iterator(hoid);
+  ostringstream oss;
+  ObjectMap::ObjectMapIterator oiter = object_map->get_iterator(hoid, &oss);
+  dout(0) << "nyao: " << " " << oss.str() << dendl;
+  return oiter;
 }

 int FileStore::_collection_hint_expected_num_objs(coll_t c, uint32_t pg_num,
diff --git a/src/os/ObjectMap.h b/src/os/ObjectMap.h
index 86f9e3e..27de1ad 100644
--- a/src/os/ObjectMap.h
+++ b/src/os/ObjectMap.h
@@ -150,7 +150,7 @@ public:
     virtual ~ObjectMapIteratorImpl() {}
   };
   typedef ceph::shared_ptr<ObjectMapIteratorImpl> ObjectMapIterator;
-  virtual ObjectMapIterator get_iterator(const ghobject_t &oid) {
+  virtual ObjectMapIterator get_iterator(const ghobject_t &oid, std::ostream *oss = NULL) {
     return ObjectMapIterator();
   }

diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc
index a34903f..11fd555 100644
--- a/src/osd/PGLog.cc
+++ b/src/osd/PGLog.cc
@@ -19,7 +19,8 @@
 #include "PG.h"
 #include "SnapMapper.h"
 #include "../include/unordered_map.h"
-
+//#include "os/DBObjectMap.h"
+//#include "os/KeyValueDB.h"
 #define dout_subsys ceph_subsys_osd

 static coll_t META_COLL("meta");
@@ -906,8 +907,10 @@ void PGLog::read_log(ObjectStore *store, coll_t pg_coll,
        pg_log_entry_t e;
        e.decode_with_checksum(bp);
        dout(20) << "read_log " << e << dendl;
-        oss<<e.get_key_name();
-        oss<<" ";
+       dout(20) << e.get_key_name() << dendl;
+        
+        //DBObjectMap* dbobjectmap= new DBObjectMap(new KeyValueDB());
+         
         //oss<<"hello_world ";
        if (!log.log.empty()) {
          pg_log_entry_t last_e(log.log.back());

通过此等方法确认了prefix 和key ,把编译完的程序导入目标机上,当然这个工具静态链接一些东西,需要把一些静态库导进去。

3.删除信息

image.png

当然提前用get命令把相关的key给拿出来,以防删错。
此时启动514osd,osd正常启动。

4.query 相关pg

image.png

照提示进行lost 相关osd
ceph osd lost <osd id> --yes-i-really-mean-it
重启osd.514 ,集群恢复正常。

复盘相关pg状态

pg stale:

stale - The placement group status has not been updated by a ceph-osd, indicating that all nodes storing this placement group may be down.
准备一个三个节点的简单ceph环境
步骤1:建rbd pool 向里面fio写些数据。
步骤2:down掉相关osd使用ceph-objectstore-tool 工具删除掉其中一个pg,三个osd都要进行操作。
步骤3:ceph pg deep-scrub <pgid>

pg down:

1、准备一个三节点的简单ceph 环境。
步骤1:down掉一个节点,
步骤2:向集群fio写数据
步骤3:down掉剩余两个节点
步骤4:拉起首次down的那个节点
2、时钟不同步也会导致pg down
步骤1:准备osd tree 为下图这样的环境


image.png

步骤2:设置noout状态 ceph osd set noout
步骤3:down 掉osd.0 osd.2 osd.3
步骤4:设置n2 host的主机时钟为 14年 date -s 2014-14-12
步骤5.启动osd 0 osd.2
结果:


image.png

如果最后osd.3启动后,集群可恢复,说明只要两个副本时间是正确的,既可以将pg达成一致
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容