安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

故障分析数据库故障MHA未切换

1月21日 九阙忬投稿
  作者:张洛丹
  原爱可生DBA团队成员,现陆金所DBA团队成员,对技术执著有追求!
  本文来源:原创投稿
  爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。背景
  某天晚上,数据库hang住,现象是:应用报错org。apache。commons。dbcp。SQLNestedException:Cannotgetaconnection,poolerrorTimeoutwaitingforidleobject无法登录,输入登录命令就卡着不动,无法响应
  无奈之下通过强制kill掉进程,重启数据库恢复。
  这里暂且不说hang住的原因,仅分析数据库hang住,但是MHA未触发切换。结论
  先说下结论,MHA默认使用长连接对数据库做ping健康检测(执行select1asValue),4次无法连接MySQL则触发切换。前面数据库hang住只是新的连接无法建立,但是老连接却没有影响,且MHA的健康检测语句很简单,只在server层进行了检测,不涉及到InnoDB层,所以MHA认为MySQL是健康的,并没有作出任何决策。解决
  MHA从0。53版本开始支持pingtype参数设置如何检查master的可用性。支持3个value:select:使用长连接连接到MySQL执行select1asValue,这个长连接被重复使用,但检查过于简单,无法发现更多故障。connect:在每次执行select1asValue前后创建和断开连接,可以发现更多TCP连接级别的故障。
  注意:此种情况,MHA监控进程会fork出一个子进程进行检测insert:基于一个到MySQL已经存在的连接执行insert语句,可以更好检测到数据库因磁盘空间耗尽或磁盘IO资源耗尽导致的故障。
  通过将pingtype修改设置为connect,MHA每次进程状态检测,需要新建连接,新链接无法成功建立,就触发了切换。
  三种检测机制代码:如果获取分布式锁失败返回2,正常返回0,异常返回1subpingconnect(){mylogself{logger};myrc1;mymaxretries2;eval{mypingstart〔gettimeofday〕;连接maxretries次,连接失败则退出while(!self{dbh}maxretries){eval{rcselfconnect(1,self{interval},0,0,1);};if(!self{dbh}){dieif(!maxretries);}}调用pingselectrcselfpingselect();Toholdadvisorylockforsomeperiodsoftimeselfsleepuntil(pingstart,self{interval}1。5);selfdisconnectif();};if(){mymsgGoterroronMySQLconnectping:;msg。DBI::errif(DBI::err);msg。(DBI::errstr)if(DBI::errstr);logwarning(msg)if(log);rc1;}return2if(self{alreadymonitored});}正常返回0,异常返回1subpingselect(){mylogself{logger};mydbhself{dbh};my(query,sth,href);eval{dbh{RaiseError}1;sthdbhprepare(SELECT1AsValue);sthexecute();if(!defined(href)!defined(href{Value})href{Value}!1){}};if(){mymsgGoterroronMySQLselectping:;msg。DBI::errif(DBI::err);msg。(DBI::errstr)if(DBI::errstr);logwarning(msg)if(log);return1;}return0;}正常返回0,异常返回1subpinginsert(){mylogself{logger};mydbhself{dbh};my(query,sth,href);eval{dbh{RaiseError}1;dbhdo(CREATEDATABASEIFNOTEXISTSinfra);dbhdo(CREATETABLEIFNOTEXISTSinfra。chkmasterha(keytinyintNOTNULLprimarykey,valint(10)unsignedNOTNULLDEFAULT0));dbhdo(INSERTINTOinfra。chkmasterhavalues(1,unixtimestamp())ONDUPLICATEKEYUPDATEvalunixtimestamp());};if(){mymsgGoterroronMySQLinsertping:;msg。DBI::errif(DBI::err);msg。(DBI::errstr)if(DBI::errstr);logwarning(msg)if(log);return1;}return0;}测试
  MHA配置文件〔serverdefault〕managerlogDatamhalogworkdirmy3306tst。logmanagerworkdirDatamhaworkdirmy3306tstremoteworkdirDatamysqlmy3306mhamasterbinlogdirDatamysqlmy3306logpasswordxxxpinginterval5replpasswordxxxrepluserxxxsshusermysqlsshportxxxusermhamasteriponlinechangescriptusrlocalbinmasteriponlinechangemasteripfailoverscriptmasteripfailover〔server1〕hostnamexxxport3306candidatemaster1〔server2〕hostnamexxxport3306candidatemaster1
  注意:在测试的时候将pinginterval设置成5,便于快速观测到切换,实际生产中,可根据业务对故障的容忍能力进行调整。
  模拟服务器CPU满负载,数据库无法建立新连接编写一个简单的c程序,如下:includestdio。hintmain(){while(1);return0;}
  编译:gccoouttestcpu。c
  执行:forininseq1(catproccpuinfogrepphysicalidwcl);do。outdone
  另外再跑两个mysqlslap压测程序:mysqlslapc30000i100detach1queryselect1uxxxpxxxSxxxxxxx。sockpingtypeconnect时,4次连接失败触发切换此时,在MHA切换日志中可以看到连接数据库报错的输出如下:GoterroronMySQLconnect:2013(LostconnectiontoMySQLserveratwaitingforinitialcommunicationpacket,systemerror:110)pingtypeselect时,未触发切换
  有兴趣的同学可自行测试一下MHA健康检测机制
  调用链路:MasterMonitor。pmMHA::MasterMonitor::main()MasterMonitor。pmMHA::MasterMonitor::waituntilmasterisdead()MasterMonitor。pmMHA::MasterMonitor::waituntilmasterisunreachable()MHA::HealthCheck::waituntilunreachable();HealthCheck。pmMHA::HealthCheck::pingselect(或者)HealthCheck。pmMHA::HealthCheck::pinginsert(或者)HealthCheck。pmMHA::HealthCheck::pingconnect(或者)
  MHA监控进程启动后,会持续监控主节点的状态,主要的健康检测函数是waituntilunreachable()。
  PS:MHA监控进程启动过程中,会读取配置文件,对配置文件中的服务器进行一系列检查,包括存活状态、版本信息、从库配置(readonly,relaylogpurge,logbin,复制过滤等),ssh状态等,若检查不通过,则无法启动
  在这个函数中会有一个死循环,持续地进行健康检测
  1。首先,测试连接,连接正确返回0,否则返回1。如果连接MySQL成功,则获取分布式锁,如果获取分布式锁失败,返回状态值为1如果连接MySQL失败,则返回状态值1和连接失败的报错,对于连接失败的下面几种情况(常见的有1040连接数满和1045权限拒绝)MHA会认为MySQL进程是正常的,并不会触发切换,而是一直进行连接检测ourALIVEERRORCODES(1040,ERCONCOUNTERROR1042,ERBADHOSTERROR1043,ERHANDSHAKEERROR1044,ERDBACCESSDENIEDERROR1045,ERACCESSDENIEDERROR1129,ERHOSTISBLOCKED1130,ERHOSTNOTPRIVILEGED1203,ERTOOMANYUSERCONNECTIONS1226,ERUSERLIMITREACHED1251,ERNOTSUPPORTEDAUTHMODE1275,ERSERVERISINSECUREAUTHMODE);
  2。测试连接成功后,则进行健康状态检测(前面说的3种方式);如果连续4次连接失败,则在第4次的时候会使用第二脚本进行检测(如果定义了的话),如果检测通过,则认为master挂掉
  关键函数waituntilunreachable()代码:mainfunctionsubwaituntilunreachable(){mylogself{logger};mysshreachable2;myerrorcount0;mymasterisdown0;eval{while(1){self{tstart}〔gettimeofday〕;判断是否需要建立连接if(self{needreconnect}){my(rc,mysqlerr)selfconnect(undef,undef,undef,undef,undef,errorcount);if(rc){if(mysqlerr){错误代码在ALIVEERRORCODES中时,不触发切换,常见的有用户密码不正确,不会切换if(grep(mysqlerr,MHA::ManagerConst::ALIVEERRORCODES)0){loginfo(GotMySQLerrormysqlerr,butthisisnotaMySQLcrash。Continuehealthcheck。。);next直接进入下次循环selfsleepuntil();}}logwarning(Connectionfailederrorcounttime(s)。。);selfhandlefailing();if(errorcount4){sshreachableselfissshreachable();返回1表示主库down,0表示主库没有downmasterisdown1if(selfissecondarydown());主库down则跳出循环lastif(masterisdown);errorcount0;}selfsleepuntil();}connectionokself{needreconnect}0;loginfo(Ping(self{pingtype})succeeded,waitinguntilMySQLdoesntrespond。。);}如果pingtype为connect,则断开连接selfdisconnectif()if(self{pingtype}eqMHA::ManagerConst::PINGTYPECONNECT);Parentprocessforksonechildprocess。ThechildprocessqueriesfromMySQLeveryintervalseconds。Thechildprocessmayhangonexecutingqueries。DBD::mysql4。022orearlierdoesnothaveanoptiontosetreadtimeout,executingqueriesmighttakeforever。Toavoidthis,theparentprocesskillsthechildprocessifitwontexitwithinintervalseconds。eval{调用检测函数if(self{pingtype}eqMHA::ManagerConst::PINGTYPECONNECT){childexitcodeselfforkexec(sub{selfpingconnect()},MySQLPing(self{pingtype}));}elsif(self{pingtype}eqMHA::ManagerConst::PINGTYPESELECT){childexitcodeselfforkexec(sub{selfpingselect()},MySQLPing(self{pingtype}));}elsif(self{pingtype}eqMHA::ManagerConst::PINGTYPEINSERT){childexitcodeselfforkexec(sub{selfpinginsert()},MySQLPing(self{pingtype}));}else{dieNotsupportedpingtype!;}};if(){mymsgUnexpectederrorheppenedwhenpinging!;logerror(msg);childexitcode1;}if(childexitcode0){pingokping成功的话,则更新状态,并将计数器置为0selfupdatestatusok();if(errorcount0){errorcount0;}selfkillseccheck();selfkillsshcheck();}elsif(childexitcode2){self{alreadymonitored}1;}else{创建连接失败self{needreconnect}1;selfhandlefailing();}selfsleepuntil();}logwarning(Masterisnotreachablefromhealthchecker!);};if(){mymsgGoterrorwhenmonitoringmaster:;logwarning(msg);return2if(self{alreadymonitored});return1;}return1unless(masterisdown);return(0,sshreachable);}1;
投诉 评论 转载

沃派电子拼接屏要如何选购?我们在选择拼接屏的时候,要考虑拼接屏使用在什么地方,功能和配置方面是否符合自己购买拼接屏的需求,以及选择拼接屏的尺寸和质量问题等等,结合实际情况在选择一款性价比高的拼接屏。今天……国产新能源汽车专利20强企业排名比亚迪一骑绝尘近日,查查大数据研究院发布了《新能源汽车专利20强企业榜单》。榜单显示,比亚迪汽车以9426件有效专利稳居专利总量榜首,是榜单内其他19强平均专利数的7倍。在专利数量方面……好奇心实验室IP地址安全吗?来源:【交汇点新闻客户端】交汇点讯最近一段时间,各大互联网平台陆续开始显示用户IP属地,在广大网友中引起了热议。什么是IP地址?IP地址会泄露自己的隐私吗?为何有IPV4……Nginx配置不生效的问题解决先看正确的nginx配置文件的主要部分:注意的部分,这样就根目录,a路径,还有b路径都能生效了。server{listen80;c……国内首款双座水上电动飞机成功取得型号合格证〔video:国内首款双座水上电动飞机成功取得型号合格证〕(视频来源:沈阳航空航天大学、辽宁通用航空研究院)《中国民航报》、中国民航网记者潘瑾瑜报道:日前,由辽宁通……科学家构建高质量水稻泛基因组科学家构建高质量水稻泛基因组科技日报讯(记者马爱平)近日,中国农业科学院作物科学研究所水稻分子设计技术与应用创新团队和上海交通大学合作,基于111份代表性水稻资源的二代和……长安华为宁德时代组天团,这是要制霸新能源市场的节奏吗?虽说已有UNI系列这样的高端产品序列,但长安并不满足于此,它需要一个真正意义上的高端子品牌。长安汽车在5月20日发出公告称,旗下子公司长安蔚来正式更名为阿维塔科技,公司将……涉及个税医疗外卖3月起,这些新规将落地实施3月起一批新规将正式落地实施一起看看,哪些与你息息相关全国新规四部门:不得利用算法对消费者实施不合理价格差别待遇国家网信办等四部门联合发布《互联网……故障分析数据库故障MHA未切换作者:张洛丹原爱可生DBA团队成员,现陆金所DBA团队成员,对技术执著有追求!本文来源:原创投稿爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小……国家反诈app到底有多厉害?自从装了国家反诈APP之后,手机接打电话时屏幕顶部区域都会提示该号码怎么怎么怎么,有风险的会特别醒目的提醒你;再者时,打开支付宝、银行卡转账或者付款时,这个APP会跳出来……哪些家电下单的时候肉疼,用了之后却觉得很值,幸福感爆表?1。按摩椅,将近一万,但是买回来后,每天下班回来,当你腰酸背痛躺在按摩椅上,松松骨拉拉筋,值得。2。整体式浴房,带冲浪蒸汽,关键是关门后淋浴,不会把水溅到卫生间地面,泡澡……售价1999元起华为nova4e线下引参观热潮中关村在线消息:3月30日,华为在美丽的蓝色港湾举办了以自拍不吃妆为主题的线下自拍与体验活动。除了红红火火的自拍活动外,华为nova4e这款产品的展示区同样吸引了大量喜爱华为产……
特斯拉比智能,试驾20万内最好开的纯电SUV零跑C11TCL98英寸IMAXEnhanced巨幕智屏评测把电影院搬快递柜成为公共产品,是否支持?小方糖快充套装上手iPhone全系快充适配,30分钟充满60被李想质疑的团车网回应了,这家汽车交易平台也要进军造车iPhone13外观配置爆料汇总卖点确实不少,香不香价格说了TCL发布智能眼镜NXTWEARAIR和LEINIAOAR,好还是坏?美国称,机器人已经可以拥有婴儿一般的自我意识英特尔大师挑战赛网鱼竞技场收官,思必驰通话降噪燃夏电竞2个月不到,滴滴市值从800亿美元跌至424亿美元,连孙正义苹果新科技背夹式外接电池真有人买吗?售价居然高达749元vivo系统更新后的变形器有什么作用?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利