点击上方【蓝字】关注我们
总负责人:孙瑞琪
DataMesh是一款缓存中间件产品,它代理服务对Redis等缓存产品的请求。它可以解决Redis用量一直增多的现状下,客户端不一致运维效率低、PHP短链接性能差等问题,规范使用标准,并为应用服务使用缓存提供坚实的稳定性保障。
从上图可以看到,DataMesh是Sidecar部署的代理组件。应用服务的缓存读写都要经过DataMesh,业务上有强依赖性,这要求DataMesh自身服务等级需要足够高。所以,我们需要在协议、架构和产品功能等多个方面,保证中间件服务的稳定。DataMesh SLA的目标是至少达到99.999%
要提升服务等级,就需要根据架构特性分析潜在的稳定性隐患,再根据隐患场景,制定应对预案。
DataMesh逻辑架构上分三层
应用层为服务客户端入口
中间件层包括DataMesh本体和高可用相关组件
数据产品层即底层缓存产品
这里,我们根据每个模块的特点,思考下可能存在的隐患类型
应用层
应用层作为数据入口,访问异常会直接影响数据流量,而不同的客户端使用方式上会有巨大差异。
多接入语言(PHP,JAVA,GO),多种SDK(Jedis,Lettuce,Redission)
不同SDK访问协议上有差异,例如,默认连接池配置、建立连接后是否默认SELECT DB等等。
流量冲击,qps或大key突增打爆代理
除了客户端差异,还需要关注流量重启,防止redis被打爆,造成缓存雪崩、缓存击穿、缓存穿透等等
中间件层
中间件层的各个组件。datamesh相关的,包含daemonset、守护进程和代理进程三个;另外,还有datamesh依赖的第三方组件,如apoll、prometheus等等。各组件异常,都可能影响代理稳定和性能
1.代理异常,流量失败
例如,配置异常、启动失败、退出或无响应等,导致客户端无法访问
2.依赖的组件异常
这里是指依赖的公司内的其它系统,例如发布系统,配置中心等等。如果没有做好解耦,会极大影响服务等级
3.资源不足,代理性能差
或者影响服务资源
数据产品层
数据产品层作为数据底座,任何集群变更,或节点异常、网络延迟等等,会可能影响流量
1.主动运维(扩缩容、主从切换、slot迁移)
2.网络异常,单点网络延迟高、断开;集群网络不可访问
针对上面提到的稳定性隐患,我们设计了一系列架构模型,来解决各种异常。这里简单介绍一下DataMesh的高可用方案,方便理解可能出现的故障和解决措施
代理的停顿时间是直接影响服务等级的,所以需要有一定的自愈能力。
DaemonSet进程
Daemonset进程会初始化宿主机上的配置、执行文件,保证每个节点上都有datamesh配置
更新Mesh版本,会预更新daemonset,保证节点上版本号统一
新增Node节点,daemonset会预拉取mesh sidecar镜像,避免拉镜像延迟问题
Sidecar控制进程
对Mesh Proxy进程健康检查,进程异常会重启,检查心跳5s,出现异常的时候,可以立即重启恢复
父进程提供管控接口,管理container健康检查,做mesh proxy平滑升级等功能
前面提到,DataMesh是Sidecar结构部署,意味着每个服务节点上都会挂一个DataMesh Container。
但是,节点多带来的问题是,发布升级会相对复杂。
在3.1的部署架构里,我们提到,每个POD中的控制进程,都可以定位灰度配置,启动指定的版本。根据这个功能我们可以设计灵活的版本灰度
把版本灰度能力细化到服务之后,我们就可以圈定升级范围。第一步,灰度非核心服务,这个步骤会做热更新;验证没问题后,灰度部分核心应用;充分验证之后再做全量更新。
我们使用DataMesh的初衷,除了统一,还希望提升Redis稳定性。所以,DataMesh需要有应对各种Redis异常的能力。这个功能,不是架构优化能解决的,需要代理本身有恢复能力
DataMesh故障转移
这个能力,DataMesh依赖连接隔离实现。客户端对代理的连接和代理对Redis的连接隔离,当出现后端异常时,DataMesh可以重制命令队列,尝试更新Redis节点、更新拓扑,甚至更新Redis到新集群,当后端连接恢复后,重发命令。这样,就能做到不影响流量的情况下,做故障转移
要达到99.999%的SLA标准,
DataMesh还在持续迭代,所以针对高可用手段,要持续验证是不是能生效。为了保持长久而稳定的服务等级,需要模拟异常场景,并对特殊场景做定期演练验证
针对前面分析的隐患点,我们可以对各个模块,提出可能出现的异常假设,然后分析解决方案和验证方式
2.客户端连接数告警,超过阈值提示重启客户端 | |||
2.datamesh可配置大key日志,检测并拒绝超大key请求 | |||
2.容器状态下datamesh启动失败,会触发poststart检查失败,阻塞服务进程拉起,避免流量进入 | |||
2.启动失败会告警 3.运行状态下,流量不会受影响 | |||
2.回滚在lone上一键操作后重启服务 | |||
通过异常场景分析,我们将预防异常的加固手段分为三种:
回归测试属于版本验证的手段,它针对版本更新时,客户端和datamesh的兼容性问题,包括协议、配置、特殊命令、连接池等等。所以要在每次版本升级前进行
对于一些特殊的故障,往往需要运维人员人工干预来恢复。这些手段需要定期演练,这样才能确保出现线上问题的时候,我们的运维手段,能安全有效解决问题。
针对redis异常,或者redis变更的情况,验证datamesh异常恢复能力
服务稳定性建设,可以根据架构特性,提出极端异常场景的假设,这需要对整个链路足够熟悉;再根据这些假设提供解决思路和方案。
本篇文章基于DataMesh的部署特性,介绍了redis代理稳定性建设历程。实际落地过程中,经历了多次架构改进、问题修复,组件部署模式做了很多的选择与取舍。
Redis的稳定对服务非常重要,而DataMesh在保护redis访问链路的同时,维护自身稳定也相当关键,相对服务稳定性带来的收益,我们的投入绝对是值得的。随着业务规模不断增长,我们可能会遇到新的问题,稳定性也会有新的挑战需要我们攻克。
点个 在看 你最好看