关于mon的数据的问题,一般正常情况下都是配置的3个mon的,但是还是有人会担心 Mon 万一三个同时都挂掉了怎么办,那么集群所有的数据是不是都丢了,关于后台真实数据恢复,有去后台取对象,然后一个个拼接起来的方案,这个是确定可以成功的,但是这个方法对于生产的集群耗时巨大,并且需要导出数据,然后又配置新的集群,工程比较耗大,考虑到这个问题,Ceph 的中国(Redhat)的一位开发者 tchaikov 就写了一个新的工具,来对损坏的MON的数据进行原集群的重构,这个比起其他方案要好很多,本篇将讲述怎么使用这个工具,代码已经合并到 Ceph 的master分支当中去了

关于这个工具相关的issue

打包一个合进新代码的master版本的ceph包

从github上面获取代码

默认的分支就是master的直接去clone就可以了

[root@lab8106 ~]# git clone https://github.com/ceph/ceph.git

检查是否是master分支

[root@lab8106 ~]# cd ceph
[root@lab8106 ceph]# git branch
* master

检查代码是否是合进需要的代码了

[root@lab8106 ~]# cat ceph/doc/rados/troubleshooting/troubleshooting-mon.rst |grep rebuild
# rebuild the monitor store from the collected map, if the cluster does not
# i.e. use "ceph-monstore-tool /tmp/mon-store rebuild" instead
ceph-monstore-tool /tmp/mon-store rebuild -- --keyring /path/to/admin.keyring
#. then rebuild the store

因为这个代码是最近才合进去的 ,所以一定要检查代码的正确性

创建一个源码包

进入到代码的根目录,修改make-dist文件里面的一个地方(第46行),否则打出来的包可能没有版本号,因为打包的时候检查了有没有git目录

修改下面

#tar cvf $outfile.version.tar $outfile/src/.git_version $outfile/src/ceph_ver.h $outfile/ceph.spec
tar cvf $outfile.version.tar $outfile/src/.git_version $outfile/src/ceph_ver.h $outfile/ceph.spec $outfile/.git

如果不改,就可能出现

[root@lab8106 ceph]# ceph -v
ceph version HEAD-HASH-NOTFOUND (GITDIR-NOTFOUND)

创建源码包

[root@lab8106 ceph]#cd ceph
[root@lab8106 ceph]#./make-dist
[root@lab8106 ceph]# cp ceph-11.0.0-2460-g22053d0.tar.bz2 /root/rpmbuild/SOURCES/
[root@lab8106 ceph]# cp -f ceph.spec /root/rpmbuild/SPECS/
[root@lab8106 ceph]# rpmbuild -bb /root/rpmbuild/SPECS/ceph.spec

执行完了以后就去这个路径取包

[root@lab8106 ceph]# ll /root/rpmbuild/RPMS/x86_64/
total 1643964
-rw-r--r-- 1 root root 1972 Sep 20 10:32 ceph-11.0.0-2460.g22053d0.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root 42259096 Sep 20 10:32 ceph-base-11.0.0-2460.g22053d0.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root 320843080 Sep 20 10:35 ceph-common-11.0.0-2460.g22053d0.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root 58138088 Sep 20 10:36 ceph-mds-11.0.0-2460.g22053d0.el7.centos.x86_64.rpm
···

准备测试环境

使用打好的包进行集群的配置,创建一个正常的集群,这里就不讲述怎么配置集群了

模拟mon损坏

[root@lab8106 ceph]# systemctl stop ceph-mon@lab8106
[root@lab8106 ceph]# mv /var/lib/ceph/mon/ceph-lab8106/ /var/lib/ceph/mon/ceph-lab8106bk

按上面的操作以后,mon的数据相当于全部丢失了,本测试环境是单mon的,多mon原理一样

重构数据

创建一个临时目录,停止掉所有的osd,这个地方因为mon已经完全挂掉了,所以停止所有osd也没什么大的影响了

[root@lab8106 ceph]# mkdir /tmp/mon-store
[root@lab8106 ceph]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0/ --op update-mon-db --mon-store-path /tmp/mon-store/
[root@lab8106 ceph]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-1/ --op update-mon-db --mon-store-path /tmp/mon-store/

注意如果有多台OSD机器,那么在一台台的OSD主机进行上面的操作,这个目录的数据要保持递增的,也就是一直对着这个目录弄,假如换了一台机器那么先把这个数据传递到另外一台机器

root@lab8106 ~]# rsync -avz /tmp/mon-store 192.168.8.107:/tmp/mon-store
sending incremental file list
created directory /tmp/mon-store
mon-store/
mon-store/kv_backend
mon-store/store.db/
mon-store/store.db/000005.sst
mon-store/store.db/000008.sst
mon-store/store.db/000009.log
mon-store/store.db/CURRENT
mon-store/store.db/LOCK
mon-store/store.db/MANIFEST-000007 sent 11490 bytes received 153 bytes 7762.00 bytes/sec
total size is 74900 speedup is 6.43

等192.168.8.106的机器全部做完了,然后这个/tmp/mon-store传递到了192.168.8.107的机器上,然后再开始做192.168.8.107这台机器的,等全部做外了,把这个/tmp/mon-store弄到需要恢复mon的机器上

根据获得的数据进行重构

[root@lab8106 ~]# mkdir /var/lib/ceph/mon/ceph-lab8106
[root@lab8106 ~]# ceph-monstore-tool /tmp/mon-store rebuild
[root@lab8106 ~]# cp -ra /tmp/mon-store/* /var/lib/ceph/mon/ceph-lab8106
[root@lab8106 ~]# touch /var/lib/ceph/mon/ceph-lab8106/done
[root@lab8106 ~]# touch /var/lib/ceph/mon/ceph-lab8106/systemd
[root@lab8106 ~]# chown ceph:ceph -R /var/lib/ceph/mon/

启动mon

[root@lab8106 ~]# systemctl restart ceph-mon@lab8106

检查状态

[root@lab8106 ~]# ceph -s

可以看到可以好了,在实践过程中,发现如果对修复的数据,马上进行破坏,再次进行修复的时候,就无法恢复了,应该是个bug,已经提交给作者 Issue:11226

无法恢复的数据

  • pg settings: the full ratio and nearfull ratio 设置会丢失,这个无关紧要,再设置一次就可以了

MDS Maps: the MDS maps are lost.

总结

因为工具才出来,可能难免有些bug,这个是为未来提供一种恢复数据的方式,使得 Ceph 变得更加的健壮

附加知识

如果指定ceph版本进行编译

git clone https://github.com/ceph/ceph.git
git checkout -b myceph v10.2.3
git submodule update --init --recursive

v10.2.3为发行版本的tag,也就是release的版本号码,这个操作是切换到指定的tag,并且下载依赖的一些模块

变更记录

Why Who When
创建 武汉-运维-磨渣 2016-09-20
增加git版本选择 武汉-运维-磨渣 2016-10-12

Ceph的Mon数据重新构建工具的更多相关文章

  1. Google软件构建工具Bazel FAQ

    Google软件构建工具Bazel FAQ 本文是我的翻译,原文在这里.欢迎转载,转载请注名本文作者和原始链接 注:如果想了解Bazel的原理,可以看看我之前翻译的Google Blaze原理及使用方 ...

  2. 前端项目构建工具---Grunt

    什么是Grunt? grunt是javascript项目构建工具,在grunt流行之前,前端项目的构建打包大多数使用ant.(ant具体使用 可以google),但ant对于前端而言,存在不友好,执行 ...

  3. grunt配置太复杂?发布一个前端构建工具,简单高效,自动跳过未更新的文件

    做前端项目,如果没有一个自动化构建工具,手动处理那简直就是坑爹O(∩_∩)O.于是上网了解了下,grunt用的人不少,功能也挺强大.看了一下grunt的配置(包括gulp),感觉稍显复杂.当时项目结构 ...

  4. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  5. Gulp.js----比Grunt更易用的前端构建工具

    Gulp.js----比Grunt更易用的前端构建工具 Grunt一直是前端构建工具,然而他也不是毫无缺陷的,gulp的作者 Eric Schoffstall 在他介绍 gulp.js 的 prese ...

  6. 基于流的自动化构建工具------gulp (简单配置)

    项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...

  7. Gulp, 比Grunt更好用的前端构建工具

    Gulp, 比Grunt更好用的前端构建工具 本文主要从两个方面介绍Gulp:一,Gulp相对于Grunt的优势: 二,Gulp的安装和使用流程 Gulp相对于Grunt的优势 gulp.js 的作者 ...

  8. 前端构建工具gulpjs

    gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...

  9. Gulp vs Grunt 前端构建工具对比

    Gulp vs Grunt 前端工程的构建工具对比 1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Jav ...

随机推荐

  1. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.4)- 串行NOR Flash下载算法(Keil MDK工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Keil MDK工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash ...

  2. centos8平台redis5日志按天分割

    一,创建日志的备份目录 [root@yjweb crontab]# mkdir /data/logs/redislogsbackup 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...

  3. centos8安装php7.4

    一,下载php7.4 1,官方网站: https://www.php.net/ 2,下载 [root@yjweb source]# wget https://www.php.net/distribut ...

  4. 说明资源路径位置类型无法解析The type javax.servlet.http.HttpServletResponse cannot be resolved.

    导入dispatch项目后报错: 解决办法:在项目上单击鼠标右键>  Add Libraries  选择 Server Runtime,下一步  选中Apache Tomcat7 完成  切换标 ...

  5. Python初识和变量基础

    Python是面向对象,动态解释型和强类型的语言 编译型: 将代码一次性全部编译成二进制,然后再执行 优点:执行效率高. 缺点:开发效率低. 代表语言:C 解释型: 逐行解释成二进制,逐行运行 优点: ...

  6. B站弹幕爬取

    B站弹幕爬取 单个视频弹幕的爬取 ​ B站弹幕都是以xml文件的形式存在的,而xml文件的请求地址是如下形式: http://comment.bilibili.com/233182992.xml ​ ...

  7. RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)

    SmoothBursty 主要思想 记录 1秒内的微秒数/permitsPerSencond = 时间间隔interval,每一个interval可获得一个令牌 根据允许使用多少秒内的令牌参数,计算出 ...

  8. mysql-connector-java各种版本下载地址

    mysql-connector-java下载地址: http://mvnrepository.com/artifact/mysql/mysql-connector-java 目录 1.进去后选择自己的 ...

  9. U138097 小鱼吃大鱼 埃氏筛

    题目描述 小P同学在养殖一种非常凶狠的鱼,而且与其他鱼类不同,这种鱼越大越温顺,反而小鱼最凶残.当两条鱼相遇时, 小鱼会不断撕咬大鱼,每一口都咬下与它自身等重的肉(小鱼保持体重不变),直到大鱼的体重小 ...

  10. NB-IoT的eDRX模式主要目的是什么

    传统的2.56秒寻呼间隔对UE的电量消耗较大,NB-IoT的eDRX模式主要目的就是支能够持更长周期的寻呼监听,从而达到省电的目的.而在下行数据发送频率小时,通过核心网和用户终端的协商配合,用户终端调 ...