ceph(luminous)-Bluestore集群不可恢复,osd数据未损坏恢复

本文记录了一次Bluestore集群故障的手动模拟,介绍了在osd数据未损坏情况下,如何使用ceph-objectstore-tool工具导出并恢复rbd-image的方法。包括对象导出、新集群创建、对象导入及数据验证等关键步骤。

记录一次手动模拟bluestore集群故障,osd数据未损坏,rbd-image恢复方法。
bluestore由于没有文件系统了,所以不能像filestore那样看到每个osd下的current目录下对应的文件了,并且集群已经不可用,无法通过rados命令拿到pool中的对象,osd全部处于离线状态.

  1. 建立测试集群,创建一个pool,建立rbd池,创建一个image
    我得测试环境是3机器3副本,每个机器上有3个osd.
[root@test-1 home]# ceph osd pool create rbd 64 64
pool 'rbd' created
[root@test-1 home]# rbd create rbd/image01 --size 50G
[root@test-1 home]# rbd ls
image01
[root@test-1 home]# 
  1. 向新建的rbd块儿中写入一些信息.

由于内核版本低,map不出来,只能用librbd向其中写了一些数据,我是在rbd10M的位置写了“abc123”字符串.

[root@test-1 withoutdu]# ./util 

Created a cluster handle: ok.

Connected to the cluster: ok.
 read buf str = abc123 // 利用librbd读出来的数据正是写进去的数据,用来做迁移rbd后的验证.

  1. 停止当前进群全部服务.模拟集群不可用(比如mondb损坏等问题),但是osd数据未损坏.

  2. 利用ceph-objectstore-tool工具导出所有对象.

先列出来要导出的对象.

[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0/ --type bluestore --op list
["2.31",{"oid":"rbd_data.37146b8b4567.0000000000000002","key":"","snapid":-2,"hash":3590010929,"max":0,"pool":2,"namespace":"","max":0}]
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-1/ --type bluestore --op list
["2.1c",{"oid":"rbd_directory","key":"","snapid":-2,"hash":816417820,"max":0,"pool":2,"namespace":"","max":0}]
["2.4",{"oid":"rbd_header.37146b8b4567","key":"","snapid":-2,"hash":2261731972,"max":0,"pool":2,"namespace":"","max":0}]
["2.4",{"oid":"rbd_id.image01","key":"","snapid":-2,"hash":3086248900,"max":0,"pool":2,"namespace":"","max":0}]
["2.2",{"oid":"rbd_object_map.37146b8b4567","key":"","snapid":-2,"hash":3371410498,"max":0,"pool":2,"namespace":"","max":0}]
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-2/ --type bluestore --op list
["2.3a",{"oid":"rbd_info","key":"","snapid":-2,"hash":2886620986,"max":0,"pool":2,"namespace":"","max":0}]

然后分别将全部对象从对应的osd中拿出来,导出到文件中,请确保崩溃前此osd中的数据是一致的,如果不确定的话可以把全部osd中的同名对象都拿出来,比较md5,选择md5相同的对象(3副本的情况)

[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0/ --type bluestore rbd_data.37146b8b4567.0000000000000002 get-bytes /home/rbddir/rbd_data.37146b8b4567.0000000000000002
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-1/ --type bluestore rbd_directory get-bytes /home/rbddir/rbd_directory
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-1/ --type bluestore rbd_header.37146b8b4567 get-bytes /home/rbddir/rbd_header.37146b8b4567
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-1/ --type bluestore rbd_id.image01 get-bytes /home/rbddir/rbd_id.image01
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-1/ --type bluestore rbd_object_map.37146b8b4567 get-bytes /home/rbddir/rbd_object_map.37146b8b4567
[root@test-1 rbddir]# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-2/ --type bluestore rbd_info get-bytes /home/rbddir/rbd_info
[root@test-1 rbddir]# pwd
/home/rbddir
[root@test-1 rbddir]# ls
rbd_data.37146b8b4567.0000000000000002  rbd_directory  rbd_header.37146b8b4567  rbd_id.image01  rbd_info  rbd_object_map.37146b8b4567
[root@test-1 rbddir]#
  1. 导出所有对象后,新建一个规模一样的集群(反正我是建立的规模一样的,应该不用完全一样也是可以的,因为导入的时候是通过rados命令导入的,ceph自己会重新计算crush的),然后建立同名pool,把对象导入.
    我特意新建了一个和刚才pg数不同的pool,然后用rados把对象导入.
[root@aaa-1 rbddir]# ceph osd pool create rbd 128 128
pool 'rbd' created
[root@aaa-1 rbddir]# ls
rbd_data.37146b8b4567.0000000000000002  rbd_directory  rbd_header.37146b8b4567  rbd_id.image01  rbd_info  rbd_object_map.37146b8b4567

这里需要注意的一点是,如果format为1的image,就可以直接导入到pool中;如果是format为2的image,需要再新pool中新建一个同名image,然后把对应的位置全部替换(即把旧image对象中带有rbd_id的地方替换为新的rbd_id,然后再导入新pool中,比如rdb_data.xxxxxx.000000002中间的rbd_id需要替换为新的,object_map也需要替换)

  1. 导入完成后可以看到原来的image了,并且读取指定偏移位置的数据也似乎一样的.
[root@aaa-1 withoutdu]# rbd ls
image01
[root@aaa-1 withoutdu]# ./util 

Created a cluster handle: ok.

Connected to the cluster: ok.
 read buf str = abc123

总结

本次只是做了简单的验证数据是否一致的问题,没有做大规模的验证,可能后续会补上。
至于image-format 为 2 的时候为什么不能直接导入对象来生成image这块我也没太弄清楚,待日后弄清楚了再补上。
目前怀疑是因为format带有的这些feature不是通过rbd对象保存的,而是保存到osd的metadata中了(纯属瞎猜)。
如果发现有什么不对的地方,欢迎指正,共同学习探讨.
<think>嗯,用户想在麒麟V10操作系统上用ceph-deploy部署Ceph集群。首先,我需要确认ceph-deploy的版本是否支持Kylin V10。根据引用[4],用户提到ceph-deploy-1.5.39版本没有mgr的部署选项,可能需要注意版本兼容性。Ceph L版本12.2.12可能需要特定版本的ceph-deploy,可能需要用户检查官方文档或社区支持。 然后,用户的环境准备方面,需要确保所有节点的主机名解析正确,SSH免密登录配置好,以及防火墙和SELinux的设置。引用[3]中提到磁盘必须未使用且没有数据,所以在部署OSD时要注意这一点。另外,引用[2]指出Ceph的核心组件,包括Monitor、Manager、OSD等,部署时需要按照步骤依次安装这些组件。 可能遇到的问题包括网络无法访问Ceph官网,导致依赖包安装失败。这时候可能需要配置本地源或者使用离线安装包。另外,麒麟V10是基于CentOS的,可能需要处理依赖包冲突,比如Python版本的问题。引用[1]提到ceph-deploy的配置文件位置,用户可能需要根据情况调整配置文件。 在部署步骤中,初始化Monitor节点是关键,如果失败需要检查时钟同步和主机名解析。创建OSD时,确保磁盘正确,可能需要使用ceph-deploy osd create命令,如引用[3]中的例子。最后,部署MGR和MDS也是必须的,但引用[4]指出旧版可能支持,所以需要确认ceph-deploy版本是否包含这些功能。 测试集群状态时,ceph -s命令可以查看健康状况,如果出现错误,可能需要检查各个服务的日志。常见问题如网络问题、权限问题或者依赖缺失都需要逐步排查。用户可能需要参考引用中的配置文件和命令示例,确保每一步都正确执行。</think>### 在Kylin V10中使用ceph-deploy部署Ceph集群的步骤 #### 一、环境准备 1. **节点规划** - 至少3个节点(1个`ceph-deploy`管理节点,1个Monitor节点,多个OSD节点) - 示例配置: - 管理节点:`admin-node` - Monitor节点:`ceph-mon1` - OSD节点:`ceph-osd1`, `ceph-osd2` 2. **系统配置** - 所有节点配置主机名解析(`/etc/hosts`或DNS) - 配置SSH免密登录(管理节点到其他节点) - 关闭防火墙和SELinux: ```bash systemctl stop firewalld setenforce 0 ``` 3. **依赖安装** - 在管理节点安装`ceph-deploy`: ```bash yum install -y python3-pip pip3 install ceph-deploy==2.0.1 # 选择兼容Kylin V10的版本[^4] ``` #### 二、部署Ceph集群 1. **初始化集群配置** ```bash mkdir ceph-cluster && cd ceph-cluster ceph-deploy new ceph-mon1 # 生成初始配置文件[^1] ``` 2. **安装Ceph组件** ```bash ceph-deploy install --release luminous admin-node ceph-mon1 ceph-osd1 ceph-osd2 ``` > 注意:若网络受限,需提前配置本地Yum源[^4] 3. **部署Monitor** ```bash ceph-deploy mon create-initial ceph-deploy admin admin-node ceph-mon1 # 同步配置文件[^2] ``` 4. **部署OSD** - 清理磁盘(以`/dev/sdb`为例): ```bash ceph-deploy disk zap ceph-osd1 /dev/sdb[^3] ``` - 创建OSD: ```bash ceph-deploy osd create --data /dev/sdb ceph-osd1 ceph-deploy osd create --data /dev/sdb ceph-osd2 ``` 5. **部署MGR和MDS(可选)** ```bash ceph-deploy mgr create ceph-mon1 ceph-deploy mds create ceph-mon1 ``` #### 三、验证集群状态 ```bash ssh ceph-mon1 ceph -s # 检查HEALTH_OK状态 ``` #### 四、常见问题处理 | 问题现象 | 解决方案 | |---------|----------| | `ceph-deploy`安装失败 | 检查Python3版本,建议3.6+ | | Monitor启动超时 | 确认节点时钟同步(NTP服务) | | OSD无法创建 | 检查磁盘是否未分区(使用`lsblk`验证)[^3] | ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值