场景:原有OpenStack环境的平台层面的数据库云主机数据被意外删掉,但是ceph上的虚拟机磁盘文件还存在,此时虚拟机上的业务还是可以正常运行,只是在OpenStack 界面无法查看到虚拟机信息。想要恢复原来的所有云主机信息,要求机器信息和原平台保持完全一样,即界面看到的镜像、配置和IP不能改变。

思路:只要ceph存储还在,业务数据就没丢失,只需要重新创建虚拟机,然后把OpenStack平台上的主机UUID和Ceph的volume  uuid重新对应起来即可。

有3种方法:

1)从Ceph上导出虚拟机磁盘文件,然后导入该磁盘文件到OpenStack平台做为镜像,以该镜像重新创建虚拟机。该种方案是不经过大脑思考的方案,一是导出和导入镜像效率极低,二是平台上会产生太多新镜像。

2)在原平台上恢复;(操作不当易产生脏数据)

3)重新部署个新平台,从头恢复。(所有数据都要重新生成)

方案2和方案3各有优劣,下面以方案3(新建OpenStack平台)为例,列举恢复的关键步骤。

单台云主机恢复步骤:

0. 重新部署一套OpenStack环境,导入和原平台相同的基础镜像;

1. 在新平台上创建和原环境同样配置的虚拟机(镜像和flavor一样);

2. 对新建的虚拟机绑定和原环境一样的浮动IP

nova floating-ip-associate4950b904-b0d9-49e4-b7d8-30c51e154bc4 172.17.16.93

3. 在Ceph上,根据新环境虚拟机的uuid查询虚拟机磁盘文件

rbd ls volumes | grep4950b904-b0d9-49e4-b7d8-30c51e154bc4

4. 重命名新环境虚拟机的磁盘文件

rbd mv volumes/4950b904-b0d9-49e4-b7d8-30c51e154bc4_diskvolumes/4950b904-b0d9-49e4-b7d8-30c51e154bc4_disk.bak

5. 在Ceph上,根据老环境虚拟机的uuid查询虚拟机磁盘文件

rbd ls volumes | grep4b37fec6-c32d-493c-ad60-fdd946ed31c8

6. 重命名老环境虚拟机的磁盘文件为新环境虚拟机的磁盘文件

rbd mv volumes/4b37fec6-c32d-493c-ad60-fdd946ed31c8_diskvolumes/4950b904-b0d9-49e4-b7d8-30c51e154bc4_disk

7.   在新平台上硬重启虚拟机,即可完全恢复原来的虚拟机。

8.   确认恢复正常后,在Ceph上删除掉所有老环境虚拟机对应的磁盘文件。(此步要特别慎重!!!)

如果要批量恢复所有记录被误删的云主机,只需要把上述步骤封装到一个脚本里,批量执行即可。