云原生灾备产品HyperBDR自动化测试实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: HyperBDR是一款基于云原生理念的迁移和容灾产品,核心的业务场景是将源端以块级别差量方式同步至云原生存储中,目前已经实现对块存储和对象存储支持,最后再利用Boot-in-Cloud专利技术将业务系统一键式恢复至可用状态,真正做到了对云原生编排能力的充分利用,满足迁移和灾备等业务场景的不同需求。HyperBDR目前已经支持的源端操作系统大版本就将近10个(Windows/CentOS/Redhat/Ubuntu/SUSE/国产化操作系统),小版本更是超过几百个,而在目标目标云平台也陆续支持了将近40个(公有云、专有云、私有云、超融合、虚拟化等),并且数量还在增加。假设我们将源端的操作系统

HyperBDR是一款基于云原生理念的迁移和容灾产品,核心的业务场景是将源端以块级别差量方式同步至云原生存储中,目前已经实现对块存储和对象存储支持,最后再利用Boot-in-Cloud专利技术将业务系统一键式恢复至可用状态,真正做到了对云原生编排能力的充分利用,满足迁移和灾备等业务场景的不同需求。

HyperBDR目前已经支持的源端操作系统大版本就将近10个(Windows/CentOS/Redhat/Ubuntu/SUSE/国产化操作系统),小版本更是超过几百个,而在目标目标云平台也陆续支持了将近40个(公有云、专有云、私有云、超融合、虚拟化等),并且数量还在增加。假设我们将源端的操作系统到全部云平台进行一次覆盖性测试,组合的测试用例可能超过10000个。

这么大规模的情况下想做到测试覆盖,单纯依靠人力显然不现实,必须引入自动化测试手段对核心业务场景进行测试,这样不仅可以满足自动化测试的需要,也可以在日常开发过程中及时让开发人员在新开发功能中对核心流程的影响,进一步提升产品的稳定性和可靠性。

痛点分析

我们先来看一下手工测试情况下,HyperBDR产品测试的几个痛点:

痛点一、测试用例多,人力资源不足

在上述源端和目标端的规模情况下,即使做一些基本冒烟,一次完整的测试的场景用例也依然有一百多种。例如:

  • 源端(19种):CentOS(6/7/8)、Redhat(6/7/8)、SUSE(11/12)、Ubuntu(14.04/16.04/18.04/20.04)、Windows(2003/2008/2012/2016/2019)、Oracle Linux、国产化操作系统
  • 目标端(9种):OpenStack、AWS、阿里云、腾讯云、华为云、移动云、ZStack、超融合产品、超融合产品

如此计算下来,一次测试的场景是171种。可能有的同学会说,这些用例也不是很多呀,跑一次也用不了多久,所以接下来让我们看一下HyperBDR在测试过程中第二个痛点:测试周期问题。

痛点二、测试周期长

不同于业务测试,HyperBDR单一场景的测试是非常耗时的,我们先忽略前期资源准备时间和各种配置时间,单纯就数据同步和启动过程进行一下分析:

  • 数据同步:简单来说数据同步的过程就是将源端操作系统内的有效数据(不是分配容量),以块级别方式读出,写入到目标的云原生存储中。其中,第一次为全量,后续为永久增量。以Windows为例,假设有效数据为500G,如果按照千兆局域网带宽80%利用率计算,传输速度大概在800 Mbps,大约为80 MB/s,耗时约为1小时8分钟。
  • 主机启动:根据不同的云原生存储类型,启动时间有很大的差异性,例如华为云的块存储,由于快照机制以及可以支持交换系统盘,所以启动时间与容量基本没有关系,基本可以控制在5分钟之内。但是对于国内的大多数云平台来说,并没有这样的能力,像阿里云在有快照生成卷时,底层限速为40 MB/s,这样一下子就拉长了恢复实践。我们以对象存储为例,假设我们从内网(Internal网络)将对象存储数据恢复至块存储,一个500G有效数据磁盘的恢复时间大约在40分钟左右。

所以我们在处理单一主机的一次测试,耗时至少在2个小时之内。按照上面假设的场景,一天测试下来,可能连一朵云的完整测试都无法完成。可能这里又有同学说了,你为什么不并发呀?这又引出了我们第三个痛点问题:成本。

痛点三、测试成本

之所以无法完全采用并发的原因,是受限于网络带宽因素。在内部研发环境中,我们的外网带宽只有40Mbps,在上述测试场景中,500G的数据在带宽充分利用的前提下,全量数据传输的时间在35小时左右。这无疑进一步扩大了一次测试的周期。

另外一点,源端这么多环境,如果再加上不同场景,需要占用的源端的计算和存储资源是海量的。随着产品不停地迭代,资源占用会越来越多。所以为了解决这一问题,我们决定采用部分公有云环境,来解决本地资源不足的问题。根据资源使用的特点,主要采用按量计费方式,实现成本最优。在实际测试过程中,主要产生的云资源包括:计算、块存储、对象存储、网络等。在自动化测试中,尽可能缩短资源周期,避免浪费,及时清理资源。另外,还需要对资源账单情况进行监控,避免资源残留。

需求分析

基本原则:不要重复制造轮子

进行自动化测试开发工作,并没有增加新的开发人员。开发工作主要由研发团队负责,测试团队作为使用方。但是由于开发团队有自身产品研发任务,所以为了避免对产品研发造成影响,制定的第一个原则就是不要重复制造轮子,尽可能复用现有技术积累和第三方组件,灵活的实现自动化测试的目标。

需求一、源端自动化创建与销毁

首先要解决的就是源端资源的灵活创建,而这方面最简单的就是利用Terraform,结合不同的模板实现源端资源创建和销毁能力。这样,我们至少拥有了阿里云、华为云、AWS、OpenStack、VMware五大云作为源端的能力。

第二个要解决的是代理方式自动化注册问题。源端主机需要进行Agent安装和注册后,才能被HyperBDR识别进行后续流程。根据操作系统不同,又分为Linux和Windows系统。Linux系统中,可以使用SSH登录系统后执行安装,而Windows则是利用WinRM方式进行Agent安装。

第三,可扩展性满足更多场景化需求。虽然Terraform本身提供了remote执行方式,但是为了后续的可扩展性,可以结合Ansible实现相关功能。未来的测试场景可能还包含对源端各种应用数据完整性的测试,此时在准备源端时还需要额外的准备应用和数据,使用Terraform结合Ansible,可以实现最大的灵活性。

需求二、测试场景与测试工具解耦,满足扩展性需求

简单来说,自动化测试程度越高,开发成本越高,后期维护的成本会更高。因此在规划自动化测试时,要降低测试场景和测试工具之间的耦合性。这样才能最大程度满足测试场景的可扩展性。换言之,测试场景是由测试工具进行灵活组合实现的,而二者之间的差距是通过各种配置文件进行融会贯通。

具体到HyperBDR的自动化测试规划中,我们将场景定义为:

  • 为了验证主线流程的稳定性,我们设计了这样的场景:阿里云的一台CentOS 7操作系统主机,容灾到阿里云对象存储中,利用该数据,主机可以正常启动,系统启动后,可以正常ping通IP地址,可以正常SSH到系统内部,写入一个文件
  • 为了验证华为云驱动的稳定性,我们设计的场景如下:将阿里云的N台主机(包含各个版本的操作系统),容灾到华为云的对象存储或块存储中,再将主机在华为云进行启动,启动后,利用ping通IP地址,可以正常登录系统,写入一个文件
  • 为了验证增量数据,我们设计的场景如下:将阿里云的N台主机安装数据库,并且构建一定量数据进行记录,容灾到华为云对象存储中,再将主机在华为云进行启动,启动后,除了常规验证外,还要对数据库是否可以访问以及数据记录条数进行比对

而测试工具提供的能力上,我们进行了这样的定义:

  • 源端创建/删除资源:完全由Terraform实现,但是为了后续程序更好的衔接,在产生主机后,自动产生一个conf文件,作为后续命令的输入,而主机内不同的应用则通过编写Ansible模板实现
  • 目标平台配置/数据同步/启动主机/清理资源:这几部分主要通过调用HyperBDR SDK实现,而具体的配置则在配置文件中进行修改,如果是不同场景时,只需要不同的配置文件即可实现

以上全部的步骤,均是可以单独执行的,而每一步完成后,写入统一的CSV文件,这样步骤在连接时可以通过该文件形成统一性。后续可以将该CSV文件直接推送到数据可视化工具中,形成趋势展现的效果。

需求三、实现场景自动化,测试失败及时通知

在实际应用中,几乎从研发到交付的整个过程中都需要使用该工具。比如研发同学在提交代码前,至少需要对基本流程进行一次测试;交付同事在搭建一些演示环境时,也可以利用该脚本提高效率;而测试同事更是对这个工具有强烈的需求。

那么真正的不同场景自动化工作,则是由Jenkins任务完成串联,并且在测试失败后,可以及时通知大家,尽快进行修改。例如:每个小时,做一次小的冒烟测试,确保主线流程是否稳定;每天凌晨,做一次基本冒烟,确保已经支持云平台的稳定性;每周做一次大冒烟,确保主要的操作系统版本的稳定性。这样不仅节约了人力资源,也能第一时间发现版本中的不稳定因素。

实现方式

整体架构

根据上面的需求,完整的工具包含两部分:

  • Terraform:主要包含了源端创建使用的模板以及ansible playbooks,Terraform在每次执行后,会自动产生源端主机列表,用于AutoTest工具的命令行输入参数
  • AutoTest工具:使用Python语言开发,主要通过对HyperBDR SDK调用控制HyperBDR实现自动化流程调度,各个阶段都是通过独立命令行进行控制,所有的可变部分在配置文件进行修改
  • AutoTest配置文件包含以下三部分配置:
  • 基本配置:HyperBDR SDK鉴权信息,以及平台整体配置
  • 目标云平台配置:目标云平台鉴权信息,配置参数等,根据不同的存储类型分为块存储和对象存储
  • 容灾/迁移配置:用于定义主机在目标端的启动参数

Terraform创建资源并远程执行指令

Terraform的使用方面,有很多教程,这里不再赘述。这里主要说明一些Terraform使用的一些细节功能,满足Terraform于AutoTest之间的脚本串联。

内置方法remote-exec

Terraform创建资源后,会自动安装Agent注册到HyperBDR中,为了减少远程主机操作复杂度,这里将Agent上传至新创建的主机,再进行安装实现自动注册。

Terraform本身通过provisioner提供远程连接、上传并执行的方式,基本结构如下:


                 

                 

如果是Windows,则连接方式为winrm方式,这里要注意的一点是,启动的资源必须已经开启了WinRM,否则无法使用该方式进行连接。一种开启WinRM方式是利用user-data方式。这里看一下具体的示例


                 

                 

与Ansible结合

直接利用Terraform的远程执行方式很简便,但是对于更多的复杂场景在支持上,并不够灵活,所以我们引入Ansible来加强我们对资源的控制。与remote-exec相对应的指令是local-exec,即通过执行本地的Ansible指令实现对远程资源的控制。目录结构如下:

1
2
3
4
.
├── main.tf
├── playbooks
│   └── apache-install.yml

我们将Ansible Playbooks存放在单独的目录中,Terraform中实现方式如下:


                 

                 

输出

为了串接Terraform和AutoTest,我们需要Terraform每次执行后,输出一个主机列表,包含了一些基本信息,当然这也可以作为Ansible Inventory文件使用。利用local_file resource,直接将我们想要写入的内容定向输出到文件中。具体实现如下:


                 

                 

Terraform本地缓存

由于众所周知的原因,Terraform在执行init命令的时候,会访问github,这就造成安装过程中有一定的失败概率,为了减少失败的风险,需要采用本地缓存的方式,避免访问网络造成的风险。先来看一下目录结构:


                 

                 

install.sh用于将下载好的terraform二进制包进行解压缩安装,同时会将plugins-cache拷贝至$HOME/.terraform.d目录,最后生成.terraformrc文件。

1
plugin_cache_dir = "$HOME/.terraform.d/plugins-cache"

在实际执行时,通过指定参数实现从本地执行安装,这种方式网上大部分文档都没有提及到:

1
terraform init -ignore-remote-version

在构建plugins-cache时,我们主要使用terraform providers mirror命令,例如:

1
terrform providers mirror /path/to/your/plugins-cache

为此我们在项目中增加了一个脚本,来自动化更新我们的缓存:


                 

                 

Taskflow串联执行流程,实现扩展性

在AutoTest工具开发过程中,我们主要复用了OpenStack部分Python模块简化开发,主要使用的模块为stevedore和taskflow,另外为了简化CSV文件操作,使用了pandas库来进行操作。

利用驱动方式扩展命令行

在setup.cfg中,我们定义了下面的驱动,每一个指令对应一个Taskflow的执行流程。

1
2
3
4
5
6
7
8
9
tasks =
  cloud_config_oss = autotest.tasks.cloud_config:CloudConfigOss
  cloud_config_block = autotest.tasks.cloud_config:CloudConfigBlock
  cloud_config_clean = autotest.tasks.cloud_config:CloudConfigClean
  data_sync_oss = autotest.tasks.data_sync:DataSyncOss
  data_sync_block = autotest.tasks.data_sync:DataSyncBlock
  host_boot = autotest.tasks.host_boot:HostBoot
  host_clean = autotest.tasks.host_clean:HostClean
  report = autotest.tasks.report:Report

在代码加载时,通过输入而不同参数,动态加载相应的流水线:


                 

                 

利用Taskflow串接流程

Taskflow是OpenStack中非常优秀的库,对Task执行过程进行了抽象后,方便上层上时序业务场景使用。所以在应用中为了简化开发过程,在Taskflow之上做了适当的抽象,将执行过程和执行内容进行分离,即基类中进行执行,而子类中只需要定义相关具体的任务即可。

基类代码示例如下:


                 

                 

一个具体的子类实现如下:


                 

                 

通过上述抽象,可以很快速的利用HyperBDR SDK实现各种应用场景,最大程度满足后续可扩展性的需求。

Jenkins串联自动化测试流程

工具实现后,不仅可以满足手工分步执行的需要,也可以利用Jenkins串接流程,满足场景自动化测试的需求。

场景自动化

我们在git中新建一个项目,名称为autotest-cases,用于自动化场景测试。示例结构如下:

1
2
3
4
5
.
├── Jenkinsfile
├── openstack_oss_qa_tiny_smoke
│   ├── hyperbdr.conf
│   └── terraform_templates

我们以场景名称命名目录,每一个目录下均有单独一套的terraform模板和hyperbdr配置文件。这样定义Jenkins任务时,就可以把测试场景作为一个目录,灵活的进行加载。

其中Jenkinsifle的基本结构为:


                 

                 

通过对每一阶段的定义,能够清晰的了解每一阶段执行的结果以及失败的原因,最终将结果发送至钉钉中,及时了解当前代码的稳定性。

异常处理

在整个自动化测试流程中,如果在中间任何一个步骤失败,都需要对资源进行及时清理,避免对下一次测试的影响。所以定义一个全局的失败,进行强制资源清理。


                 

                 

总结

目前,在HyperBDR的日常开发中,我们还在不断完善自动化测试的场景,但是经过这一轮的实现,让我对自动化测试有了全新的认知。

自动化测试能否实现全面覆盖呢?至少在HyperBDR中不行,因为HyperBDR的源端和目标端造成了测试场景的不可预期性,很难完全通过自动化脚本来模拟出复杂场景,特别是异常场景。例如:对源端主机内部的破坏性测试,对数据传输链路的一些攻击场景,需要配合监控才能发现是否满足预期。这些场景,利用自动化测试模拟开发代价太大,而且可能发生的场景还在不断变化,根本无法满足版本快速迭代的需求。当然你如果有一个几百人的研发团队,专门做这件事情,那另当别论,不过这样的投入产出比是否合理,值得探讨。

自动化测试中,哪些该”自动“,哪些该”手动“?在实现自动化测试过程中,不要盲目的追求”自动“。自动程度越高,开发成本越高,灵活性大打折扣,导致可利用的场景较少,这反而与预期相违背。以HyperBDR场景为例,倒不如将每个流程进行切分,实现局部自动化,实现多个工具形成工具集,再用流程串联方式构建场景化。

后续的计划有哪些?随着产品不停的迭代,自动化测试还将不断的扩展,除了支持代理方式,还会增加对无代理方式、块存储方式自动化的支持,但是这些的开发模式全部以上述框架为前提。上述测试主要还是针对接口的测试,对于前端的测试还将引入Selenium实现,实现的范围仍然以主线流程为主。最后,逐步丰富数据测试场景,增加对数据完整性的测试。

随着DevOps理念逐步改变传统研发流程,自动化测试作为其中的一环也是必不可少的,也是未来开发人员必备的技能之一。但是自动化测试不同于产品研发,要学会”断“的思想,理解测试的需求和场景,才能做出适配性最好的自动化测试工具。

相关实践学习
基于EBS部署高性能的MySQL服务
如果您通常是通过ECS实例部署MySQL来使用数据库服务,您可以参考本实验操作来搭建高性能的MySQL服务。本实验为您演示如何通过EBS ESSD云盘部署一个高性能的MySQL服务。
目录
相关文章
|
2天前
|
Cloud Native 关系型数据库 OLAP
云原生数据仓库产品使用合集之阿里云云原生数据仓库AnalyticDB PostgreSQL版的重分布时间主要取决的是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
1天前
|
敏捷开发 机器学习/深度学习 Java
Java中的异常处理机制深入理解与实践:持续集成在软件测试中的应用探索自动化测试在敏捷开发中的关键作用
【4月更文挑战第29天】在Java编程中,异常处理是一个重要的概念。它允许开发者在程序执行过程中遇到错误或异常情况时,能够捕获并处理这些异常,从而保证程序的稳定运行。本文将详细介绍Java中的异常处理机制,包括异常的分类、异常的处理方式以及自定义异常等内容。 【4月更文挑战第29天】 随着敏捷开发和DevOps文化的兴起,持续集成(CI)已成为现代软件开发周期中不可或缺的一环。本文将探讨持续集成在软件测试领域内的关键作用、实施策略以及面临的挑战。通过对自动化构建、测试用例管理、及时反馈等核心要素的详细分析,揭示持续集成如何提高软件质量和加速交付过程。 【4月更文挑战第29天】 在当今快速发
|
1天前
|
Cloud Native Devops 持续交付
构建未来应用:云原生架构在现代企业中的实践与挑战
【4月更文挑战第29天】 随着数字化转型的加速,企业正迅速转向云计算以支撑其业务敏捷性和创新。云原生技术,作为推动这一转型的关键因素,正在重新定义软件开发和运维模式。本文将深入探讨云原生架构的核心组件,包括容器化、微服务、持续集成/持续部署(CI/CD)以及DevOps文化,并分析这些技术如何帮助企业实现弹性、可扩展和高效的应用部署。同时,我们将讨论在采纳云原生实践中所面临的挑战,包括安全性、治理和人才缺口等问题。
|
2天前
|
Kubernetes Cloud Native 持续交付
构建未来:云原生架构在现代企业中的应用与实践
【4月更文挑战第29天】 随着数字化转型的浪潮席卷各行各业,企业对于信息技术基础设施的要求日益提高。传统的IT架构已难以满足快速迭代、灵活扩展和持续创新的需求。本文聚焦于云原生架构,一种为云计算环境量身打造的设计理念和技术集合,旨在帮助企业构建更加灵活、可靠和高效的系统。通过对云原生核心组件的解析、实施策略的探讨以及成功案例的分析,我们揭示了云原生架构如何助力企业在竞争激烈的市场中保持领先地位。
|
2天前
|
敏捷开发 设计模式 Devops
深入探索自动化测试框架的设计原则与实践
【4月更文挑战第29天】在追求软件开发效率和质量的当下,自动化测试成为确保软件可靠性的关键步骤。本文旨在剖析构建高效自动化测试框架的设计原则,并通过具体实例展示如何在实际项目中应用这些原则以提高测试效率和准确性。文章首先介绍了自动化测试的重要性及其对持续集成/持续部署(CI/CD)流程的贡献,随后详细探讨了模块化、可扩展性、易用性和可维护性四个核心设计原则。最后,通过一个案例研究,演示了如何将这些原则融入到自动化测试框架的构建中,以及实施后的效果评估。
10 1
|
2天前
|
Cloud Native 关系型数据库 MySQL
云原生数据仓库产品使用合集之在云数据仓库ADB中,GROUP BY操作中出现NULL值,如何解决
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
2天前
|
运维 负载均衡 Cloud Native
Serverless 应用引擎产品使用之在Serverless 应用引擎中,使用云原生网关的情况下,SLB(负载均衡器)和证书配置如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
9 1
|
2天前
|
运维 Cloud Native Serverless
Serverless 应用引擎产品使用之函数计算与云原生网关搭配在一起使用如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
10 1
|
4天前
|
jenkins 测试技术 持续交付
深入探索软件测试中的持续集成与自动化测试实践
【4月更文挑战第27天】 在当今软件开发的快速迭代过程中,持续集成(CI)和自动化测试已成为确保代码质量和加快交付速度的关键因素。本文将探讨如何通过实施持续集成流程,并结合自动化测试策略来优化软件测试工作。我们将分析持续集成的原理、自动化测试的最佳实践以及如何将这些方法应用于实际项目中,旨在为读者提供一套完整的解决方案,以提高软件项目的效率和质量。
11 3
|
4天前
|
Web App开发 IDE 测试技术
深入理解自动化测试框架Selenium的设计与实践
【4月更文挑战第27天】在软件开发周期中,确保代码质量和功能正确性至关重要。随着敏捷开发的普及和持续集成/持续部署(CI/CD)的实践,自动化测试已成为现代开发工作流程的核心部分。本文将探讨一个广泛使用的开源自动化测试工具——Selenium,并剖析其设计原理、架构以及在实际中的应用。我们将通过具体案例分析,展示如何有效利用Selenium进行跨浏览器测试,并讨论在真实环境中可能遇到的挑战及解决方案。