魔卡动漫网,总裁别再玩了,品匠
分库分表中间件的高可用实践 前言
分库分表中间件在我们一年多的锤炼下,根基解决了可用性和高性能的问题(只能说根基,一定还有隐藏的坑要填),问题天然而然的就聚焦于高可用。本文就阐述了我们在这方面做出的一些工作。
哪些高可用的问题
作为一个无状态的中间件,高可用问题并没有那么难题。然则尽量削减弗成用期间的流量丧失,照样必要肯定的工作的。这些流量丧失主要分布在:
(1)某台中间件地点的物理机倏忽宕机。(2)中间件的升级和发布。
由于我们的中间件是作为内容库的代理供应给应用的,即应用把我们的中间件当做内容库,如下图所示:
所以显现上述问题后,买卖上很难通过重试等操纵去屏蔽这些影响。这就势必须要我们在底层做一些操纵,可以自动的感知中间件的状态从而有效避免流量的丧失。
中间件地点物理机宕机的环境
物理机宕机其实是一种常见现象,这时候应用一刹时就没了响应。那么跑在上面的sql一定也是失败了的(准确来说是未知状态,除非重新查询后端内容库,应用无法得知准确的状态)。这部门流量我们一定是无法拯救。我们所做的是在client端(Druid内容源)可以快速的发现并剔除宕机的中间件节点。
发现并剔除弗成用节点 通过心跳去发现弗成用节点
天然而然的我们通过心跳来探查后端中间件的存活状态。我们通过定时建立一个新毗邻ping(mysql的ping)一下然后立马关闭来做心跳(这种做法便于我们区分正常流量和心跳流量,如果通过连结一个毗邻然后一直发送类似select ‘1’的sql这种方式的话区分流量会稍微麻烦点)。
为了防止收集抖动造成的偶发性connect失败,我们在三次connect都失败后才鉴定某台中间件处于弗成用状态。而这三次的探活却延长了错误感知时间,所以我们三次connect的时间距离是指数级衰减的,如下图所示:
为何不在第一次connect失败后,一连发送两次connect呢?可能思量到收集的抖动可能会有一个时间窗口,如果在时间窗口内一连发了3次,出了这个时间窗口收集又okay了,那么会错误的发现后端某节点弗成用了,所以我们就做了指数级衰减的折衷。
通过错误计数去发现弗成用节点
上述的心跳感知始终有一个时间窗口,当流量很大的时候,在这个时间窗口内使用这个弗成用节点的都会失败,所以我们能够使用错误计数去辅助弗成用节点的感知(当然这个手段的实现还在规划中)。
这边有一个注意的点是,只能通过建立毗邻异常来计数,并不克通过read timeout之类的来较量。原因是,read timeout异常可能是慢sql或者后端内容库的问题导致,只有建立毗邻异常才气确定是中间件的问题(connection closed也可能是后端关闭了这个毗邻,并不代表团体弗成用),如下图所示:
本文地址:http://www.reviewcode.cn/bianchengyuyan/211697.html 转载请注明出处!