Bootstrap

揭秘环境管理 Noah 的技术实现

作者简介

曹飞广

2019年3月加入Qunar,Java开发工程师,目前主要负责公司环境构建治理平台Noah开发维护。技术方面,除广泛接触学习各领域知识外,追求代码干净利落,认为标准化与工程化是衡量开发质量的重要标准,并努力实践中。

武凯亮

2018年加入去哪儿,担任基础平台开发工程师,主要负责Noah环境管理平台开发、移动端发布平台后端开发等工作。在测试环境治理方面积累了一些经验,个人平常对分布式领域相关知识及容器化比较感兴趣。

邹晟

2017年加入去哪儿,工程效率组 devops 工程师, 负责 CI/CD 工具链的运维与优化、Noah iaas 层的维护与部分开发工作。技术方面一直关注混沌工程、容器化、与云原生等技术方向。

李鹏程

专注于软件工程,DevOps解决方案工程师,在项目域,开发域,测试自动化,测试集成以及工具系统研发方面拥有超过10年的实践经验,成功帮助央企、航空、地产、制造业、电信等行业头部客户实现研发效能提升,落地DevOps。经常参与社区活动并协助新技术的推广和培训活动,是一名敏捷变革的爱好者和践行者。擅长Devops落地及培训。

1. Noah 是什么

Noah 是一个测试环境治理平台,它以 infrastructure as code 为设计理念,通过用户自定义的可描述的环境模版快速构建和交付所需要的测试环境。它解决了DEV、QA 搭建和维护测试环境困难的痛点,为研发效率的提升起到了保驾护航的作用。

2. Noah 产生的背景

2014 年正是 Qunar 业务发展的高峰期,每天产出大量需求、需要迅速响应、快速迭代,涉及5000多次的部署、发布、上线操作。当时测试环境的搭建和维护成本是非常高的,严重阻碍了产品迭代速度。与 QA 同学沟通后发现测试环境成为瓶颈的主要原因有以下几点:

3. Noah 是如何解决环境难题的

论环境问题的时候,环境具体是什么呢?让我们重新梳理一下环境的定义,通常来说,环境是指可以运行业务应用的一个小生态集合。在 Qunar 环境一般是由 http 代理、应用、中间件、缓存和数据库五大部分组成,环境中主要是以应用为中心来构建的,通过仔细的梳理,它的画像大概是这样的:

基于上述对环境的理解,Noah 的产品设计的才更加简单、接地气。Noah 平台具有下面几个特点:

  • 操作简单

用户可以一键构建所需的测试环境,无需人工干预。

  • 即建即销

通过环境模版化配置,可以保证每次新建的测试环境是一致的,这样用户只需要真正使用测试环境的时候再去创建,既节省了资源又能保证测试环境的准确性。

  • 快速交付

为了实现快速交付,我们在资源层和流程上做了优化:

  • 环境自治

 为了减少用户的维护成本,目前 Noah 实现了以下几个自治手段:

  • 测试的资源成本低

Noah 通过实现服务的软路由 (外界也称这种方式为泳道环境),可以用少量的计算资源就可以完成测试。每个业务线会维护一套稳定的公共基准环境,当有新的需求时,只需要部署需要交付的应用即可。

下面让我们从 Noah 的流程设计和系统架构来认识一下 Noah。

4. Noah 环境构建流程设计

Noah 中把一个环境的整个构建流程抽象为一个 workflow, 包括资源锁定、资源交付、网络初始化、环境验证4个阶段。每个阶段中又拆分为多个任务,这些任务最后抽象成一个 DAG 图,它的流程如下所示:

5. Noah 的系统架构图

在这个架构中,环境编排引擎是整个 Noah 最核心的部分, 它的底层实现是参考了 k8s CRD 的实现,把整个环境作为一个任务来进行编排,环境中的各个组件的交付都是通过状态机来驱动的。

为了让大家更深入的了解 Noah,下面我们从软路由、基准库、KVM 资源池化、中间件管理这4个核心功能为大家讲解。

6. Noah 核心功能 — 软路由

6.1 背景

Noah环境现在已经覆盖大部分业务线,业务线同学使用业务线模版生成多套环境以达到环境间相互隔离的目的。然而此种使用方式存在两个主要问题:

为了解决上述问题,Noah 通过软路由方案重用 App, 从而实现服务级虚拟化。

6.2 软路由方案设计

在上面的软路由环境中,研发人员只需要关心新的特性分支即可。

6.3 实现原理

通过改造中间件、dubbo、qmq、Openesty、nginx 等组件,在请求中追加一个环境 id, 这样请求路由到组件或者应用的时候会根据环境 id 选择下游服务器地址,如果没有找到对应的环境 id, 请求自动转发到基准环境的服务。

6.4 软路由的流程

6.5 软路由排障工具

软路由方案节省了成本,但是也带来了排查问题的复杂度提升,为了帮助 DEV、QA人员快速定位问题,我们的 TC 同学提供了 trace 可视化工具,通过它我们可以看到每个请求的链路,如果某个请求异常中断,在这个 trace 图中也会一眼看出来。

7. Noah 核心功能 — 基准库

7.1 背景

为了帮助 QA 解决测试环境搭建测试数据库 (mysql) 步骤繁多(申请机器、安装 mysql、开通权限、线上同步数据、数据清洗等)、测试数据维护困难的痛点,Noah 开发了基准库,可以自动的帮用户完成这些操作。

7.2 我们的方案

通过对线上的库创建一个基准库、并实时同步线上的表结构变更,定时同步线上的数据。

每当新建测试库时都会从基准库创建测试库,这个过程中我们也支持用户自定义数据,比如通过 sql 脚本在创建的时候自动执行。

7.3 测试数据的备份

在测试库使用过程中,测试数据的重要性是不言而喻的,因为它不容易复现的。因此我们对每一个测试库默认做了数据备份,由于数据量巨大,所以我们把这部分数据保存在了 MFS 存储上,并且成本非常低。当数据异常丢失或者宿主挂掉无法恢复时,我们就可以新建一个测试库,并从 MFS 中的备份文件恢复数据。

8. 数据库容器化

8.1 数据库容器化的背景

8.2 容器化后的效果

8.3 mysql 容器的调度方案

9. Noah 核心功能 — KVM 资源池化

9.1 背景

KVM 资源池化技术是为了解决在大批量环境构建时虚拟机的创建速度跟不上的问题,资源池采用了空间换时间的方式来解决这个问题。

9.2 资源池方案流程

9.3 具体流程如下图

上图中涉及了 KVM 的两级调度:

我们具体看下这两级调度时如何工作的。

一级调度:OpenStack 创建 KVM 时的调度是:

具体过程如下:

二级调度:Noah 在创建环境时,环境中的机器会尽量分布在不同的机器上,这里采用的是类似轮训的算法,具体过程:

经过上面的资源调度后,一个环境的 KVM 资源是均匀分布在所有的宿主机上,这样的好处是降低了宿主机故障时的影响范围。

10. Noah 核心功能 — 中间件管理

Noah 环境中我们提供了 tomcat 、es 、mq 、 jdk 等软件的安装,并支持用户自定义软件。这些功能是用的 ops 提供的 salt 来统一管理配置的,它的特点是速度快,灵活、配置简单。

11. Noah 未来方向与思考