作者介绍
李景康,2018 年加入去哪儿游览,测验开发工程师,担任酒店直连和世界酒店的测验作业。期间担任酒店环境 3.0 设计和实践,获得公司金项奖潜力奖,推进公司软路由推广。现在致力于进步测验环境的作业功率和用户体验。
一、背景
去哪儿游览非常重视测验环境治理,进步开发和测验人员的运用功率。从2018 年就开端了测验环境治理和优化之路,到现在为止总共进行了三轮环境治理和优化。
1. 测验环境1.0
环境 1.0 中运用的固定环境,总共有十台固定机器组成,每台机器布置全链路的环境,但随着事务不断发展,原有环境现已不能满足需求:
- 随着微服务越来越多,人工在 beta 机器上保护越来越难;
- 环境有限,经常出现环境争抢,导致环境运用功率低下。
2. 测验环境2.0
测验环境 2.0 运用了根底研制自研的 noah 环境管理体系(下面简称 Noah ),经过模板化处理测验环境微服务运用的管理问题。一切环境信息(运用装备,数据库,装备)都在模板中保护。
需求创立环境时,运用最新的模板数据构建全新环境:
- 创立环境速率的进步,从装备一套固定环境的几天到 noah 拉起一套酒店环境 30 分钟左右(整个环境约 200+ 服务(运用+数据库/ redis / es ));
- 随着环境交给速率进步,每个项目能够独自创立一套环境,削减环境争抢和搅扰现象。
3. 测验环境3.0
测验环境 2.0 在同规划环境管理/创立方面现已做到职业前列,在 2021 年进行环境功率了解,收集环境运用痛点问题,预备进行下一轮优化。
问题首要有:
- 排查问题很难,全链路的问题排查消耗时刻长;
- 测验环境机器服务简单宕机;
- 创立环境是不是能更快一点,等待时刻还是有点长。
将咱们运用遇到的痛点问题概括成三类问题(交给功率,根底可靠性,事务连通性):
二、环境 3.0 设计
1. 交给功率怎么进步
1.1 交给功率进步剖析
在环境 2.0 阶段,酒店同规划环境创立速率现已到达职业前列(200模块/30分钟交给)。
假如想进一步进步环境交给速率,有两种思路:
- 进步单个模块构建时刻;
- 下降模块规划。
第一个计划,和根底研制同学剖析一下,单个模块的时刻优化空间不大(投入时刻长收益较少),最终咱们挑选从第二个思路开端优化,是否能够下降单个环境的运用规划。
而在实践项目中,项目环境其实并不需求悉数模块,咱们能够让项目环境按需拉取所需求的模块即可,这种方法既能够下降全体创立时刻,也能够进步测验环境资源使用率。
1.2 软路由进步交给功率
这里需求介绍下软路由机制,软路由环境首要包含两部分:
- 基准环境, 基准环境是一套全链路的安稳环境,当线上代码发布的时候,基准环境代码也会同步更新;
- 软路由环境,软路由是咱们日常运用的项目环境。每个项目都只需求按需拉取自己运用的模块即可,缺省的模块会由基准环境的安稳服务代替,组成一套互不搅扰的软路由环境。
1.3 软路由的全体计划
软路由计划全体包含两大中心功用,环境绑定和流量分发:
1.3.1 环境绑定功用
环境运用者经过 Noah 环境绑定东西将 uid (去哪儿用户标识,下称 uid )和环境绑定,树立环境绑定联系并存储。绑定完环境后,恳求到网关(openresty)时读取环境绑定联系,将 uid 转换成环境标识,然后将环境标识植入 HTTP Header 中,方便后续的流量分发。
1.3.2 软路由环境的流量分发
流量分发中涉及 or/dubbo/qmq(去哪儿音讯中间件)三个中间件,首要分为服务感知和服务挑选两个步骤:
(1)服务的感知
中心思路是将环境信息一致上报,方便后续路由挑选。
Or:一切环境进口运用同一套域名(比方 ortest.qunar.com ),在环境创立/更新时新增/更新 对应的upstream。
Dubbo:运用一套 Zookeeper,保证软路由服务被及时发现,各软路由环境服务注册时带上环境标识。
Qmq:保证软路由服务被及时发现,各软路由环境 qmq 注册时带上环境标识。
(2)服务的挑选
中心思路是依据链路中环境标识,路由到软路由的服务,假如缺省则路由到基准环境。
Or:经过辨认恳求中的路由信息和域名中转发规则进行匹配,匹配成功转发到对应软路由环境。假如匹配不到则转发到基准环境。
Dubbo:依据链路中的软路由标识,和注册中心的环境标识做匹配挑选。假如能匹配上,则挑选对应环境 dubbo 服务。假如匹配不到对应环境则挑选基准环境的 dubbo 服务。
Qmq:依据音讯体中的软路由标识辨认,只消费软路由标识匹配上的音讯,假如软路由环境没消费则由基准消费。
除此之外还包含特别的数据存储部分。
(3)数据存储部分
软路由计划中数据存储部分没有运用数据流量路由机制,开发和保护本钱较高,而是运用较为成熟的物理阻隔计划,经过智能引荐战略将挑选的运用依靠的数据库和 redis 拉取出来,保证环境中所依靠的数据存储环境阻隔,进步环境的安稳性。
依据以上流程,需求对组件做一些改动,下面给咱们介绍下各个组件的改造计划。
1.4 中间件改造计划
1.4.1网关改造
网关阻隔运用的是逻辑阻隔计划,经过恳求中不同的路由标识来将恳求转发到不同环境。一起网关层作为流量的进口,还承当路由解析的功用。
第一步路由解析
用户经过 uid 来绑定不同环境,将其存储到 noah 体系并同步到 beta 网关体系。
当后续带着用户信息的恳求到网关(or/nginx)后经过 uid 解析出环境标识,然后将环境标识植入 HTTP Header 中,往下透传。
第二步 服务感知
软路由环境和基准环境共用同一套域名。当软路由环境创立成功时,Noah 在会在 or 上给对应域名添加软路由环境的 upstream(用于后续服务挑选)。
第三步 服务挑选
经过辨认恳求中的带着的环境标识,寻觅对应匹配的 upstream ,假如匹配成功则路由到对应软路由环境(比方图中 从 OR 进口路由到软路由 A1 模块)。
假如没有匹配上的阐明软路由环境没有对应模块(或许服务不行用),此刻则路由到基准环境(图中从软路由 A1 路由到基准环境 B 模块)。
1.4.2服务改造(dubbo)
服务阻隔的思维是经过标识 Provider 与 Consumer ,再经过自定义负载均衡算法,让 Consumer 调用指定的 Provider 服务,到达环境阻隔的效果。
第一步 服务感知在 Provider 注册时从 Noah(环境管理体系)获取当时环境标识,然后在 dubbo 服务注册时添加一个参数( routerId )用来标识当时环境。
第二步 服务路由,consumer 调用时依据链路中的环境标识 id 筛选出对应的 provider,假如匹配不上则默认调用基准环境 provider 。
1.4.3音讯改造(新 qmq )
第一步 服务感知
qmq consumer 端注册和上报环境标识,一起生成环境阻隔的 group 来订阅音讯。
第二步 服务的挑选
qmq provider 发送音讯时带着软路由标识,一起 qmq consumer 向 qmq server 发送拉取恳求时也带着软路由标识。
qmq server 处理拉取恳求时,依据拉取恳求带着的软路由标识和音讯带着的软路由标识来判断音讯是否要过滤掉。假如能匹配上则能够拉取到音讯,不能匹配则过滤音讯(如图中环境 A 匹配成功,能够拉取到音讯)。
1.4.4 存储阻隔
存储阻隔一直是环境阻隔的一个痛点问题,在环境 3.0 中依据事务线杂乱的存储依靠的状况开发了智能引荐计划,保证软路由环境链路完好且数据阻隔。智能数据引荐计区分为两个中心步骤,数据依靠感知和智能引荐。
第一步 数据依靠感知
运用服务会在代码中装备需求的数据库/redis 缓存的装备信息。Noah 会从发布体系获取运用和数据的依靠联系,并将数据依靠联系存储下来。
第二步 智能引荐
智能引荐经过剖析上面收集的数据依靠联系,拉取模块时将依靠的数据库/redis 和共用数据源(同一个数据写入和读取)的模块引荐出来,来保证软路由环境测验链路的完好性。
如下图,在创立模块 A1 的软路由环境时,首先会依据模块 A1 从依靠联系找到需求的数据库 A1 ,再经过数据库 A1 拉取共用数据源的模块(图中 B1,C1 ),一起再次触发引荐过程。
最终经过智能引荐战略拉取出右图的软路由环境,到达链路完好且数据阻隔的方针。
2. 测验环境安稳性
说到测验环境安稳性,大多数同学第一反应是测验环境不安稳,将问题具体分类,首要由以下原因形成:
- 测验环境布置的是开发中代码,代码的不安稳;
- 测验环境存在脏数据;
- 对测验环境的不重视,事务和中间件短少监控等;
- 测验的机器资源没法和线上对齐等要素运用过保机器,存在机器资源超售。
以上原因导致测验环境必定是不安稳的,但其中有两个问题是测验环境不安稳的本源:
- 从本钱角度动身,测验环境无法和线上对齐(机器资源,日志,监控无法和线上对齐);
- 测验环境里边有不安稳的代码。
第一个问题:根底可靠性,受制于本钱问题,测验环境无法享受线上服务的根底设施。只能在现有状况下,设计了基准环境保证计划进行可靠性的保证。
第二个问题:事务可靠性,咱们经过链路等级事务查看,及时发现环境中不安稳代码及时进行反馈和定位。
2.1 测验环境根底可靠性
根底可靠性分为两个部分,基准环境的可靠性和软路由环境的可靠性。
2.1.1 基准环境可靠性
基准环境是全模块的安稳环境,布置的最新的线上代码,理论上不会受到代码不安稳的搅扰,咱们期望他能够供给安稳的服务(方针 99%可用),在设计上会为基准环境供给额外的基准环境保证(基准环境保证计划)。
1. 硬件层面
多机布置:基准环境服务机器都运用多机布置,防止单点故障导致服务不行用。
禁用 debug :防止基准环境 debug ,导致基准环境不行用。
2. 软件层面(基准环境保证计划)
为了进步基准环境安稳性和下降环境保护本钱提出了环境保证计划,首要包含日常环境运用中最简单出现问题的三个部分,代码,装备,数据库。经过树立同步机制来进步基准环境安稳性。
代码同步
Noah 体系会一个小时同步这段时刻的线上发布到基准环境,经过基准环境特别的双机布置,保证基准链路不中断,布置完成触发事务查看,查看环境的链路可用性。并将同步和查看成果发送给环境管理员处理。
装备同步
Qconfig(去哪儿装备中心,下称 qconfig )同步战略,当时有两种计划:
(1)同步线上装备
第一种计划为同步线上装备,这样能够保证测验环境的装备和线上一致性,不再需求手动保护测验环境装备。但从安全的角度动身,这个计划可能带了体系层面的危险,比方 同步线上装备,可能会导致测验流量恳求到线上。
(2)同步测验环境装备
第二种计划为同步测验环境装备,将项目上线过程中预备的测验环境装备,同步到基准环境来运用,这个计划在安全性上有明显进步(测验环境装备一般认为是低危险,可重复运用)。但线上装备改变时,该计划就无法获取到最新的线上装备,在这种状况下 Noah 会告诉值班热线,需求人工判断和处理装备改变。
在权衡了安全和功率之后,最终咱们挑选了安全性更高的计划二,现在现已平稳运行一年。
数据库同步
酒店测验环境数据现在都是经过数据结构渠道结构出来并固化,但环境运用过程中,会碰到线上数据结构改变但测验环境没有同步改变导致测验环境不行用的状况。
为了处理这个问题,咱们在环境保证计划中加入数据库表结构同步,noah 收集重视数据库的线上改变状况,每个小时使用 DBA 同步东西 (同步表结构和调用安全服务数据会进行脱敏处理) 同步一次线上表结构。
并在同步完毕后触发环境事务查看,查看基准环境的可用性,并告诉环境管理员。
2.1.2 软路由环境可靠性
软路由环境中会布置不安稳的代码,天然会存在不安稳的要素,对环境的可靠性上要求并不像基准环境那么高。软路由环境的可靠性战略是主动发现和快速定位。
1. 软路由环境勘探
Noah 体系针对软路由环境开发环境勘探功用,经过勘探拜访运用和机器的运用/存活状况,将相关信息反馈给环境运用者,方便问题的发现和快速定位。
2. 软路由环境自愈
(1)容器化自愈:经过容器机自愈机制保证软路由服务的可用性。
(2)虚拟机检测&重启:对于虚拟机服务,合作软路由勘探机制,把不在线的服务主动重启,当重启失利后推送给环境管理员,进行进一步处理。
2.2 测验环境事务连通性
事务连通性是最接近环境运用层面的目标,怎么证明当时环境是否能让开发/测验同学上手开箱即用,各种杂乱运用之间的事务连通性是否正常。
2.2.1 软路由的事务连通性规模
1. 酒店事务线内部事务连通计划(多模板多基准)
依照事务来划定软路由不同模板,形成了多模板和多基准的状况,彼此之间经过软路由机制关联。
多模板多基准的事务连通性
– 场景一:跨模板联调
当两个模块中运用都有改动,且需求联调时,此刻会创立两个不同模板的软路由环境 如图中主流程环境A和酒店谈论环境 B ;
当用户一起绑定环境 A 和环境 B 时,后续用户恳求依据软路由标识机制转发到对应软路由模块(图中赤色链路,从图中 模块 D1 恳求到模块 J1 )。
– 场景二:单个模板内部联调
假如只要单个模板运用有改动,比方只修正模块 C 和模块 D ,创立主流程环境 A,当用户只绑定环境A时,后续用户恳求先沿赤色链路恳求到模块 D1 。
后续软路由标识无法和酒店谈论软路由环境匹配,会经过软路由机制将恳求转发到基准环境模块J(从软路由模块 D1 到基准环境 J )。
– 场景三:基准链路
当用户不绑定软路由环境时,用户恳求会走基准链路(图中黑色链路,从模块D 路由到模块 J )。
2. 跨事务线的事务连通计划
事务线内是由不同范畴的模板/基准环境组成,而到了事务线外部则是依照不同事务线来区分(事务线一致对外供给的对外的基准 OR 域名/ DUBBO 服务/ QMQ 服务)。
跨事务线的事务连通性一般有如下两种场景:
– 场景一:跨事务线联调
双方都有改动,由酒店软路由环境调用其他事务线软路由环境(如图中赤色链路)。当用户一起绑定酒店环境A和服务环境 C 时,后续用户恳求会转发到对应的软路由环境(服务环境 C )。假如不匹配时则转发到基准环境。
– 场景二:酒店事务线内部联调
当只要酒店事务线有改动时,对应的恳求拜访时会调用其他事务线的基准环境(如图中绿色链路)。
2.2.2 怎么检测事务连通性(侦查体系)
为了检测事务场景连通性,咱们开发了事务查看东西-侦查体系。
侦查体系从事务场景动身,一个事务场景中包含事务链路上不同模块的测验用例,下面咱们以报价页面展现的事务举例。
一个报价页面的展现事务,包含三个事务处理层的测验用例(每个事务层包含若干运用),只要当此事务场景中一切测验用例经过才代表该事务场景查看经过。
当事务场景不经过期,能够经过事务查看成果快速定位问题,定位到对应的模块和接口,一起能够用 qtrace 排查问题。
现在事务查看现已掩盖固化数据 99% 事务场景( 300+ 事务测验用例),掩盖酒店一切中心主流程。
经过三种方法触发环境事务查看来查看环境可靠性(现在每天执行约 1800 次),在环境不行用时,侦查体系能够帮助开发/测验同学来快速定位环境问题(从本来约 30 分钟下降到 30 s)。
2.2.3 什么时候检测事务连通性
事务查看首要经过三种方法触发查看,首要为守时任务查看,继续集成 触发查看,环境改变触发。其中守时任务查看更重视基准环境,而 cicd 触发查看更重视于软路由环境(项目环境)。
1. 守时查看
基准环境 高频率查看(1分钟/次),假如未经过 ,经过电话告诉 QA 值班热线处理。
软路由环境 全量环境一个小时查看一次(项目环境首要靠流水线触发),假如未经过项目群告诉对应开发/测验同学,能够依据事务查看成果排查和处理。
2. 继续集成( CICD )触发
现在将继续集成和事务查看起来,在项目分支上,每次有代码提交,把项目分支最新代码布置到软路由环境上,并且跑一遍链路等级的查看,保证项目新代码不影响环境运用。
3. 环境创立/改变触发
当环境创立/改变时,不管运用/数据库/网络改变时,都会在完毕后触发事务查看。
保证环境改变事务连通性仍然正常,能够正常交给运用。
三、环境 3.0 目标
1. 交给功率
经过软路由机制,智能拉取改动的模块,下降环境全体交给时刻。
现在环境 3.0 模块数比照环境 2.0 均匀模块数下降 90%(从均匀 200 个模块到现在均匀 10 个模块), 环境创立时刻也随之下降(环境创立时刻削减70% )。
环境创立时刻削减 70%
2. 事务查看经过率进步
2.1 保护中心环境数量改变,快速定位处理
从本来 60+ 独立环境到现在一个中心基准环境,环境保护的同学能够供给更及时和可靠的环境支撑,快速处理事务连通性问题。
2.2 事务查看主动发现和定位问题
经过多种事务查看触发途径(守时/ cicd /环境改变),触发事务查看,主动发现环境中问题并反馈给环境保护者进行处理。
3. 环境保护本钱下降
4. 环境资源本钱下降
四、未来和展望
4.1 环境4.0 (PROD TO BETA)
测验环境 4.0 中,在之前根底上,树立更丰厚的同步机制和事务查看机制,让测验环境更好用 一起也更好保护。
4.1.1测验环境同步机制智能化和全面化,进步环境事务连通性,下降环境保护本钱
1. 运用层面
- 运用主动同步(运用装备,机器装备等);
- 代码主动同步;
- 环境自愈机制进一步完善。
2. 数据层面
- 数据库数据同步(数据会进行安全脱敏);
- 缓存数据同步(数据会进行安全脱敏)。
3. 根底设施层面
- 装备主动同步;
- 网关主动同步。
4.1.2. 事务查看全面主动化,事务掩盖率进步
- 主动录制和回放 case ,进步事务掩盖度;
- 事务查看失利原因智能剖析和事务场景自愈。
4.2 环境5.0(Test in Production)
环境 4.0 让测验环境更好用(PROD to BETA),让测验环境更接近线上环境。从而到达进步环境运用功率的目的。
而环境 5.0 中则是进行 Test in Production 的进一步探索,将原有的酒店仿真环境(逻辑阻隔,但受限于资源本钱只要一套)使用云技能和软路由技能进行拓展。
经过软路由的逻辑阻隔计划,让仿真环境人手一套(比方图中的环境 A 和环境 B ),真正做到Test in Production 。