场景:原有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上删除掉所有老环境虚拟机对应的磁盘文件。(此步要特别慎重!!!)
如果要批量恢复所有记录被误删的云主机,只需要把上述步骤封装到一个脚本里,批量执行即可。