断网演练中遇到的问题及总结

一、背景

        断网演练就是模拟单个数据中心完全不可用,但业务部门需要保证断网过程中的业务"零感知"。本次是我们系统参与的第六轮断网演练,在断网前,我们也做了充足的准备,如:域名分机房垂直部署,数据库与缓存是否存在跨机房连接,负载均衡检查等。

        虽然我们的应用都已经参与多轮演练,但在断网过程中,还是暴露了一些问题。下面对这些问题进行归类,并探讨下背后的原理,以及如何以最小的成本避免类似问题的再次出现。

二、遇到的问题

        首先对遇到的问题进行归类,大致可以分为以下几种:

        •核心jsf接口调用链路跨机房,涉及4个案例

        •域名机房未垂直部署/域名未手动断流量,涉及2个案例

        •redis读策略存在跨机房情况,涉及3个案例

        •数据库主库读写异常,涉及1个案例

        对于上述问题,有没有一套方法论,避免重复出现呢?当然,最行之有效的办法就是追根溯源,找到问题的本质,然后再谈解决方案。

三、问题总结

3.1 jsf接口调用链

        对于核心接口,接口稳定性非常重要,涉及到系统的架构分布式设计、缓存体系、异步处理、数据库设计、降级限流策略等方方面面。我们聚集一下,对于本次遇到问题的跟源,在于断网演练开始阶段,由于jsf接口部署的数据中心网络不通,jsf接口不可用,引起jsf接口连接超时,然而jsf本身的worker心跳检测是通过worker实现的,需要一定的时间周期,最终直接影响jsf接口的性能。

        下面给一张jsf注册中心的基础架构图。



        那么,面对此类问题如何解决呢?

        对于边缘业务/性能非敏感型接口,通过jsf自测的心跳更新即可解决;对于核心接口,在保证数据中心负载均衡的提前下,可通过别名同机房垂直化调用进行避免。

3.2 域名垂直化部署

        首先,我们了解一下网名访问店铺会经过哪些驿站。

        当C端消费者访问系统域名时,首先通过域名解析DNS,将客户端的访问引导到不同的VIP上去,这里DNS不仅实现域名到IP的映射,也通过DNS负载均衡实现不同客户访问不同的服务器。DNS作为第一级负载均衡,A记录对应着内部负载均衡的IP地址,通过内部负载均衡将请求分发到真实的Web服务器上。接着通过软件负载均衡如LVS/HAProxy,其中LVS支行在内核态,工作在第四层,它只负责请求包分发,抗负载能力强,性能是软件负载均衡中最高的,HAProxy支持七层规则 ,支持URL检测与sessioin的保持等。

        如下图,还存在端口集群映射,每个集群管理若干服务器ip(思考:这里集群管理的意义是什么?)。

        在断网期间,直接将入口机房进行断网,同时某个数据中心也是断网状态。当客户通过VIP访问到断网的服务器时,就会出现网络超时,链接不可用等情况,直接影响用户体验。

        那如何避免此类问题发生呢?简而言之:域名机房垂直部署。由于历史原因,有些域名的VIP并不是简单的指定机房VIP,同一个域名存在对外域名与内网域名,在断网期间是通过手动准备docker集群实现,如jshopx.jd.com, 有些链接是通过对外域名直接访问,还有一部分通过node请求,然后内网域名转化到后端服务器。即使非常熟悉该应用的研发,也会存在忽略切换集群中docker的状态。目前的解决方案如下:尽量保证域名机房垂直部署,对于同一应用映射的不同域名的VIP,尽量保证相同的集群映射规则,这样无论是在docker实例增删还是状态切换,同一应用最多操作一次即可。

3.3 redis读策略导致跨机房读

        在断网演练前,其实已经对redis的主从读写进行了跨数据中心的检查,即廊坊连接廊坊集群,汇天连接汇天集群,而且写库位于非断网的数据中心。然而在5分钟的断网演练过程中,还是出现了如下的错误:

        针对上述错误,首先检查了读的jimdb实例机房,发现是位于断网机房数据中心。原因也很简单:

        jimdb客户端的配置是m,so(m与s跨数据中心了),而读策略是轮流读取所有读取,具体的读策略含义如下:

读策略有以下几种:
默认:所有读命令默认读第一组,失败重试下一组
在读组中随机读取:随机挑一组,失败重试下一组
轮流读取所有读组:轮询所有配置的组,失败重试下一组

        这本身是一个很小的问题,只不过在大促与断网期间,研发都忽略了这个地方的检查,因此mark一下。

        对于以上问题,看似很小,彻底解决要真正落到实处,特别是每个研发兄弟身上,还需要继续努力。如何在大促/断网期间,投入更少的精力、更少的成本去解决类似问题,甚至前瞻性解决问题,是我们继续努力的方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值