本文通过一个Helloworld示例为您介绍如何接入MSHA应用双活架构并进行功能测试。
背景信息
应用双活容灾架构如下。更多信息,请参见混合云应用双活容灾最佳实践。
步骤一:前置准备
- Demo准备。这里用电商交易平台Demo示例介绍。例如,该平台包含如下应用:
- Frontend:Web应用,负责和用户交互。
- Cartservice:购物车应用,提供购物车添加、存储和查询服务。
- Productservice:商品应用,提供商品、库存服务。
技术栈:
- SpringBoot。
- 微服务框架:SpringCloud、Dubbo,注册中心使用Nacos。
- 数据库:Redis和MySQL。
- 网络互通。您可以基于阿里云产品云企业网CEN实现网络互通。
- 混合云网络打通:您可以通过高速通道物理专线、VPN网关、智能接入网关这3种方式打通网络。具体操作,请参见多接入方式构建企业级混合云。
- 阿里云多Region网络互通:您可以通过云企业网实现多Region的网络互通。具体操作,请参见使用云企业网实现跨地域跨账号VPC互通(企业版)。
步骤二:开通MSHA并录入多活资源
- 开通并配置MSHA。具体操作,请参见开通并配置MSHA。
- 配置业务类型、单元和命名空间。
- 登录AHAS控制台。
- 在控制台左侧导航栏中单击多活容灾。
- 在左侧导航栏选择基础配置 > 业务类型和单元,然后单击新增业务类型。
- 在新增业务类型和单元配置页面,填写业务类型名称和业务类型标识,然后单击+添加单元,在弹出的添加单元面板,填写相关参数,完成新建业务类型和单元配置。说明 业务类型通常用于业务隔离。例如,交易业务和导购业务可能使用了不同的容灾架构。
- 在左侧导航栏选择基础配置 > 命名空间,然后单击新增命名空间,配置架构类型、多活组件、单元下所使用的接入层集群和Nacos命令通道等。配置参数更多信息,请参见新建命名空间。说明
- 命名空间通常用于环境隔离。例如,测试环境、预发环境、生产环境。
- MSHA使用Nacos作为管控命令通道,来实现管控命令的异步并发推送、容灾规则的多级缓存以及命令通道自身的高可用分布式部署能力。这里推荐直接购买阿里云MSE产品的Nacos实例,全托管且有稳定性SLA保障。
- 部署MSFE接入层集群。在MSHA控制台,您可以将MSFE Tengine实例部署到多台ECS上,组成MSFE接入层集群。接入层集群部署架构图:
- 配置MSFE,包括录入域名/IP、URI、后端应用地址。
创建好MSHA命名空间和MSFE接入层集群后,您就可以录入接入层域名、URI、后端应用回源地址等相关资源。录入并生效后,MSFE集群就会针对这些来源域名/IP的流量,来进行流量规则的处理和转发。具体操作,请参见配置MSFE。
重要- 新增域名时:
若使用的是阿里云DNS,则域名解析类型选择解析,其他情况则选择不解析。
- 新增域名后,您还需要配置URI:
- 架构类型:默认选择应用双活。
- 回源应用IP:Port:需要填写后端应用负载均衡设备的IP和端口号。例如,上海单元(cn-shanghai)的域名和URI,对应的后端应用的负载均衡设备IP和端口为1.1.xx.xx:80。
- 新增域名时:
- 部署注册中心同步集群。在MSHA控制台,您可以将注册中心同步实例部署到多台ECS上,组成同步集群。具体操作,请参见步骤二:配置注册中心同步集群。
- 配置注册中心同步任务。部署好注册中心同步集群后,即可配置注册中心服务同步任务,目前支持Nacos-Nacos、Zk-Zk。具体操作,请参见步骤四:配置注册中心同步任务。
- 改造应用,即修改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。
- 配置Redis/MySQL数据同步和数据保护规则。
- 在MSHA控制台的管理数据源页面单击添加数据源,录入Redis/MySQL相关数据库连接信息。具体操作,请参见步骤一:创建数据源。
- 在数据层配置页面选择目标同步链路,然后单击添加同步任务,录入Redis/MySQL相关DTS同步任务信息。支持在MSHA控制台直接创建或录入已经创建好的DTS任务。说明 建议您在DTS控制台提前创建好Redis/MySQL(RDS/PolarDB等)同步任务,并确保同步状态为“同步中”后再录入到MSHA控制台。
- 在数据层配置页面单击创建数据保护规则,配置数据保护禁写、读写分离规则。然后分别进行灰度推送、全量推送,相应保护规则才会通过管控命令通道,推送到应用节点MSHA SDK/Agent上。
- Redis/MySQL主备切换。
- 在数据层配置页面,查看当前生效的主数据库。当类型列的Read和Write均显示为图标时则是主数据库,否则为备数据库。
- 单击操作列的主备切换,进入到切换工单页面,等待预检查完成并提交工单后则会自动执行主备切换流程。
- 发起切流。具体操作,请参见异地应用双活切流。
步骤三:为JAVA应用安装Agent
为JAVA应用安装Agent的具体操作,请参见为Java应用手动安装探针和配置Nacos作为规则下发通道。安装Agent之前您还需要先下载Agent并配置相关参数。具体操作如下。
- 下载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 - 配置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实例的命名空间页面查看。如下图所示:
- ${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或者其他云与阿里云网络打通后,监控数据会上报至阿里云。
- 重启应用。安装了探针的应用在启动时,会自动上报心跳信息。在MSHA控制台探针管理页面,若该应用实例信息显示在列表中且状态列为在线,则说明探针安装成功。
步骤四:验证双活能力
- 验证MSFE路由能力。
- MSFE集群可视化运维。
验证 说明 测试内容 MSFE集群可视化运维 测试类型 人工UAT测试 前提条件 完成FE接入层集群部署 测试步骤 可视化运维能力包括:扩缩容、Metrics监控、实例健康检查、回源地址健康检查、规则一致性巡检。 测试结果 ✅符合预期 - MSFE引流及验证流量转发能力。
验证 说明 测试内容 MSFE引流及验证流量转发能力 测试类型 人工UAT测试 前提条件 - 完成FE接入层集群部署完成
- 在MSHA控制台完成MSFE配置
测试步骤 - 本地修改Hosts文件绑定域名,本地制造测试流量引流进入MSHA FE测试。
Host绑定示例:
10.100.xx.xx ***.demo.com 10.5.xx.xx ***.demo2.com
- 变更DNS将生产环境流量引入MSHA FE。流量路径:DNS>SLB>MSFE集群。
- 根据流量比例规则,查看FE转发是否正常。例如,初始化时北京单元、杭州单元流量比例为100:0。
- 登录FE集群所在的ECS机器,查看Tengine访问日志是否正常、是否有打印访问记录,是否返回200,是否转发了北京单元的后端应用回源地址。文件地址:
/home/admin/tengine/logs/tengine-access_log
- 登录到北京单元的业务应用机器,查看应用日志是否正常,并验证页面功能是否能够正常使用。
- 登录FE集群所在的ECS机器,查看Tengine访问日志是否正常、是否有打印访问记录,是否返回200,是否转发了北京单元的后端应用回源地址。文件地址:
测试结果 ✅符合预期 - MSFE比例分流及切流。
验证 说明 测试内容 MSFE比例分流及切流 测试类型 人工UAT测试 前提条件 - 完成FE接入层集群部署完成
- 在MSHA控制台完成MSFE配置
测试步骤 - 切流。调整北京单元、杭州单元的流量比例为0:100,然后刷新电商Demo首页,查看调用链始终访问到杭州单元的Frontend入口应用。
- 切流。调整北京单元、杭州单元流量比例为100:0,然后刷新电商Demo首页,查看调用链始终访问到北京单元的Frontend入口应用。
- 切流。调整北京单元、杭州单元流量比例为50:50,然后刷新电商Demo首页,查看调用链,有一半的概率访问到杭州单元的Frontend入口应用。
测试结果 ✅符合预期
- MSFE集群可视化运维。
- 验证数据库禁写、读写分离能力。
- 日常态读写主数据库(读写不分离)。
验证 说明 测试内容 日常态读写主数据库(读写不分离) 测试类型 人工UAT测试 前提条件 - 应用挂载上MSHA-Agent。
- MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,不允许读写分离,主数据库在北京单元,且北京单元的数据库Read及Write均显示图标。
北京单元的数据库显示如下图:
数据保护规则如下图:
测试步骤 - 北京单元的应用执行数据库读操作(即查询商品详情)、写操作(即下单),应该访问到北京数据库。
- 杭州单元的应用执行数据库读操作(即查询商品详情)、写操作(即下单),应该访问到杭州数据库。
测试结果 ✅符合预期 - 日常态写主读本地(读写分离)。
验证 说明 测试内容 日常态读写主数据库(读写分离) 测试类型 人工UAT测试 前提条件 - 应用挂载上MSHA-Agent。
- MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,允许读写分离,主数据库在杭州单元,且杭州单元的数据库Read及Write均显示图标。
测试步骤 - 两个单元内的应用执行数据库读操作(即查询商品详情),均访问到本单元数据库。
- 北京单元的应用执行数据库读操作,应该访问到北京数据库。
- 杭州单元的应用执行数据库读操作,应该访问到杭州数据库。
- 两个单元内的应用执行数据库写操作(即下单),均访问到主数据库(即杭州单元)。
- 北京单元的应用执行数据库写操作,应该访问到杭州数据库。
- 杭州单元的应用执行数据库写操作,应该访问到杭州数据库。
测试结果 ✅符合预期 - 主备切换(读写不分离)。
验证 说明 测试内容 读写不分离下的主备切换 测试类型 人工UAT测试 前提条件 - 应用挂载上MSHA-Agent。
- MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,不允许读写分离,主数据库在杭州单元,且杭州单元的数据库Read及Write均显示图标。
测试步骤 - 主备切换前,2个单元内的应用执行读操作(即查询商品详情)、写操作(即下单),应该访问到杭州数据库。
- 主备切换后(即将主数据库从杭州单元切换至北京单元),2个单元内的应用执行读操作(即查询商品详情)、写操作(即下单),应该访问到北京数据库。
测试结果 ✅符合预期 - 主备切换(读写分离)。
验证 说明 测试内容 读写分离下的主备切换 测试类型 人工UAT测试 前提条件 - 应用挂载上MSHA-Agent。
- MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,允许读写分离,主数据库在杭州单元,且杭州单元的数据库Read及Write均显示图标。
测试步骤 - 主备切换前,杭州单元内的应用:
- 执行数据库读操作(即查询商品详情),应该访问到杭州单元数据库。
- 执行数据库写操作(即下单),应该访问到杭州单元数据库。
- 主备切换前,北京单元内的应用:
- 执行数据库读操作(即查询商品详情),应该访问到北京单元数据库。
- 执行数据库写操作(即下单),应该访问到杭州单元数据库。
- 主备切换后(即将主数据库从杭州单元切换至北京单元),北京单元内的应用:
- 执行数据库读操作(即查询商品详情),应该访问到北京单元数据库。
- 执行数据库写操作(即下单),应该访问到北京单元数据库。
测试结果 ✅符合预期 - 主备切换数据同步延迟期间禁写。
验证 说明 测试内容 主备切换数据同步延迟期间禁写 测试类型 人工UAT测试 前提条件 - 应用挂载上MSHA-Agent。
- MSHA控制台录入数据层配置,包括数据源、数据同步链路和数据保护规则。数据保护规则状态为生效,不允许读写分离,主数据库在北京单元,且北京单元数据库Write显示,杭州单元数据库Write显示图标。
测试步骤 - 主备切换前,北京单元内的应用执行写操作(即下单),应该访问到北京数据库且SQL执行成功无报错。
- 制造同步存在延迟的场景(例如,暂停DTS同步任务),然后执行主备切换。那么主备切换流程中,执行到等待同步位点追平阶段后,就会长时间轮训DTS接口判断同步是否追平。
- 主备切换等待数据同步追平过程中:
- 杭州单元应用执行写操作(即下单),应该会被禁写(抛出异常)。
- 北京单元应用执行写操作(即下单),应该会被禁写(抛出异常)。
- 主备切换结束后(即等待同步位点追平或跳过同步位点追平)
- 杭州单元应用执行写操作(即下单),应该访问到杭州数据库且SQL执行成功无报错。
- 北京单元应用执行写操作(即下单),应该访问到杭州数据库且SQL执行成功无报错。
测试结果 ✅符合预期
- 日常态读写主数据库(读写不分离)。