从无法启动的AWS云实例中恢复Redis的数据

最近亚马逊云服务在进行大规模的维护操作,我们的亚马逊云服务器中有很多被安排在29号被重新启动,这可能会导致服务器被重新分配新的内外网IP地址,由于是生产环境的服务器,所以可能会导致一些不良的影响。

在这种情况下,我决定手动对关键的服务器进行停止和启动的操作(这个操作完成后,重新启动的服务器会运行在新的亚马逊基础架构上面,因此不会再被亚马逊现有的维护重启)。

在执行停止和启动的过程中,其中一台Redis服务器启动中被一个进程阻塞了整个启动过程,其中sshd进程没有启动,因此我们无法登录那台服务器进行后续的维护工作。由于这台服务器存储着系统的关键信息,必须进行数据恢复。因为之前没有这方面的经验,因此我在Google上找了大量的文章,但是都未能解决这个问题。

最后我想到,我们的Redis服务器之前设置了持久化,因此磁盘上肯定会包含Redis的内存镜像文件。基于这一点,以及AWS提供的服务能力,我进行了如下操作来进行数据恢复。

1. 创建Redis服务器磁盘的快照(Snapshot)

打开AWS控制台,找到Redis服务器挂接的EBS卷,右击那个卷,选择Create Snapshot来创建磁盘快照

Create Snapshot

2. 使用生成的磁盘快照创建新的EBS卷

打开快照列表找到刚刚创建的快照,右击该快照,选择Create Volume来创建新的EBS卷

Create Volume

3. 创建一个新的AWS云实例或者选择一个存在的云实例,然后将新创建的卷附加到选定的实例

找到新创建的卷,右击选择Attach Volume菜单

Attach Volume

然后在弹出的对话框中选择相应的AWS云实例,最后点击Attach按钮完成附加磁盘

Attach Volume Dialog

4. 将附加到AWS云实例的磁盘挂接进文件系统

完成磁盘附加后,会在相应的实例中创建一个磁盘设备文件,如果是第一块附加硬盘的话,通常为/dev/xvda,现在我们需要将这个磁盘挂接到文件系统中来。按如下步骤进行操作

注意:由于挂接的磁盘上已经存在文件系统,因此不需要为这个磁盘指定文件系统类型,关于如何指定文件系统,请参看我的另一篇博客:为Amazon弹性云实例添加额外的磁盘空间

5. 找到Redis数据文件并恢复数据

进入挂接的磁盘的路径找到Redis的持久化文件dump.rdb,并将此文件拷贝到运行正常的Redis实例的数据路径下,重新启动Redis的服务器进程。Redis服务器会自动将数据文件中内容加载到内存中。

 

在Redis数据的恢复过程中可能会用到一下工具

You may also like...