Atom feed of this document
  

 云的灾难恢复

此章涵盖了云在发生灾难后的管理步骤,以及备份持久的存储卷。备份是强制的,那怕是超出了灾难的一些场景。

灾难恢复规划(DRP)的定义,请参阅 http://en.wikipedia.org/wiki/Disaster_Recovery_Plan

灾难会发生在架构中的多个组件(例如,磁盘损坏,断网,或者是掉电)。在此例中,下面的组件是被配置的:

  • 一个云控制器(nova-api, nova-objectstore, nova-network)

  • 一个计算节点 (nova-compute)

  • 一个OpenStack块存储所用到的存储区域网络 (SAN) (cinder-volumes)

对于云来说,最糟糕的灾难莫过于掉电了,三个组件都怕这个。在掉电之前:

  • 从SAN到云控制器创建一个活动的iSCSI会话(用于cinder-volumes的LVM的VG)。

  • 从云控制器到计算节点创建一个活动的iSCSI会话(由cinder-volume管理)。

  • 为每个卷创建一个iSCSI会话(所以14 EBS的卷需要14个iSCSI会话)。

  • 创建从云控制器到计算节点的iptables或ebtables规则。允许来自云控制器访问到运行 的实例。

  • 保存数据库当前的状态,当前运行实例的状态,以及挂接卷(挂载点,卷ID,卷状态等),至少从云控制器到计算节点都需要。

在恢复电力后,所有的硬件组件都重启过了:

  • 从SAN到云的iSCSI不存在了。

  • 从云控制器到计算节点的iSCSI会话不存在了。

  • 从云控制器到计算节点的iptables和ebtables都重新创建,这是因为nova-network在启动时配置会重置。

  • 没有运行的实例。

    注意,实例不会丢失,因为无论是destroy 还是 terminate 都会被调用,实例的文件仍然存在于计算节点中。

  • 数据库已经更新过了。

 

开始恢复

[警告]警告

不要再在此过程增加任何额外的步骤,也不要不按照顺序执行。

  1. 检查卷和实例之间的目前关系,然后再重新附加。

    此信息可从使用nova volume-list来查看。注意nova客户端同样拥有从OpenStack块存储获取卷信息的能力。

  2. 更新数据库已清理停滞的状态。使用下面语句为每个卷都执行:

    mysql> use cinder;
    mysql> update volumes set mountpoint=NULL;
    mysql> update volumes set status="available" where status <>"error_deleting";
    mysql> update volumes set attach_status="detached";
    mysql> update volumes set instance_id=0;

    使用命令 nova volume-list列出所有卷。

  3. 使用命令 nova reboot INSTANCE重启实例。

    [重要]重要

    有些实例会完成重启并且可访问,有些或许就停留在了 plymouth阶段。这是意料中的结果,请不要重启第二次。

    在该阶段中的实例状态取决于您是否添加了 /etc/fstab 入口给卷。以 cloud-init 包构建的镜像保持在 pending 状态,而其他的跳过了一些错误卷并启动。执行这个步骤是为了让计算服务重启每一台实例,这样就可以保留保存的状态。是否所有的实例都成功启动是不重要的。要了解更多关于 cloud-init 的信息,请阅读 help.ubuntu.com/community/CloudInit

  4. 重新附加卷到其各自的实例上,如果需要,使用 nova volume-attach 命令。这个示例使用了一个列出卷的文件来重新附加它们:

    #!/bin/bash
    
    while read line; do
        volume=`echo $line | $CUT -f 1 -d " "`
        instance=`echo $line | $CUT -f 2 -d " "`
        mount_point=`echo $line | $CUT -f 3 -d " "`
            echo "ATTACHING VOLUME FOR INSTANCE - $instance"
        nova volume-attach $instance $volume $mount_point
        sleep 2
    done < $volumes_tmp_file

    停止在 plymouth 阶段的实例现在会自动地继续启动和正常开始。之前成功启动的实例现在是可以看到卷的。

  5. SSH到实例并重启它们。

    如果一些基于服务依赖于卷,或者如果卷在 fstab 有一个入口,您现在应该可以重启实例。直接从实例本身重启,而不是通过 nova

    # shutdown -r now

当你计划和执行灾难恢复时,请谨记这几点:

  • 在文件fstab中使用参数errors=remount来防止数据损坏。

    这个参数会使系统禁用当 I/O 错误时写入磁盘的功能。这个配置选项应该添加到 cinder-volume 服务器 (即进行 iSCSI 到 SAN 连接的服务器) 和虚拟机的 fstab 文件中。

  • 不要将SAN的磁盘项添加到cinder-volumefstab 文件中。

    一些系统会在此步挂起,这意味着你丢失了访问到你云控制器的连接。要手动的重新运行会话,请在执行mount之前运行此命令:

    # iscsiadm -m discovery -t st -p $SAN_IP $ iscsiadm -m node --target-name $IQN -p $SAN_IP -l
  • 在您的实例中,如果您在磁盘中有整个 /home/ 目录,将以用户的 bash 文件和 authorized_keys 文件保留一个用户目录 (而不是空的 /home 目录然后在其上映射磁盘)。

    此允许你在没有挂接卷的情况下连接到实例,如果你仅允许通过公钥来连接的话。

如果你需要灾难恢复计划(DRP)的脚本, https://github.com/Razique恰好提供了这一版本,其会执行下面的步骤:

  1. 为实例及其挂接的卷创建了阵列。

  2. MySQL 数据库已更新。

  3. 使用euca2ools重启所有的实例。

  4. 重新挂接卷。

  5. SSH连接使用计算服务凭证在每个实例中执行。

脚本包括了test mode,其允许你执行整个序列,但仅针对一个实例。

要重现断掉电源的情况,连接到运行实例的节点,然后关闭iSCSI会话。不要使用命令nova volume-detach来分离卷,手动关闭iSCSI会话。下面的例子就是将15号的iSCSI会话关闭了:

# iscsiadm -m session -u -r 15

不要忘记-r标记,否则,你会关闭所有会话。

Questions? Discuss on ask.openstack.org
Found an error? Report a bug against this page


loading table of contents...