基于ESSD同城冗余云盘的容灾方案实践

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

当业务需要跨可用区高可用时,可使用ESSD同城冗余云盘实现。本文将通过手动部署或一键实验部署快速验证其在可用区故障下实现数据零丢失(RPO=0)和业务快速恢复的能力。

背景信息

ESSD同城冗余云盘的关键特性是数据在同一个地域(Region)的多个可用区(Availability Zone)中存有冗余副本。可用区之间在电力、网络和物理位置上是严格隔离的。因此,当任何一个可用区因故无法服务时,数据依然完整且可访问,可以将其挂载至其他可用区实例,从而保障业务的连续性。典型应用场景包括数据库、中间件的多可用区高可用,核心应用的同城容灾,企业CI/CD系统的同城容灾。

计费说明

在部署实验任务时,会根据使用的阿里云资源(ECS实例、ESSD同城冗余云盘等)进行计费。如果通过实验室一键部署,创建的实验任务本身不会收费。

实验室一键部署过程中使用到的阿里云资源仅支持按量付费。

部署测试环境

手动部署

  1. 自定义购买实例。需要购买2个同地域不同可用区实例,主要参数示例如下:

    实例类型

    配置示例

    容灾测试故障实例

    付费类型:按量付费

    地域:华东1(杭州)

    可用区:可用区I

    实例规格:ecs.c7.large

    操作系统:Alibaba Cloud Linux3.2104 LTS 64

    系统盘:ESSD云盘 PL0 20 GiB

    数据盘:ESSD同城冗余云盘 20 GiB

    容量测试恢复实例

    付费类型:按量付费

    地域:华东1(杭州)

    可用区:可用区K

    实例规格:ecs.c7.large

    操作系统:Alibaba Cloud Linux3.2104 LTS 64

    系统盘:ESSD云盘 PL0 20 GiB

    无需购买数据盘

  2. 登录ECS实例。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

  3. 登录容灾测试故障实例,初始化数据盘。

    1. 执行以下指令创建文件系统。

      sudo mkfs -t ext4 /dev/vdb
    2. 执行以下指令创建挂载目录。

      sudo mkdir /data
    3. 执行以下指令挂载目录。

      sudo mount /dev/vdb /data

通过实验室一键部署

重要

实验室部署的一键搭建能力可用于快速验证和测试新特性,不适合直接应用到生产环境中。生产环境建议您手动部署。

  1. 前往实验场景页面。

    1. 登录块存储EBS控制台

      首次登录EBS控制台时,请根据页面提示创建一个EBS服务关联角色。更多信息,请参见块存储EBS服务关联角色
    2. 在左侧导航栏选择实验室 实验场景

    3. 在顶部菜单栏左上角处,选择地域。

    4. EBS云盘容灾方案实践-Regional ESSD实验场景模板中,单击一键创建实验任务

  2. 设置实验场景的基础信息后,单击下一步。

    参数

    说明

    实验场景

    默认为EBS云盘容灾方案实践-Regional ESSD.

    实验任务名称

    已默认填写,可以根据需要修改。

    描述(可选)

    设置实验任务的描述信息。

    高级配置(可选)

    为实验任务设置标签和资源组信息。

  3. 在依赖检查界面,检查依赖情况,显示为未发现异常时,单击下一步

  4. 资源参数页面,确定或修改实验任务的参数后,单击下一步

    参数

    说明

    发生故障的可用区

    选择容灾测试故障实例对应的可用区。

    故障恢复的可用区

    选择容灾测试恢复实例对应的可用区。

    ECS实例规格

    仅支持选择ecs.c7.large。

    故障ECS实例密码

    已默认填写,可根据需要修改。

    重要

    请牢记设置的实例密码,以便后续远程连接ECS实例。

    故障恢复ECS实例密码

    已默认填写,可根据需要修改。

    重要

    请牢记设置的实例密码,以便后续远程连接ECS实例。

  5. 检查确认配置参数以及费用信息后,单击确认。在弹出的创建实验任务对话框中,单击确定

    创建任务成功后,系统会准备资源,并搭建好对应的实验场景,预计需要15分钟,请耐心等待。

    实验任务依赖于ROS资源编排能力,一个实验任务对应于一个资源栈,最多允许创建200个实验任务。
  6. 当任务状态变为创建完成后,可单击实验任务ID,查看任务配置详细信息。

验证与清理

验证方案

  1. 部署模拟业务。

    1. 远程连接容灾测试故障实例。

      1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

      2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

    2. 部署微服务。

      1. 执行以下命令,安装服务依赖。

        sudo pip3 install Flask
      2. 执行以下命令,新建并编辑文件app.py。

        sudo vim /data/app.py
      3. i键进入编辑模式,修改为以下内容后按Esc键退出编辑模式,输入:wq后按下回车键,保存并退出。代码为一个持续写入时间戳的Python应用。

        from flask import Flask
        import threading
        import time
        import os
        from datetime import datetime
        
        app = Flask(__name__)
        
        # 路径到文件
        log_file_path = os.path.expanduser('/data/time.log')
        
        # 创建一个后台线程来写入当前时间
        def log_time():
            while True:
                current_time = datetime.now()  # 获取当前的日期和时间
                current_time_str = current_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]  # 格式化为带毫秒的时间字符串
                with open(log_file_path, 'a') as f:
                    f.write(f"{current_time_str} \n")  # 写入时间
                time.sleep(0.01)
        
        @app.route('/')
        def hello_world():
            return 'Hello, World!'
        
        @app.route('/read')
        def read_latest_line():
            try:
                with open(log_file_path, 'r') as f:
                    lines = f.readlines()
                    # 返回最近的一行
                    return lines[-1] if lines else "Log file is empty."
            except FileNotFoundError:
                return "Log file not found."
        
        if __name__ == '__main__':
            # 启动写入时间的后台线程
            threading.Thread(target=log_time, daemon=True).start()
            # 启动Flask应用
            app.run(port=80, host='0.0.0.0')
      4. 执行以下命令,后台运行python文件,该应用会以10ms为间隔记录时间至/data/time.log中。

        sudo nohup python /data/app.py &
      5. 执行以下命令,查看时间记录,并保持该终端页面不关闭,后需模拟可用区故障时需要查看最终记录时间。

        sudo tail -f /data/time.log
  2. 模拟可用区故障。

    通过停止容灾测试故障实例,模拟实例被误释放、机房断电或所在可用区故障等场景。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 单击容灾测试故障实例ID进入实例详情页,单击全部操作展开所有操作面板,然后搜索并单击停止

    3. 设置停止方式和模式后,单击确定

      设置

      说明

      停止方式

      停止

      强制停止可能丢失实例操作系统中未写入磁盘的数据。

      停止模式

      普通停机模式

    4. 返回上一步保留的终端页面,记录最后时间,后续验证数据是否丢失时,需要使用。示例中为2025-08-20 14:09:18.309。

      image

  3. 在其他可用区恢复业务。

    1. 挂载ESSD同城冗余云盘至容灾测试恢复实例

      1. 访问ECS控制台-块存储-云盘。在页面左侧顶部,选择目标资源所在的资源组和地域。

      2. 在目标ESSD 同城冗余云盘的操作列中,单击挂载

      3. 目标示例选择容灾测试恢复实例,并选中我确认通过强制挂载方式切换该云盘的挂载实例,然后按照界面提示完成挂载操作。

        重要

        挂载前如果存在未写入ESSD同城冗余云盘的数据(例如内存中的数据还未写入云盘),强制执行挂载操作后,原实例上的该云盘的IO请求将会被拒绝且返回失败。

    2. 远程连接容灾测试恢复实例。

      1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

      2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

    3. 分别执行以下两条命令,创建并挂载文件系统。

      sudo mkdir /data
      sudo mount /dev/vdb /data
    4. 验证数据是否丢失。

      查看日志记录,最新为2025-08-20 14:09:18.309,与模拟故障最后记录的时间一致。

      sudo tail -f /data/time.log

      image

清理资源

手动部署

  1. 释放容灾测试故障实例和容灾测试恢复实例,具体操作请查看释放实例

  2. 释放ESS同城冗余云盘,具体操作请查看释放云盘

通过实验室部署

推荐通过实验室一键删除实验任务的相关资源,不建议通过ECS控制台或者EBS控制台释放实例和云盘,避免误操作导致实验任务资源不可用。

  1. 卸载ESSD同城冗余云盘

  2. 登录块存储EBS控制台

  3. 在左侧导航栏选择实验室 任务列表

  4. 在顶部菜单栏左上角处,选择地域。

  5. 在目标实验任务的操作列,单击删除

    也可选中多个实验任务,在列表底部单击批量删除

    警告

    删除实验任务时默认不会释放实验资源,如果选中删除资源,实验任务中的资源,例如ECS实例、数据库实例等均会被释放,请谨慎操作。