系统高可用架构-基于健康检查的高级应用场景

背景说明:

当前大部分系统都配置了两个或者两个以上的实例负载,但是单其中一个负载出现问题的时候,会导致这个集群出现故障,无法正常使用。必须要人工介入找出存在问题的容器,并剔除处集群才能使业务恢复正常。这导致我们面临3个问题点。

  1. 需要人工介入,但是维护人员并不是时刻都有操作条件
  2. 需要一个个负载进行测试才能找出问题实例
  3. 需要对负载实例剔除出集群,才能够使得集群恢复正常

改进方案

  • 核心操作:启动cce容器引擎的健康检查功能,定时对容器的的状态进行检查。当检查到存在问题时,由容器引擎自动介入处理。
  • 功能说明:cce的健康检查包含了两个功能—工作负载存活探针、工作负载业务探针
  • 工作负载存活探针:是利用定时任务,对容器层服务端口或者接口地址进行探测(一般推荐对服务端口进行探测)。当请求响应超时并超过一定次数后容器引擎判定改容器存在故障,自动对容器进行重启。(注意:存活探针并不能完整的反馈应用的状态,存在应用出现故障的时候容器仍在是正常,导致功能失效。并且总部对容器重启有流程限制,所以该功能暂不启用,在这里主要是给大家做功能说明。)
  • 工作负载业务探针:是利用定时任务,对容器内应用层面的服务端口或者是接口地址进行探测(一般是推荐对业务接口进行探测)。当请求响应超时并超过一定次数后容器引擎判断业务负载出现了问题,自动对容器剔除出负载集群,避免单个负载影响整个集群。(注意:业务探针,一般是需要结合具体的业务接口进行检查,才能保障探测的完成准确。但是业务出现故障存在多种可能性,例如mysql性能故障导致响应缓慢,或者瞬间并发过大使得应用响应缓慢,导致探针判断失误。并把应用剔除出集群导致的集群雪崩问题。)

改进步骤

前置说明

对于健康检查而言,只需要确保相关探测接口能够进行响应即可,具体返回什么数据并不重要。之所以有下列的返回规范要求是因为通过接口获取当前应用的版本号和应用启动时间信息。可以将该场景获取到的数据与ITSM发版流程相结合起来,实现发版申请流程与实际发版情况的快速与自动合规校验,提高分部流程性工作的指标合格率。

1、应用改造:研发侧执行

简要描述
  • 应用状态检查接口
    请求URL

    可按照实际情况自由定义路径

  • http://xx.com/api/common/version
请求方式
  • Get(权限说明:接口无需鉴权,直接访问)

返回参数获取说明

  1、appVersion

  String appVersion = System.getenv("appVersion");

  2appStartDate

  应用在启动时通过代码生成一个全生命周期的时间常量,格式为:%Y-%M-%d hh:mm:ss

  在接口请求时通过读取该常量,进行返回。

  RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();

  Date appStartDate = new Date(bean.getStartTime());

  //格式yyyy-mm-dd HH:mm:ss

  DateUtil.formatDateTime(appStartDate)

返回示例

 {

   "appVersion": "v1.0",

   "appStartDate" "2021-01-20 18:30:00"

 }

返回参数说明
参数名 类型 说明
appVersion String 镜像版本号(默认为:appVersion)
appStartDate String 实例创建时间(默认为:appStartDate)

2、部署任务环境变量配置:运维侧执行
1、系统版本号说明:获取系统发版时的版本号信息并在部署任务中配置为环境变量,供应用获取。

3、部署任务配置健康检查:运维侧执行

实际接口调用展示

健康检查测试方案基本思路讲解

  • 通过对容器实例kill的操作,并不能触发健康检查机制,验证应用是否实现高可用。
  • 因此我们对一套系统的测试环境,另外设计了一个GET请求的接口,该接口主要的作用是控制健康检查接口的返回时间。
  • 例如:健康检查的机制是接口超过3秒不进行返回,就认为实例存在故障,我们通过控制检查的接口等待4秒在进行返回,这样就完成了手动的触发生效。下面为控制接口请求示例:
  • https://XXXXX-sit-ms.sf-express.com/api/version/getSystemStatus2?sleepSecond=4

其它高级功能拓展说明

1、使用深圳分部提供的技术方案进行健康检查配置和改造。深圳分部将会自动将其纳入监控范围,确保应用高可用,保障运维研发部门能够比用户提前知悉系统存在故障,并进行处理。

2、基于本健康检查改造,你可以根据接口返回的版本信息和版本发布时间与ITSM的版本发布流程进行对接,实现版本发版合规的自动化校验与审批确认。由于本技术文档主要是针对应用高可用,在此不进行详细展开。

其它知识拓展

  • 在我们的日常运维中,其实还存在着一个需求:就是希望不用一步步的进入cce,工作负载的页面操作。就可以直接获取到当前提供服务的是那个实例。例如:后端应用存在A,B两个实例,当我通过浏览器访问的时候。是否能够直接获取到当前提供服务的是A实例,还是B实例?如果是B实例,那么B现在在集群的那个节点上,节点IP是什么,B的实例名称是什么?
  • 原生的K8S,通过DownwardAPI可以实现上述需求。具体的事项方式为:配置POD的yaml文件

    不过遗憾的是华为云目前暂时不支持该配置,即使直接通过ymal手动配置,也会被流水线发版覆盖,导致配置失效。

本文系作者 @ 原创发布在 维简网。未经许可,禁止转载。

喜欢()
评论 (0)

请登录以参与评论。

现在登录…
热门搜索
10 文章
0 评论
4 喜欢
Top