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

关于MySQL这个问题100个人都没搞懂

9月25日 相思宫投稿
  本文转载自腾讯云数据库
  作者简介:鲁越,腾讯云数据库架构师,主要负责腾讯云数据库MySQL、Redis、MongoDB、Oracle等数据库架构设计、数据库运维、运营开发等工作,曾就职于网易游戏。
  问题背景
  用户将MySQL从IDC迁移至公有云后,时常有出现建立连接超时的情况,业务使用的场景是PHP短连接到MySQL,每秒的新建连接数在3000个左右,这个量算是比较大。但在IDC内自建时也是这样的使用场景,从未遇到过这个问题。
  排查步骤
  1、首先肯定是排查MySQL以及MySQL所在的物理机是否有异常,排查了一圈之后,发现数据库的慢查询基本没有,数据库和物理机的负载都不算高,基本可以排除是数据库本身的问题。
  2、超时问题最容易联想到的就是网络上有异常,在物理机上抓包后,抓到在有问题的时间点确实有SYN包的重传。
  3、仔细排查这个异常的流,发现重传并不是因为没有收到包或者发出去了包没有响应,那么说明问题并不是出现在网络链路上。这个流中,客户端首先发了一个SYN包给服务器,奇怪的是,服务器在收到这个SYN包过后,并没有按照TCP三次握手的方式回复一个SYNACK,而是回复了一个普通的ACK,而且这个ACK回复的seq并不是SYN包的seq0,而是一个比较奇怪的数字706168360。
  4、另外,在物理机上netstat发现,有大量的连接处于TIMEWAIT状态。
  5、那这里就产生了两个疑点:
  1)为什么Server端会有大量的连接进入TIMEWAIT状态?
  2)为什么Server端没有正常回复SYNACK,而是回复了一个普通的ACK?
  6、要解释第一个问题,我们先来回顾一下TCP四次挥手的流程
  从流程里面我们看到,进入TIMEWAIT状态是先发送FIN包的一方,也就是主动断开连接的一方。一般来说,客户端连接服务器,如果没有什么异常,连接是会由客户端主动断开的。那这里为什么服务器上面会有大量的连接处于TIMEWAIT状态?难道这个场景下连接是服务器主动断开的?
  我们来看看一个程序跟MySQL通信的一个常规过程,程序首先跟MySQL建连,建连完成之后执行SQL请求进行数据通信,通信完成后,会发送一个quit命令给MySQL服务器断开连接。这个流程看似没有什么疑点,但重点就在这个quit命令上面。我们考虑一下MySQL服务器在收到这个quit请求后会做一些什么处理。
  首先肯定是处理应用层的一些连接相关的信息。处理完成之后,再处理网络层的连接。网络层的连接怎么处理呢?等客户端发送FIN包过来吗?要是客户端一直不发怎么办呢?其实这里我们不难找到答案,也很容易猜想出MySQL的处理方式:主动发送FIN包来断开这个TCP连接。这个也就解释了为什么大量进入TIMEWAIT状态的是MySQL服务器而不是客户端。不仅仅是MySQL,包括redis、mongodb等会接受到类似quit命令退出的数据库产品,也都是相似的处理方式。
  7、第一个问题解释清楚了,我们再来看看第二个,为什么服务器没有正常的回复SYNACK。
  首先,我们知道,linux下连接进入TIMEWAIT状态的时间是2个MSL,也就是120秒。在每秒3000个短连接的情况下,120秒内可以产生大约36万个进入TIMEWAIT状态的连接。而客户端可以使用的总端口数是65536,除去一些系统固定分配的,差不多也就60000个左右。假如这3000个每秒的短连接都是由一台客户端连接过来的,那20秒的时间就会复用到之前已经使用过的端口,这个时候该端口对应在服务器端的连接还在TIMEWAIT状态。所以服务器在收到新连接的SYN包后,并不认为这是一个新建连接请求的SYN包过来,而是把它当做一个普通数据包来处理,所以回复了一个普通的ACK和一个较大的seq。其实这个seq就是上一次连接的最后一个seq。
  8、排查到这里,这个问题的处理思路就比较明确了,就是减少服务器上进入TIMEWAIT状态的连接数量,首先想到的当然是开启timewait的快速回收。但在实际开启后,我们发现快速回收并没有生效,这里又涉及到另一个问题:
  开启timewait快速回收需要开启net。ipv4。tcptimestamps,但是这个参数在有nat网关的环境下开启会导致连接异常,云上vpcgw层会在接受到带有timestamps包后把这个字段去掉,导致了即使开启了快速回收也没有实际生效。这里也解释了为什么客户在自建IDC内没有问题而迁移到云上之后开始出问题。
  解决方案
  1、客户端改用长连接
  需要客户端的改动比较大,但能彻底解决问题,高并发的场景下,长连接的性能也明显好于短连接。
  2、增加客户端的个数,避免在2MSL时间内使用到重复的端口
  能够降低出问题概率,但需要增加成本,性价比不高。
  3、降低net。ipv4。tcpmaxtwbuckets(有风险)
  能够降低出问题概率,降低的程度视修改的参数值而定,设置为0可以完全解决。此方法在网络状况不好的情况下有风险,一般内网低延迟的网络风险不大。
  4、客户端在断开连接时,不用quit的方式退出,直接发FIN或者RST
  能够彻底解决问题,需要修改客户端底层库,有一定风险。
  5、修改linux内核减小MSL时间
  能够降低出问题的概率,需要修改linux内核,难度和风险都较大。
投诉 评论 转载

2021年成都幼儿园报名,他们都在私聊开工遇上开学,成都有多少麻麻跟园助一样,忙得兵荒马乱?为了接送方便,今年我们转到家附近的公立幼儿园,转园手续入园体验查验证明大人小孩拍照报名报道。。。。。。第二次准备算是……孩子,真的很抱歉!大人们的世界太冷漠有关常州小学生缪某某坠亡的事件,几经发酵。虽然说现在已经不再说逝者为大了,但是,一个孩子,一个本应在爱与支持下快乐成长的稚嫩生命,就这样带着她的伤痛黯然离去,没有留下一句争辩,……西瓜皮真是个宝,放到锅里煮一煮太厉害了,以后再也不扔了摘要:炎炎夏日,西瓜是最好的时令解暑水果,现在正是西瓜大量上市的季节,相信很多人都已经买来吃了,吃完的西瓜皮很多人都是直接扔掉了,那就太可惜了。其实吃完的西瓜皮还是个宝,在我们……这种病像慢刀子将人慢慢折磨致死在我国众多的慢病中,其中心脑血管病、糖尿病和恶性肿瘤已经众所周知,但是人们却忽略慢病呼吸系统疾病的危害!其实从流行病学的五个关键指标:发病率、患病率、死亡率、病死率、疾病负担来……关于MySQL这个问题100个人都没搞懂本文转载自腾讯云数据库作者简介:鲁越,腾讯云数据库架构师,主要负责腾讯云数据库MySQL、Redis、MongoDB、Oracle等数据库架构设计、数据库运维、运营开发等……幼儿园超前学习危害大,三年级爆发?家长不一定,该学的还得学文乔治麻麻偶尔会听见一些人说,幼儿园孩子超前学习危害大,他们大概的理念就是过早的让孩子学习会产生两个危害:1、让孩子失去学习的兴趣2、容易让孩子上小学后上课不专注,觉得自……户外工作的人如何挑选蓝牙耳机,在外使用蓝牙耳机隔音很重要现如今有许多人的工作都是在户外,可是有时在户外,这样嘈杂的环境,不易听清耳机里面的声音,那我们这样的人该如何挑选蓝牙耳机呢?入耳式的蓝牙耳机可以隔绝大部分环境噪音,让自己沉浸在……老房子装电梯,低楼层不同意时,2个新方案能强制加装畅谈关于装修的那些事,分享装修的各种经验和知识。大家好,我是畅谈装修,关注我即可了解更多关于装修的那些事!按照《住宅建筑设计规范》的要求,7层以下楼房是没有加装电梯的必要……宝宝总是红屁屁怎么办?感谢邀请,我是蛋黄育儿的创作者,也是一位宝妈。红屁屁是宝宝比较常见的一个问题。因为宝宝皮肤非常娇嫩,所以经常在潮湿不透气的环境下就会泛红甚至肿起。我家宝宝比较小的时候也曾……新生儿黄疸如何应对,所谓的退黄奶粉是否是智商税?首选是母乳,多吃多排同时午间晒一晒后背和全身,注意保护眼睛。其次遵医嘱,适当照蓝光退黄奶粉没必要吃一、自身祛黄两个过程:第一身体内的胆黄素排到肠道,第二……当你的孩子被欺负了怎么办?从菜市场买完菜进小区时,看到小区前两个孩子正在争夺玩具,穿粉色罩衣大概3岁的女孩伸手就朝对面灰格子衣服的男孩脸上抓了一把,被抓后哇哇大哭的小男孩看起来小一点,两岁左右。在门口唠……如何能让孩子成为一个快乐的人?有一个好的成长环境,让你的家中充满笑声,并经常给孩子一个拥抱,它们是最好的爱的表达。家庭成员之间要相互关心,营造温馨的家庭氛围,让孩子从小就懂得关心父母,关心长辈,懂得分享。儿……
高中记16一边是双减一边是内卷,我们还能倾听来自内心的声音吗你知道吗,睡觉其实不怕吵儿童用药难题如何破与陈灵石研究癌症相比,这些中学生的科技创新作品,显得真实可信张艺谋一秒钟的父爱引共情,父爱深沉,孩子更要有温度的陪伴为什么宝妈都恨婴幼儿湿疹?因为有这三大罪有偿补课终于再遭重拳严厉整治教师违规补课,家长仍然忧心培养孩子写作和阅读的好习惯教育孩子的方法有千种,不要拿教育孩子当借口,上演苦情戏宝妈怎么选择副业?宝宝睡觉总是蹬被子,是这些原因导致的,家长别再以为是娃调皮幸福生活,从早餐开始

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