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

解Bug之路主从切换未成功?

  解Bug之路-主从切换"未成功"?前言
  数据库主从切换是个非常有意思的话题。能够稳定的处理主从切换是保证业务连续性的必要条件。今天笔者就来讲讲主从切换过程中一个小小的问题。
  故障场景
  最近线上进行主从切换,大部分应用都切过去了,但是某些应用的连接确还在老的主(新的从)上面。
  这让对应应用的开发百思不得其解,于是求助了笔者一探究竟。
  怎么发现的
  应用开发收到Cat监控告警,发现这个应用(A)中的请求在好几台机器中一直稳定失败。联想到昨晚刚做过数据库主从切换演练,于是上机器netstat -anp下,发现机器一直连的是旧的从库!netstat -anp | grep 1521
  tcp 0 0 1.2.3.4:54100 1.1.1.1:1521 ESTABLISHED
  开发感觉肯定是主从没有切换过去导致请求失败。乍一看,好像非常有道理的样子。
  着手调查
  神马情况?距离切换成功已经8个小时了,为什么连接还连在上面呢?于是笔者ping了下对应数据库的域名:ping db.prd
  64byres from db.prd (2.2.2.2): icmp_seq=1 ttl=64 time=0.02ms
  好奇怪,DNS已经切换过去了。应用怎么还连到老库呢?
  第一个猜想,DNS延迟
  最先想到的是主从切换到DNS反应过来有延迟。例如主从切换完,DNS在2min后才能生效,所以在此期间新建的连接还是到从库。
  这种情况很正常,对于这种情况需要DBA将旧主的连接全都杀掉即可。咨询了下DBA,他们反馈他们已经把连接全部杀掉了。而且当场给我看了下数据库的统计连接SQL,确实没有对应机器的连接。这就奇怪了,应用机器上的连接是ESTABLISHED状态啊!
  应用大部分机器都连的是老库!
  这时候,开发向笔者反应,这个应用对应的大部分机器都是连的老库!如果是DNS延迟,不可能这么巧吧,40多台呢!
  而且这些机器的DNS都是指向新库的。
  DB没有kill连接?
  难道是DBA漏了kill连接的步骤?但是和他和我展示的DB统计信息矛盾啊。于是笔者让DBA在对应老库的机器上netstat了一把。发现,连接还真的存在!netstat -anp | grep 1.2.3.4
  tcp 0 0 1.1.1.1:1521 1.2.3.4:54100 ESTABLISHED
  难道统计信息真的有问题?
  获取连接创建时间
  为了验证笔者对于DNS延迟的猜想,就通过一些技巧来获取这个连接的创建时间。首先
  netstat -anp | grep 1.2.3.4找出来这个连接。由于明显是属于应用java进程的,所以
  直接找到进程pid:8299netstat -anp | grep 1521
  tcp 0 0 1.2.3.4:54100 1.1.1.1:1521 ESTABLISHED
  netstat -anp | grep java
  abc 8299 java
  既然有了进程pid,我们直接cat /proc/8299/net/tcp,直接获取到其所有的连接信息,然后在其中grep 1521的16进制05F1(当前机器上1521的连接只有一个)...... local_address rem_address inode ......
  ...... xxx:D345 xxx:05F1 23456789 ......
  找到这个socket(1.2.3.4:54100<->1.1.1.1:1521)对应的inode号。有了这个inode号就简单了,我们直接ls -all -h /proc/8299/fd | grep 23456789 (inode号)
  ...... Jan 29 17:43 222 -> socket:[23456789]
  这么一看,这个连接是1月29日创建的。但是主从切换的时间点确是3月19日,这个连接已经建了2个月了!那么就不可能是笔者所说的DNS失效问题了。因为连接就没有重连过。
  DB都重启了,怎么还有旧的连接保持?
  看到这个连接创建时间,笔者第一反应,DBA确定杀连接了吗?问了下DBA有没有可能是统计问题。DBA听了后,告诉笔者,他们都重启过数据库了,怎么可能还有连接存在呢?看了下DB进程的创建时间。ps -eo lstart,cmd | grep db进程名
  Mar 19 17:52:32 2021 db进程名
  从进程启动时间来看,真的是在3月19日启动的。而这个诡异的连接还确实属于这个3月19日启动的进程。这个怎么看逻辑上都不通啊。
  但是,既然linux的统计信息在这(还是要先暂时认为是靠谱的),那肯定是又有什么其它的诡异逻辑在里面了。
  子进程继承了父进程的连接
  稍微思考了一会,笔者就找到了一种可能。父进程先新建了连接进行处理,在创建子进程fork的时候,子进程会继承父进程的连接,这时候父进程退出,只保留子进程的话。就会出现连接在进程启动之前就已经存在的诡异现象。
  为了验证这个问题,笔者自己写了段简单的C程序,执行了一下确实如此。代码例子为:main.c
  ......
  int main(int argc,char* argv[]){
  ......
  if((client_fd = accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size)) == -1){
  printf("accept error! ");
  }
  printf("Received a connection  ");
  // 制造两分钟延迟,以造成上面的现象
  sleep(2 * 60);
  if(!fork){
  // 子进程保持
  while(1){
  sleep(100000);
  }
  }else{
  // 父进程关闭连接
  close(client_fd);
  }
  return 0;
  }
  问了下DBA,他们不会kill -9所有进程,都是按照标准的数据库重启流程来操作的。kill -9所有进程的同时并关闭这些进程所拥有的连接。
  如果我们使用的商业数据库用了上图的机制,那就会造成前面的现象。但是由于DB本身保持的session都已经没了,那么这个连接在数据库维度肯定是已经gg了(这也是数据库统计不出来的原因)。既然还保留在上面,这个连接肯定再也没有处理过请求!不然肯定出错了。
  业务代码逻辑
  如果按照上面的论断的话,那么没有执行过请求,也就不会有报错喽?如果按照这个逻辑的话,那岂不是只有出现业务报错的才会有新的正常连接。笔者去报错的机器看了下,既然报错了,那肯定是执行过SQL了,然后触发Druid丢弃连接再新建连接。果然,一直报错的机器上连接都连到新库了(但应用开发发现其它机器还是连到老库,所以找到了我求助),而且创建时间是3月29日,而不报错的应用的连接挂在老库上面,挑了几台看一下,这些挂在老库的连接依旧是1月29日创建的。
  但为什么还在报错?
  既然连接都正常了(到新库了),为何还在报错呢?难道说业务代码写的有问题,一旦报错,就永远错下去?于是笔者直接翻起了应用的源码。其使用这个数据库的连接用来获取(sequence)序列号。然后细细分析了源码后发现。其在数据库报错之后没有处理好,走了一个有问题的代码分支,导致永远不会再从数据库获取sequence(业务代码就不放上来了)。
  为什么只有几台机器报错?
  因为这个序列号是取一段很大的范围到机器的内存中使用的,不耗尽之前不会执行SQL。所以只有一些内存中序列耗尽的机器才会运行到那一段有问题的代码分支。
  为什么心跳没有检测出来?
  到这里大家可能会疑问?没有心跳检测么?确实没有,应用采用的是Druid数据源,而他们使用的那个版本的Druid是没有定时心跳检测的。
  主从切换到底有没有成功呢?
  主从切换当然是成功的。这从其它的应用切过去之后运行良好可以判断出来。主从切换当中的数据库流量损失是我们可预期的正常现象。但是,数据库切换完之后,应用确恢复不回来,那就要仔细看看应用代码本身有什么问题了。
  总结
  数据库主从切换是个频繁而又重要的动作,是保证业务连续性的必要条件。这不仅要看DBA的努力,还需要我们在应用层写出健壮的代码,才能够让我们的产线更加稳定。

麻雀的家究竟在哪里?你飞向了雪山之巅我留在你回忆里面你成仙我替你留守人间麻雀也有明天创作歌手李荣浩的麻雀相信很多年轻朋友都不陌生,那么麻雀这种城市中随处可见的鸟类,就无论你是不是歌迷,都不陌生了。一年典赞2020科普中国十大科学传播人物揭晓2月4日,由中国科协人民日报社中央广播电视总台共同主办的,科普中国2020年度科普推选活动揭晓盛典特别节目在中央电视台科教频道播出,现场揭晓了2020年度十大科学传播人物。十大科学水银血压计被淘汰是因为测量不准?实为环保要求流言水银血压计被淘汰是因为测量不准2020年公布的国家药监局综合司关于履行有关事项的通知要求2026年1月1日开始,我国全面禁止生产含汞(水银)的血压计和体温计。同时,2020年国血脂升高一定要吃药治疗?不同人群并不一样,应科学应对流言想必很多人身边都有那么几个三高人群,很多人认为,只要血脂升高了,就必须吃药治疗。真相解读想必很多人身边都有那么几个三高人群,很多人认为,只要血脂升高了,就必须吃药治疗。果真如此在医院测量的血压比家里准?其实是受这些因素的干扰和影响流言在医院测量的血压比家里准许多高血压患者发现,在家自测的血压总和医院测量的不太一样,并且认为医院里测的血压一定比家里准。真相解读实际上,在家自测的血压的确会和医院不太一样,但这并无蔗糖饮料等于无糖饮料?蜂蜜也属于添加糖的一种流言前一阵,关于无糖气泡水是智商税吗的话题在网上引起了热议,再次引起了人们对无糖饮料的各种争议。有的人认为,无糖饮料减少了糖的摄入,同时也减少了热量的摄入,对控制体重是有帮助的。并蜂蜜水可以解酒?解酒效果甚微流言无酒不成席,节日的气氛可以因为酒而被烘托得更有味儿,但是喝酒之后的不适感也是实实在在的。有说法称,蜂蜜水可以解酒。真相解读过量饮酒会引起身体的不适。其中,某些人在喝完酒后会面部一个人过年,为什么要有仪式感?图虫创意作者唐义诚中科普心理健康促进中心今年,注定又是难忘的一年。由于新冠疫情,全国29个省区市先后提出就地过年的倡议。突然拥有一个全靠自己的春节,相信很多小伙伴都在发愁,这个年要无淀粉火腿里的瘦肉更多吗?香肠火腿,对于吃货们来说简直就是难以抗拒的美食。在购买香肠的时候,有的人关心品牌,有的人关心口味,还有的人关心含肉量。吃香肠看到肉确实是件让人兴奋的事情,所以,为了让人们觉得火腿里搪瓷和陶瓷你分清了吗?在我们的日常生活当中,经常会看到使用陶瓷制作成的物品,例如餐具茶具等。而细心的人可能会发现,还有一种瓷在我们的生活中也非常常见,那就是搪瓷。目前,市面上的搪瓷制品越来越少,许多九五有机蔬菜是否更有营养?蔬菜是家家户户一日三餐都不可或缺的食物,虽然萝卜白菜各有所爱,但是我们每天都离不开它们。无论是在接地气的菜市场,还是高级超市里,琳琅满目的蔬菜都占据着重要的一席之地。近些年来,在超
孕期妈妈怎样饮食,生出来宝宝皮肤白里透红?每个婴儿都是美丽的,没有人能忽视这些小天使散发出来的甜美的美。然而,婴儿的长相取决于父母的长相,因为婴儿继承了父母的大部分身体特征。那么你一定想知道在怀孕期间该怎么做才能有一个漂亮孕期吃叶酸好还是复合维生素好?叶酸你吃对了吗?复合维生素是指多种维生素,可以补充人体消耗的维生素,相对食补直接服用复合维生素会更加快的补充,也更加直接可以更快的吸收。然而维生素在怀孕的时候,也是必不可少的需要补充。怀孕初期吃叶高龄怀孕有哪些风险?高龄孕妇也能生出健康宝宝在产科术语中,高龄孕妇指的是35岁或以上的准妈妈。随着二胎的开放,高龄产妇高龄妊娠,高龄孕妇被越来越多的提及。很多女性很怕这个词汇,一方面提醒你,你已经35岁了,已经属于高龄了,现高糖孕妇生下的孩子健康吗?有糖尿病的孕妇,可分为两种第一种是怀孕之前就有糖尿病,这种情况是有遗传性的。其中1型糖尿病的遗传几率为14(25岁之前生孩子遗传性高,25岁之后有所降低),2型糖尿病遗传给孩子的几厨房这些家居设计,过于鸡肋,真想拆掉重装厨房作为每个家庭一日三餐的区域,它的设计规划可谓是重中之重,但使用时间久了,才发现这些厨房的家具设计过于鸡肋,不利于家人使用,搞得真想拆掉,去重装一次!厨房吊柜过高厨房吊柜做得过高屋主选择美式简约,打造出一个极度舒适的家,太整洁了本期,要分享的精选案例是来自蔷薇馥郁的家,美式简约的装修风格,打造出一个极度舒适干净的居家环境,整个室内看不到一粒灰尘。每天清晨起床拉开窗帘的一瞬间,窗外的微风缓缓吹进客厅,白纱在新房装修,最值得投入的2个区域,一定要根据家人的需求进行设计最近很多朋友问我,新房装修,投入哪些地方更加划算?下面就给大家分享2个我个人觉得,最值得投入的两大区域,根据家人的使用习惯进行设计能有效地提升居家幸福感。入户设计注意实用性1入户口房子住久了才发现,这些看似高大上的家居设计,实际用起来超鸡肋房子住得越久,就会发现在居家生活中有些东西看似很高大上,实际用起来就很鸡肋,后悔当初在装修时,10头牛都拉不回倔强的家居设计!下面总结4点在装修过程中很容易变鸡肋的家居细节,希望大看似高大上的4件家居用品,现实却让你交了智商税别跟风现在很多年轻人新房一装修入住,就想着买一大堆的家居用品回家,最初的想法是提升家人的生活质量,可最后才发现自己心心念念的宝贝买回家没用几次就被闲置了,主要是还占空间,扔了又觉得可惜,业主坚持砸掉客餐厅隔断墙,小半年过去,越住越舒适秋天不邀而来,喜欢在秋日里多喝蜂蜜水,润肺养颜。烧水壶设定好选项,很快就能烧到我想要的温度,泡茶泡蜂蜜顺手拈来,不用久等,让喝水保持暖暖的节奏。喝口蜂蜜水,感受一下甜蜜的温度,告诉入住小半年才发现,卧室这些家居设计,看着高大上,实际很不合理新房入住小半年才发现,现在家居生活中这些东西看起来很高大上,可使用时间久了就显得很鸡肋,甚至觉得是不合理的设计,后悔自己当初的盲目跟风和装修过程中没有谨慎考虑!下面给大家总结,我家