范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

分库分表中间件的高可用实践

  分库分表中间件的高可用实践前言
  分库分表中间件在我们一年多的锤炼下,基本解决了可用性和高性能的问题(只能说基本,肯定还有隐藏的坑要填),问题自然而然的就聚焦于高可用。本文就阐述了我们在这方面做出的一些工作。
  哪些高可用的问题
  作为一个无状态的中间件,高可用问题并没有那么困难。但是尽量减少不可用期间的流量损失,还是需要一定的工作的。这些流量损失主要分布在:(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也可能是后端关闭了这个连接,并不代表整体不可用),如下图所示:
  一个请求使用若干个连接导致的问题
  由于我们需要保证事务尽可能小,所以在一个请求里面多条sql并不使用同一个连接。在非事务(auto-commit)情况下,运行多少条sql就从连接池里面取出多少连接,并放回。保证事务小是非常重要的,但是这在中间件宕机的时候会导致一些问题,如下图所示:
  如上图所示,在故障发现窗口期中(即还没有确定某台中间件不可用时),数据源是随机选择连接的。而这个连接就有一定1/N(N为中间件个数)的概率命中不可用中间件导致一条sql失败进而导致整个请求失败。我们做一个计算:假设N为8,一个请求有20条sql,
  那么在这个期间每个请求失败的概率就为(1-(7/8)的20次方)=0.93,
  即有93%的概率会失败!
  更为甚者,整个应用集群都会经历这个阶段,即每台应用都有93%的概率失败。一台中间件宕机导致整个服务在十几秒内基本所有请求基本都失败,这是不可忍受的。
  采用sticky数据源解决问题
  由于我们不能瞬间发现并确认中间件不可用,所以这个故障发现窗口肯定存在(当然,错误计数法会在很大程度上缩短发现时间)。但理想状况下,宕机一台,只损失1/N的流量就好了。我们采用了sticky数据源解决了这个问题,使得在概率上大致只损失1/N的流量,如下图所示:
  而配合错误计数的话,总流量的损失会更小(因为故障窗口短)
  如上图所示,只有在故障时间内随机选择到中间件2(不可用)的请求才会失败,再让我们看下整个应用集群的情况。
  只有sticky到中间件2的请求流量才有损失,由于是随机选择,所以这个流量的损失应用在1/N。
  中间件升级发布过程中的高可用
  分库分表中间件的升级发布不可避免。例如bug fix以及新功能添加等都需要重启中间件。而重启的时间也会导致不可用,与物理机宕机的情况相比是其不可用的时间点是可知的,重启的动作也是可控的,那么我们就可以利用这些信息去做到流量的平滑无损。
  让client端感知即将下线
  在笔者所知的很多做法中,让client端感知下线是引入一个第三方协调者(例如zookeeper/etcd)。而我们并不想引入第三方的组件去做这个操作,因为这又会引入zookeeper的高可用问题,而且会让client端的配置更加复杂。平滑无损的大致思路(状态机)如下图所示:
  让心跳流量感知下线而正常流量保持
  我们可以复用之前client端检测不可用的逻辑,即让心跳的新建连接失败,而正常请求的新建连接成功。这样,client端就会认为Server不可用,而在内部剔除调这个server。由于我们只是模拟不可用,所以已经建立的连接和正常新建的连接(非心跳)都是正常可用的,如下图所示:
  心跳连接的创建在server端可以通过其第一条执行的是mysql的ping而正常流量第一条执行的是一条sql来区分(当然我们采用的Druid连接池在新建连接成功以后也会ping一下,所以采用了另一种方式区分,这个细节在这里就不阐述了)。
  三次心跳失败后,client端判定Server1失败,需要将连接到server1的连接销毁。其思路是,业务层用完连接返回连接池的时候,直接给close掉(当然这个是简单的描述,实际操作到Druid数据源也是有细微的差别的)。
  由于配置了一个connection最长保持时间,所以在这个时间之后肯定会对Server1的连接数为0
  由于线上流量也不低,这个收敛时间是比较快的(进一步的做法,其实是主动去销毁,不过我们尚未做这个操作)。
  如何判定下线Server再也没有流量
  在上述小心翼翼的操作之后,在Server1下线的过程中,是不会有流量损失的。但是我们在Server端还需要判定何时不会再有新的流量,这个判定标准即是Server1没有任何一个client端的连接。
  这也是上面我们在执行完sql后销毁连接从而可以让连接数变为0的原因,如下图所示:
  当连接数为0后,我们就可以重新发布Server1(分库分表中间件)了。对于这一点,我们写了个脚本,其伪代码如下所示:while(true){
  count =`netstat -anp | grep port | grep ESTABLISHED | wc -l`
  if(0 == count){
  // 流量已经为0,关掉服务器
  kill Server
  // 发布升级服务器
  public Server
  break
  }else{
  Sleep(30s)
  }
  }
  将这个脚本接入发布平台,即可进行滚动式上下线了。现在可以解释下recover_time为何要较长了,因为新建连接也会导致脚本计算出来的 connection count数量增加,所以需要一个时间窗口不去建立心跳,从而能让这个脚本顺利运行。
  recover_time其实是非必要的
  如果我们将心跳创建的端口号和正常流量的端口号分开,是不需要recover_time的,如下图所示:
  采用这种方案的话,会在很大程度上降低我们client端代码的复杂度。
  但是这样无疑又给client端增加了一个新的配置,对使用人员就又多了一个负担,还得在网络上多一次开墙的操作,所以我们采取了recover_time的方案。
  中间件的启动顺序问题
  前面的过程是一个优雅下线的过程,但我们发现我们的中间件才上线的时候在某些情况下也不会优雅。即在中间件启动时候,如果对后端数据库刚建立的连接建立上去后由于某些原因断开了,会导致中间件的reactor线程卡住一分钟左右,这段时间无法服务,造成流量损失。所以我们在后端数据库连接全部创建成功后,再启动reactor的accept线程从而接收新的流量,从而解决这一问题,如下图所示:
  总结
  笔者个人感觉高可用比高性能还要复杂。因为高性能可以在线下反复的去压测,通过压测的数据去分析瓶颈,提高性能。而高可用需要应付线上各种千奇百怪的现象,本篇博客讲述的高可用方案只是我们工作的一小部分,还有很大一部分精力是处理中间件本身的问题上。但只要不放过任何一个点,将问题都能够分析清楚并解决,就会让系统越来越好。

一个自闭症人士的自述在我看来的高功能自闭症冒着向听众中那些神经正常的人不属于自闭症谱系的人解释这些显而易见的事实的风险,我知道我不能代表每一个自闭症患者。我只能说说我作为一个在半乡村环境的赫特福德郡长大的男孩的三十多岁的经吴君如为残疾人发声输在起跑线上的孩子,凭这点拿冠军人人都在讲赢在起跑线,但这是一对母子输在起跑线的真实故事。嗨脑仁说起吴君如,想必7080后的爸妈并不陌生。从1983年出道至今,她做过主持拍过电影演过电视剧,从女版周星驰逆袭成影后美国夫妻生了5个自闭症孩子,是障碍还是残疾?这些学者坐不住了当很多家庭都因为有一个自闭症孩子而焦头烂额的时候,美国巴尔的摩的Julie和JoeGreenan夫妻的焦头烂额却是其他人的5倍。这对恩爱夫妻,有5个孩子,全部被诊断有自闭症。自闭症民间有温情,嗨小保助力爱心人士关爱自闭症群体自闭症孩子,无论出现在哪个家庭,都会让这个家庭心力交瘁。主要原因在于,前来说自闭症患者需要很长时间都引导干预治疗,还要细心关照,陪同等,需要耗费大量的时间和精力但正是因为这样,他们嗨小保助力爱心传递,共同帮助自闭症患者说到自闭症,仿佛是越来越高频地听到,但又感觉离我很远的一个词。只是没有想到,它却改变了我的生活。孤独症又称自闭症,是一种发育障碍类疾病,患者主要表现为社交障碍沟通困难重复性行为行为南京知名动物园亏损3000万!背后却是对动物最大的尊重与爱护它是一个鲜活的生命,我们应该善待它,不是矫情,就是你应该对它负责南京百兽之王沈志军动物园,大家都是去过的。各种飞禽走兽,逛一圈下来,兴奋之余还有点兴致缺缺,可能是四方的牢笼让动物失这几种妈妈不能做养育一个孩子,往往是投入了妈妈所有的心血的。多年的付出,妈妈也希望孩子能够体贴亲近和孝顺自己。可是,孩子有多孝顺妈妈,和妈妈付出多少爱并不成正比。妈妈正确的养育方式,才能养出懂得感妈妈,你是虫子妈妈,你是虫子。晚上大宝突然对我说。嗯?我怎么变成虫子了呢?我一惊,问到。因为妈妈老爱看手机,所以妈妈变成手机虫了!大宝笑着说。前几天陪大宝看书的时候,给她说她是书虫,因为她爱看书当两个黑人孩子喊着妈妈向我跑来,我前天中午,大宝和小宝在卧室里玩耍。看他们在一起玩的很开心,我就到客厅忙自己的事情了。许久都没听到他们吵闹,觉得有种难得的轻松。没想到,真的应了那句话事出反常必有妖。不一会儿,只见两宝贝,对不起,妈妈不应该把你一人抛下宝贝,妈妈想向你说声对不起!妈妈不应该把你一人抛下,自己离开!宝贝,妈妈不应该在你东西被人拿去觉得自己受了委屈的时候不去理解你,反而认为是你在无理取闹!妈妈应该在第一时间,现在你的采访了30位自闭症孤独症妈妈后,我们发现了一个秘密2020年,已经进入了尾声。每一年,似乎都是和年龄和时间和成长的一场竞赛。对于很多孤独症的家庭来说,这种和时间赛跑的感觉,尤为强烈,也更为不易。在06岁的黄金干预期,闭娃的父母们从
孩子也有烦恼,他们撕心裂肺的心声你敢听吗?不要怀疑孩子也有烦恼,他们撕心裂肺的心声你敢听吗?你是不是有什么想说的呢?孩子青春期总会觉得父母不爱自己,而父母相反会觉得我如此爱你,你却不知好歹!从此二者就杠上了,双方交战拉开帷河北一幼儿园这老师太狠了,差点把孩子踹飞,孩子嘴巴鲜血直流我们的祖国是花园,花园的花朵真鲜艳。美妙的歌声加上孩子的笑脸,你会觉得这就是最美的诗篇!都说孩子是祖国的花朵,可当看到幼儿园幼儿虐童事件不断发酵,令众人毛骨悚然,脊背发凉!如果持续9岁男孩动情演唱我只是个孩子引人深思,请用心爱护你的孩子作者淘淘米我只是个孩子其实是一个9岁男孩在网上刷屏过的一首歌,很多孩子的心声都被唱在了里边,说实话听完之后,很是同情现在的孩子们,心里酸溜溜的!因为他唱的正是很多孩子想说的话,而很选择剖腹产,我从没后悔过20年10月份是怀孕最后一个月,因为早期3个月经历过保胎,所以我一直以为宝宝会早产,等了一个多月,期间经历过见红,假性宫缩,但到了预产期还是没发动,医生给我检查了宫颈成熟度,观察我让孩子打回去的是士气,并非良策作者(淘淘米的小窝)喜欢写作育儿相关内容,来看我也许你我志同道合,在成长之路上一同前行!在童话里,孩子都被当作礼物!由天使送到每个人的门口!他们都是父母的掌中之宝!在我们的生活里,成长如此美妙(68岁)书单郊外游玩拍的野草断断续续整理书单,越整理越发现更多好书好的书籍的确能够吸引孩子,并且当你时常手捧书看,或者经常有感情的朗读,孩子耳濡目染,也会觉得阅读这是一件很平常很自然的事。今天请别让攀比心,毁了孩子的将来不要和别人攀比,你的生活应该有你自己的精彩!育儿事务所最近追剧小舍得,剧情真实而接地气!其中蒋欣扮演的田雨岚一角让很多人恼火,强大的虚荣心和攀比心一览无遗!就在一次家宴上,唯成绩论看到北大学霸弑母被执死刑,才知道生活中教育孩子成人重于成才很多时候人品与学历无关素质与财富无关心灵与外貌无关吴谢宇一审被判死刑孩子从呱呱坠地开始,作为父母我们更应该清楚,教养孩子长大成人永远是我们不可推卸的责任!作为父母,我们该如何做到尊提升逻辑思维(下)关于逻辑思维方面的书籍,我们昨天讲了第一阶初识逻辑思维和第二阶建立你的思维框架,今天咱们接着来第三阶和第四阶。第三阶将思维运用到做事中去第一本高效能阅读一本讲述阅读技巧的书,帮助新暑假旅行,如何带娃一起做方案计划,体验和写作能力双丰收沉浸式体验胡桃夹子暑假到了,估计很多家长和孩子也都蠢蠢欲动打算要外出了,尽管疫情阶段,但有的低风险地区仍然值得一去。因为旅行,我回顾了下我们的一些经历,感觉有的点是可以让孩子获得特提升逻辑思维(上)看到一句特别实在的话有时候,你光有实力没有运气,或者光有运气又没有足够的实力都不行。这个世界上远没有一种终极智慧能够解决所有问题,因此我们要学会建立自己的多元思维体系。查理芒格说我