本文通过一个Helloworld示例为您介绍如何接入MSHA应用双活架构并进行功能测试。

背景信息

应用双活容灾架构如下。更多信息,请参见混合云应用双活容灾最佳实践

err

步骤一:前置准备

  1. Demo准备。
    这里用电商交易平台Demo示例介绍。例如,该平台包含如下应用:
    • Frontend:Web应用,负责和用户交互。
    • Cartservice:购物车应用,提供购物车添加、存储和查询服务。
    • Productservice:商品应用,提供商品、库存服务。

    技术栈:

    • SpringBoot。
    • 微服务框架:SpringCloud、Dubbo,注册中心使用Nacos。
    • 数据库:Redis和MySQL。
  2. 网络互通。
    您可以基于阿里云产品云企业网CEN实现网络互通。

步骤二:开通MSHA并录入多活资源

  1. 开通并配置MSHA。具体操作,请参见开通并配置MSHA
  2. 配置业务类型、单元和命名空间。
    1. 登录AHAS控制台
    2. 在控制台左侧导航栏中单击多活容灾
    3. 在左侧导航栏选择基础配置 > 业务类型和单元,然后单击新增业务类型
    4. 新增业务类型和单元配置页面,填写业务类型名称和业务类型标识,然后单击+添加单元,在弹出的添加单元面板,填写相关参数,完成新建业务类型和单元配置。
      说明 业务类型通常用于业务隔离。例如,交易业务和导购业务可能使用了不同的容灾架构。
    5. 在左侧导航栏选择基础配置 > 命名空间,然后单击新增命名空间,配置架构类型、多活组件、单元下所使用的接入层集群和Nacos命令通道等。配置参数更多信息,请参见新建命名空间
      说明
      • 命名空间通常用于环境隔离。例如,测试环境、预发环境、生产环境。
      • MSHA使用Nacos作为管控命令通道,来实现管控命令的异步并发推送、容灾规则的多级缓存以及命令通道自身的高可用分布式部署能力。这里推荐直接购买阿里云MSE产品的Nacos实例,全托管且有稳定性SLA保障。
  3. 部署MSFE接入层集群。在MSHA控制台,您可以将MSFE Tengine实例部署到多台ECS上,组成MSFE接入层集群。
    接入层集群部署架构图:db
    1. 将ECS导入MSHA控制台用于部署MSFE集群实例。具体操作,请参见新增服务器
    2. 将SLB导入MSHA控制台用于MSFE集群的前置负载均衡。具体操作,请参见新增SLB
    3. 创建MSFE集群,控制台会自动执行部署任务流程。具体操作,请参见创建集群
      说明
      • 所需的ECS容量建议:生产环境需要跨可用区部署多台,同时需要根据业务峰值QPS来评估需要的ECS,通常建议1000 qps/c。例如,业务峰值QPS 1w,使用4 C、16 G规格的ECS,那么则需要的ECS台数为:1w/1000/4c=2.5(台)。
      • 您需要优先购买阿里云ECS和SLB服务。
  4. 配置MSFE,包括录入域名/IP、URI、后端应用地址。

    创建好MSHA命名空间和MSFE接入层集群后,您就可以录入接入层域名、URI、后端应用回源地址等相关资源。录入并生效后,MSFE集群就会针对这些来源域名/IP的流量,来进行流量规则的处理和转发。具体操作,请参见配置MSFE

    重要
    • 新增域名时:

      若使用的是阿里云DNS,则域名解析类型选择解析,其他情况则选择不解析

    • 新增域名后,您还需要配置URI:
      • 架构类型:默认选择应用双活
      • 回源应用IP:Port:需要填写后端应用负载均衡设备的IP和端口号。例如,上海单元(cn-shanghai)的域名和URI,对应的后端应用的负载均衡设备IP和端口为1.1.xx.xx:80
  5. 部署注册中心同步集群。
    在MSHA控制台,您可以将注册中心同步实例部署到多台ECS上,组成同步集群。具体操作,请参见步骤二:配置注册中心同步集群
  6. 配置注册中心同步任务。
    部署好注册中心同步集群后,即可配置注册中心服务同步任务,目前支持Nacos-Nacos、Zk-Zk。具体操作,请参见步骤四:配置注册中心同步任务
  7. 改造应用,即修改Redis/MySQL连接地址信息。

    改造前

    业务应用仅在杭州单元部署,应用的Redis/MySQL连接地址配置如下。
    #Redis连接地址
    spring.redis.host=r-***.redis.rds.aliyuncs.com
    #MySQL连接地址
    spring.datasource.url=jdbc:mysql://rm-***.mysql.rds.aliyuncs.com:3306/dbname?characterEncoding=utf8&useSSL=false&serverTimezone=GMT
    说明
    • 以上为杭州单元的Redis/MySQL连接地址。
    • 若您是SpringBoot应用,则连接地址配置在application.properties文件中。

    进行应用双活改造

    您需要在第二个单元(即北京单元)对称部署业务应用和Redis/MySQL数据库实例。北京单元部署的Redis/MySQL实例地址如下。
    #Redis连接地址
    r-***.redis.rds.aliyuncs.com
    #MySQL连接地址
     rm-***.mysql.rds.aliyuncs.com
    业务应用的Redis/MySQL连接地址配置中,需要添加上备数据库地址信息(即北京单元的数据库),以便MSHA SDK/Agent识别并实现主备切换功能。配置如下:
    #Redis连接地址
    spring.redis.host=r-***.redis.rds.aliyuncs.com?mshaStandbyHost=r-uuu.redis.rds.aliyuncs.com
    #MySQL连接地址
    spring.datasource.url=jdbc:mysql://r-***.redis.rds.aliyuncs.com:3306/dbname?characterEncoding=utf8&useSSL=false&serverTimezone=GMT&mshaStandbyHost=rm-***.mysql.rds.aliyuncs.com
    说明 以上为北京单元的Redis/MySQL连接地址。

    改造后

    配置改造完成后,应用还需挂载上MSHA Agent,您需要重启应用后才会生效。具体操作,请参见步骤三:为JAVA应用安装Agent

  8. 配置Redis/MySQL数据同步和数据保护规则。
    1. 在MSHA控制台的管理数据源页面单击添加数据源,录入Redis/MySQL相关数据库连接信息。具体操作,请参见步骤一:创建数据源
    2. 数据层配置页面选择目标同步链路,然后单击添加同步任务,录入Redis/MySQL相关DTS同步任务信息。支持在MSHA控制台直接创建或录入已经创建好的DTS任务。
      说明 建议您在DTS控制台提前创建好Redis/MySQL(RDS/PolarDB等)同步任务,并确保同步状态为“同步中”后再录入到MSHA控制台。
    3. 数据层配置页面单击创建数据保护规则,配置数据保护禁写、读写分离规则。然后分别进行灰度推送、全量推送,相应保护规则才会通过管控命令通道,推送到应用节点MSHA SDK/Agent上。
  9. Redis/MySQL主备切换。
    1. 数据层配置页面,查看当前生效的主数据库。当类型列的Read和Write均显示为dg图标时则是主数据库,否则为备数据库。
    2. 单击操作列的主备切换,进入到切换工单页面,等待预检查完成并提交工单后则会自动执行主备切换流程。
  10. 发起切流。具体操作,请参见异地应用双活切流

步骤三:为JAVA应用安装Agent

为JAVA应用安装Agent的具体操作,请参见为Java应用手动安装探针配置Nacos作为规则下发通道。安装Agent之前您还需要先下载Agent并配置相关参数。具体操作如下。

  1. 下载Agent。
    地域 下载地址
    杭州单元 http://msha-agent-hangzhou.oss-cn-hangzhou.aliyuncs.com/msha-java-agent.jar
    北京单元 http://msha-agent-beijing.oss-cn-beijing.aliyuncs.com/msha-java-agent.jar
  2. 配置JVM参数。
    -javaagent:${探针安装路径}
    -Dmsha.license=${当前license}
    -Dmsha.namespaces=${命名空间ID}
    -Dmsha.app.name=${应用名称}
    -Dmsha.nacos.namespace=${Nacos命名空间ID}
    -Dmsha.nacos.server.addr=${Nacos服务器访问地址}
    配置参数说明:
    • ${当前license}:您可以在MSHA控制台的探针管理页面查看License。
    • ${命名空间ID}:您可以在MSHA控制台的命名空间页面查看。
    • ${应用名称}:为您实际的应用名称,暂不支持中文。
    • ${Nacos命名空间ID}:您可以进入Nacos实例的命名空间页面查看。如下图所示:sc
    • ${Nacos服务器访问地址}:格式为${内网地址:内网端口}。例如,mse-***-nacos-ans.mse.aliyuncs.com:8848

    阿里云内应用挂载Agent JVM参数配置示例:

    -javaagent:/home/admin/msha-agent/msha-java-agent.jar
    -Dmsha.license=aaabbbccc-d810-4f9c-b8e2-e2836*****e8
    -Dmsha.namespaces=aaabbbccc-8903-4a75-b10c-89ad7*****58
    -Dmsha.app.name=rpc-demo
    -Dmsha.nacos.namespace=aaabbbccc-27a6-4324-9ee7-4d52d*****e0
    -Dmsha.nacos.server.addr=mse-aaabbbccc-nacos-ans.mse.aliyuncs.com:8848

    IDC或其他云内应用挂载Agent JVM参数配置示例:

    -Dregion-id=idc
    -Dzone-id=idc-zone-a
    -Dvpc-id=empty
    -Downer-account-id=12*****89
    -javaagent:/home/admin/msha-agent/msha-java-agent.jar
    -Dmsha.license=aaabbbccc-d810-4f9c-b8e2-e2836*****e8
    -Dmsha.namespaces=aaabbbccc-8903-4a75-b10c-89ad7*****58
    -Dmsha.app.name=app-demo
    -Dmsha.nacos.namespace=aaabbbccc-27a6-4324-9ee7-4d52d*****e0
    -Dmsha.nacos.server.addr=171.0.xx.xx:8848

    配置说明:由于IDC或者其他云内,无法获取到ECS机器所属的位置信息,所以相比阿里云内应用挂载Agent的JVM配置,需要增加以下内容:

    • -Dregion-id:地域信息。
    • -Dzone-id:可用区信息。
    • -Dvpc-id:VPC网络ID。仅用于监控数据上报和MSHA控制台探针列表页展示,可配置为empty。
    • -Downer-account-id:阿里云账号(主账号)ID。用于监控数据上报。IDC或者其他云与阿里云网络打通后,监控数据会上报至阿里云。
  3. 重启应用。
    安装了探针的应用在启动时,会自动上报心跳信息。在MSHA控制台探针管理页面,若该应用实例信息显示在列表中且状态列为在线,则说明探针安装成功。sxv

步骤四:验证双活能力

  1. 验证MSFE路由能力。
    1. MSFE集群可视化运维。
      验证 说明
      测试内容 MSFE集群可视化运维
      测试类型 人工UAT测试
      前提条件 完成FE接入层集群部署
      测试步骤 可视化运维能力包括:扩缩容、Metrics监控、实例健康检查、回源地址健康检查、规则一致性巡检。sv
      测试结果 ✅符合预期
    2. MSFE引流及验证流量转发能力。
      验证 说明
      测试内容 MSFE引流及验证流量转发能力
      测试类型 人工UAT测试
      前提条件
      • 完成FE接入层集群部署完成
      • 在MSHA控制台完成MSFE配置
      测试步骤
      1. 本地修改Hosts文件绑定域名,本地制造测试流量引流进入MSHA FE测试。
        Host绑定示例:
        10.100.xx.xx ***.demo.com
        10.5.xx.xx ***.demo2.com
      2. 变更DNS将生产环境流量引入MSHA FE。流量路径:DNS>SLB>MSFE集群。
      3. 根据流量比例规则,查看FE转发是否正常。例如,初始化时北京单元、杭州单元流量比例为100:0。
        1. 登录FE集群所在的ECS机器,查看Tengine访问日志是否正常、是否有打印访问记录,是否返回200,是否转发了北京单元的后端应用回源地址。文件地址: /home/admin/tengine/logs/tengine-access_log
        2. 登录到北京单元的业务应用机器,查看应用日志是否正常,并验证页面功能是否能够正常使用。
      测试结果 ✅符合预期
    3. MSFE比例分流及切流。
      验证 说明
      测试内容 MSFE比例分流及切流
      测试类型 人工UAT测试
      前提条件
      • 完成FE接入层集群部署完成
      • 在MSHA控制台完成MSFE配置
      测试步骤
      1. 切流。调整北京单元、杭州单元的流量比例为0:100,然后刷新电商Demo首页,查看调用链始终访问到杭州单元的Frontend入口应用。
      2. 切流。调整北京单元、杭州单元流量比例为100:0,然后刷新电商Demo首页,查看调用链始终访问到北京单元的Frontend入口应用。
      3. 切流。调整北京单元、杭州单元流量比例为50:50,然后刷新电商Demo首页,查看调用链,有一半的概率访问到杭州单元的Frontend入口应用。
      测试结果 ✅符合预期
  2. 验证数据库禁写、读写分离能力。
    1. 日常态读写主数据库(读写不分离)。
      验证 说明
      测试内容 日常态读写主数据库(读写不分离)
      测试类型 人工UAT测试
      前提条件
      1. 应用挂载上MSHA-Agent。
      2. MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,不允许读写分离,主数据库在北京单元,且北京单元的数据库Read及Write均显示dg图标。

        北京单元的数据库显示如下图:

        svb

        数据保护规则如下图:

        sc
      测试步骤
      1. 北京单元的应用执行数据库读操作(即查询商品详情)、写操作(即下单),应该访问到北京数据库。
      2. 杭州单元的应用执行数据库读操作(即查询商品详情)、写操作(即下单),应该访问到杭州数据库。
      测试结果 ✅符合预期
    2. 日常态写主读本地(读写分离)。
      验证 说明
      测试内容 日常态读写主数据库(读写分离)
      测试类型 人工UAT测试
      前提条件
      1. 应用挂载上MSHA-Agent。
      2. MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,允许读写分离,主数据库在杭州单元,且杭州单元的数据库Read及Write均显示dg图标。svb
      测试步骤
      1. 两个单元内的应用执行数据库读操作(即查询商品详情),均访问到本单元数据库。
        • 北京单元的应用执行数据库读操作,应该访问到北京数据库。
        • 杭州单元的应用执行数据库读操作,应该访问到杭州数据库。
      2. 两个单元内的应用执行数据库写操作(即下单),均访问到主数据库(即杭州单元)。
        • 北京单元的应用执行数据库写操作,应该访问到杭州数据库。
        • 杭州单元的应用执行数据库写操作,应该访问到杭州数据库。
      测试结果 ✅符合预期
    3. 主备切换(读写不分离)。
      验证 说明
      测试内容 读写不分离下的主备切换
      测试类型 人工UAT测试
      前提条件
      1. 应用挂载上MSHA-Agent。
      2. MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,不允许读写分离,主数据库在杭州单元,且杭州单元的数据库Read及Write均显示dg图标。
      测试步骤
      1. 主备切换前,2个单元内的应用执行读操作(即查询商品详情)、写操作(即下单),应该访问到杭州数据库。
      2. 主备切换后(即将主数据库从杭州单元切换至北京单元),2个单元内的应用执行读操作(即查询商品详情)、写操作(即下单),应该访问到北京数据库。
      测试结果 ✅符合预期
    4. 主备切换(读写分离)。
      验证 说明
      测试内容 读写分离下的主备切换
      测试类型 人工UAT测试
      前提条件
      1. 应用挂载上MSHA-Agent。
      2. MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,允许读写分离,主数据库在杭州单元,且杭州单元的数据库Read及Write均显示dg图标。
      测试步骤
      1. 主备切换前,杭州单元内的应用:
        • 执行数据库读操作(即查询商品详情),应该访问到杭州单元数据库。
        • 执行数据库写操作(即下单),应该访问到杭州单元数据库。
      2. 主备切换前,北京单元内的应用:
        • 执行数据库读操作(即查询商品详情),应该访问到北京单元数据库。
        • 执行数据库写操作(即下单),应该访问到杭州单元数据库。
      3. 主备切换后(即将主数据库从杭州单元切换至北京单元),北京单元内的应用:
        • 执行数据库读操作(即查询商品详情),应该访问到北京单元数据库。
        • 执行数据库写操作(即下单),应该访问到北京单元数据库。
      测试结果 ✅符合预期
    5. 主备切换数据同步延迟期间禁写。
      验证 说明
      测试内容 主备切换数据同步延迟期间禁写
      测试类型 人工UAT测试
      前提条件
      1. 应用挂载上MSHA-Agent。
      2. MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,不允许读写分离,主数据库在北京单元,且北京单元数据库Write显示dg,杭州单元数据库Write显示dbnm图标。
      测试步骤
      1. 主备切换前,北京单元内的应用执行写操作(即下单),应该访问到北京数据库且SQL执行成功无报错。
      2. 制造同步存在延迟的场景(例如,暂停DTS同步任务),然后执行主备切换。那么主备切换流程中,执行到等待同步位点追平阶段后,就会长时间轮训DTS接口判断同步是否追平。dbk
      3. 主备切换等待数据同步追平过程中:
        • 杭州单元应用执行写操作(即下单),应该会被禁写(抛出异常)。
        • 北京单元应用执行写操作(即下单),应该会被禁写(抛出异常)。
      4. 主备切换结束后(即等待同步位点追平或跳过同步位点追平)
        • 杭州单元应用执行写操作(即下单),应该访问到杭州数据库且SQL执行成功无报错。
        • 北京单元应用执行写操作(即下单),应该访问到杭州数据库且SQL执行成功无报错。
      测试结果 ✅符合预期