统一集群做的跨pool数据迁移
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
最近奔波于各个集群间的故障处理,rdma测试再次延后了。今日先更一波大胆的操作
问题的提出
线上有个集群要重建pool,pool的情况是这样的
1 | [twj@cluster-mon ~]$ sudo ceph df |
其crush结构是
1 | [twj@cluster-mon ~]$ sudo ceph osd tree|grep -v osd |
root的分工是,default和hdd-root-1是块存储,hdd-root-2是对象存储,由于某些原因,现在要对块存储的两个root重建,也就是对zone1.rgw.buckets.data和zone1.pool2.bucket.data 这两个存储池的osd进行重建,而对象存储的数据部分虽然存放在hdd-root-2,但是它的其余pool都存放在了root default,对象存储数据要求完全保留,且对业务影响越小越好
从这里也可以看出设计的重要性,在集群建设之初就应该要考虑业务的解耦和后续扩容、重建等相关工作的影响和便利度,减轻整体运维的负担和难度
分步进行
要重建osd,必然要删除osd,此前吃过亏,直接删掉osd会导致mon假死,集群不可用,这个问题在较早的公众号文章中有说过,感兴趣的老铁可以回看
首先,因为我们的data pool比较大,rbd很多而且都写满了数据,按照先删掉rbd、再删掉pool、再重建的步骤来实在是太慢了,因为删除rbd本身就非常慢,因为除了对象存储的数据,块存储的数据可以全部删掉,所以我们直接进行了rbd pool的删除,然后将要重建的两个pool直接删掉
1 | sudo ceph osd pool delete rbd rbd --yes-i-really-really-mean-it |
删掉这两个大的data pool后,大量osd一度进入down状态,但是mon很正常,ceph命令很流畅,不慌,VeryGood
但是问题来了,对象存储的非data部分的pool怎么搞,这部分pool数据不能丢失,甚至业务都还在读写,但是它所在的osd全部要重建
思路上,有几个:
Plan A:
待root default所有osd正常后,逐台重建,这样数据不受到影响,业务影响很小,很耗时
Plan B:
将root default所有osd以host为单位进行删除,将那些pool的数据都逼到最后几台上面,然后一次性重建先删掉的host,加进去后再重建剩下的几台,很耗时
Plan C:
停一会业务,将这些pool全部转移到hdd-root-2 与其数据pool放一起,这样就解耦了,效率最高
最好的方案显然是Plan C,但是有个问题,非data pool转移后,业务读写是否还能正常?
幸运的是,我们还有未上线的准测试环境,跑了一下,没问题,能正常读写,实际上,我们做的测试是:
将非data pool先copy到其他的root,然后再拷贝回来,再测试数据读写,实测无问题
说干就干
将pool整体迁移到其他root,具体做法是:
1 | 1、在目标root创建新pool,注意新pool不能与旧pool同名 |
脚本的做法是:
1 |
|
执行脚本后,刷出大量rados object进行拷贝的信息,完成pool的拷贝,这样源pool就可以删除了,然后使用相同的方法,进行pool的重命名
root重建后,如果有需要,还可以重新copy回来
总结
算是一次生产环境的同集群pool在不同的root迁移的案例,在很多扩容、重建场景下还是比较实用的,因为用的rados的命令接口,操作起来也很简单,轻松脚本化,不失为一种好的解决方案
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2022/07/06/同集群pool迁移方案/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!