【MySQL】关于 unauthenticated user的哲学思考

一 现象

  在生产环境中我们偶尔会遇到 "unauthenticated user" 这样的连接,同时伴有数据库服务器层面的load,sys cpu较高,或者thread running异常。

+-----+----------------------+--------------------+------+---------+------+-------+------------------+

| Id  | User                 | Host               | db   | Command | Time | State | Info |

+-----+----------------------+--------------------+------+---------+------+-------+------------------+

| 235 | unauthenticated user | 10.10.2.74:53216   | NULL | Connect | NULL | login | NULL |

| 236 | unauthenticated user | 10.120.61.10:51721 | NULL | Connect | NULL | login | NULL |

| 237 | user                 | localhost          | NULL | Query   | 0     | NULL | show processlist |

+-----+----------------------+--------------------+------+---------+------+-------+------------------+

二 分析
类似于校园门卫看到一个陌生的人进入时的提出的著名问题,大家会进入哲学模式 :TA是谁? 从哪里来? 要干什么? 本文从IT技术角度回答这个哲学问题 
TA是谁?

官方介绍:unauthenticated user refers to a thread that has become associated with a client connection but for which authentication of the client user has not yet been done。 

意即:MySQL有一个线程在处理客户端的连接,但是该客户端还没通过用户验证,show processlist时显示"unauthenticated user".
从哪里来?
回答这个问题之前,我们先了解client端和MySQL建立TCP连接(socket不在讨论范围之内)的过程,一般客户端建立与MySQL的连接分4步:
1. 客户端发送数据包到MySQL服务器,准备建立连接。如果MySQL服务器对应的端口没有运行的实例会直接返回报错:
  ERROR 2003 (HY000): Can't connect to MySQL server on '[host]' (111) 
2. MySQL服务器向客户端响应基本信息 数据库服务器的ip,port,mysqld version ,the thread id,客户端的host , port等等,此时连接已经建立但是尚未完成授权,

“When a new client connects to mysqld, mysqld spawns a new thread to handle the request. This thread first checks whether the host name is in the host name cache. If not, the thread attempts to resolve the host name: 

 The thread takes the IP address and resolves it to a host name (using gethostbyaddr()). It then takes that host name and resolves it back to the IP address (using gethostbyname()) and compares to ensure it is the original IP address.”

 实际连接过程 mysql 分配一个新的线程来处理客户端的连接请求。先检查客户端的hostname 是否在缓存中 ,如果不在则对hostname解析解析.先作反向解析 客户端IP --->客户端的hostname,然后作客户端的hostname --->客户端IP的正向解析。如果结果符合,则验证为合法用户允许登录,如果不符合则定义为"unauthenticated user"。
3. 客户端发送username/password/要访问的dbname到MySQ数据库服务器。如果客户端由于某些原因在connect_timeout规定的时间内  没有发送的包或者发送错误的包,数据库服务器会断开该连接。
4. 服务器验证并返回验证结果给客户端。如果验证不通过 则通常返回:

ERROR 1045 (28000): Access denied for user 'user'@'host' (using password: [YES/NO]) 

ok,至此,我们可以知道TA来自客户端和MySQL服务器建立连接的第二阶段过程中。
要做什么?
显然准备访问数据库啊,获取数据或者写入数据。
如何规避这样的三无人员的出现呢?从产生该问题的原因来分析,主要介绍解决方法如下:
 a 在 /etc/my.cnf 的[mysqld]中添加 skip-name-resolve 参数,关闭mysql的dns反查询,mysql使用IP或者%授权
 b 在 /etc/hosts 添加IP与主机名对应关系
   192.168.0.1  xxxx
然而在我们生产环境中,已经配置了skip-name-resolve,依然会出现大量unauthenticated user 信息时表明MySQL服务器没有为客户端连接请求确认凭证,也就是说MySQL无法确认这些连接使用的数据库账号信息,在wait_timeout时间之内MySQL一直等待这些连接完成。
比如我在某机器上执行 

目标机器上 MySQL中执行 show processlist 显示为unauthenticated user 

因此这种现象不一定就是数据库本身的问题 ,下面这些都有可能产生这种现象
1.如果应用安全问题出现大量数据库探测,出现大量这种未经授权的连接。
2.应用服务压力过大出现线程异常中断导致出现大量异常数据库连接。
3.应用服务异常,导致出现大量异常数据库连接。
4.MySQL客户端连接版本问题,验证协议不兼容,尤其注意old-password验证方式。
5.数据库服务器的线程处于排队状态,因此可以加大back_log,增加MySQL处理连接请求的能力。
前三个要从应用服务器端查看出现大量 unauthenticated user 的时候系统的负载或者应用程序的状态,后面两个要从数据库服务器层面来检查系统的状态。

时间: 2025-01-30 07:49:29

【MySQL】关于 unauthenticated user的哲学思考的相关文章

使用 PHP + MySQL 处理负载过重的数据库问题思考和总结

以下是我对使用 PHP + MySQL 处理负载过重的数据库问题思考和总结,经验方面一定有着不少欠缺的地方,欢迎高手前来指教: 在设计时考虑合理的表结构和相应大概要承受多少访问压力,需不需要分表,如果需要分表每个表放多少条记录合适: 对于分表的实现可以采用 PHP 处理或是 MySQL 自带的 MERGE 表类型(即 MRG_MyISAM)来处理: ⑴如果是使用 PHP 处理有两种情况: ①没有数据的新库新表要为抗压做准备,比如一个聊天室一开始就要考虑可能有多个子聊天室,可以根据一些条件来进行,

软件开发的哲学思考

软件开发的哲学思考 (2002.01.11)   来自:计算机世界   枣庄张伟 编译 译者注:这篇文章虽然年代久远(1996年写的,对于IT行业来说用'久远'二字应该说还是十分合适的),但读过之后还是为作者的才华所倾倒,这是不可多见的一篇文章.卡内基-梅隆软件开发学院及其它学院的研究人员用尽毕生的精力去定义一个理论学科(即软件开发理论),到后来才发现仍有很多东西比较模糊,他们对此也不隐瞒.软件开发,自从产生以来,它以迷人的风采征服了许许多多有才华的人,一些教授.专家学者及商业管理人士不由提出这

加强对生态文明的哲学思考(信息快递)

中央党校哲学教研部.中央党校社会发展研究中心和中国http://www.aliyun.com/zixun/aggregation/31622.html">马克思主义研究基金会共同主办的"哲学与社会发展论坛(2012)"日前在北京举行.与会者围绕"中国特色社会主义道路与当代中国哲学发展深入学习贯彻十八大精神"这一主题进行了研讨. 与会者认为,中国特色社会主义道路是新型现代化道路,解决发展道路上的问题离不开哲学探索和思考.作为时代精神的精华,哲学为寻求和

一个程序员的哲学思考(关于编程、关于人生)

下面的文字,有的来自自己微博上的记录,有的来自散写的文章,但总的来看都是自身这些年来的一些思考. 也许对喜欢思考的人有点意思,所以汇总下. 但也正因为时间跨度和来源比较杂,就没什么体系性了. 关于编程 1.和世界格局一样,软件开发里也是多维力量(商业.公司政治.技术等)在冲突,单纯地斗争和避让其实都不太行. 2.很多时候人们争论是因为都不清楚问题自身.比如:软件工厂可能么? 软件和工厂都是巨大且模糊的概念,A或B的理解中又为之注入了各自色彩,所以即使讨论激烈,却可能说的根本不是一个东西. 这对脑

一个玩家对《星际争霸》的哲学思考(图)

依娃娃之见,即时战略游戏,总有点像古罗马的角斗场:在有限的空间里,两拨人(或两个人)PK,直到其中一拨人流干最后一滴血,活下来的就是胜方. 提到战略游戏,自然不能不提到星际争霸,作为暴雪的代表作,星际争霸的游戏设置当真堪称经典,甚至可以说很有些哲学意味. 背景简介 在这个游戏中,玩家们在一个限定的地图上,分成两派对攻,每一派别又可有若干玩家.每个玩家掌控一个"国家",玩家需要负责指挥自己国家每一个成员的工作:采矿.生产.繁殖亦或战斗.采矿获取经济利益,以从事生产与繁殖:生产与繁殖消耗经

易经中战略管理的哲学思考

国学中,易经是最神秘最玄的哲学,连三十六计都是在易经基础上演绎的结果.易经的很多思想跟战略管理存在逻辑的一致性.易经被世人视为占卜算卦的迷信,但是"卜"本身就是"择"的意思,古代"卜"就是日月影,古代用标杆测日月影,测量那个日影就是测字,记录下来就是卦.而测日月影的目的是为了"择".是为了选择合适的时机.位置和天气来考虑农事.廖晓认为,这跟战略管理的本质是一致的:战略是根据企业环境来做"选择".与易经也是根

mysql执行show processlist unauthenticated user 解决方法

一台unibilling机器前几天突然负载变重. 在top中发现cpu被大量占用. agi程序运行的很慢,并出现僵尸进程. 其实当时只有50个左右的并发呼叫. 远远达不到正常水准. 重新启动机器问题也没得到解决. 非常奇怪. 考虑到在top中看到mysqld占用的资源最多,就进入mysql控制台,运行 show processlist命令, 发现某进程的信息很特殊:  代码如下 复制代码 User "unauthenticated user" Command "connect

【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合

需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异参考文章] 问题二:批量入库就需要有高并发的消息队列,决定

产品设计:在时空人综合的情况看待产品

中国古典哲学中,无论是做人还是做事情,都特别强调"时"与"位",既时间与空间.很好的东西,很了不起的人才,如果不逢其时,一切都没有用.同样的道理,一件东西,很坏的也好,很好的也好,很坏的也好,很好的也好,如果适得起时,看来是一件很坏的东西,也会有很大的价值. 这个道理运用到产品上,我们可以简单的理解成:在什么样的时间,推出怎样定位的产品.而一款成功的产品,则就是:在恰当的时间,推出准确定位的产品. 下面我就举盛大的传奇(我特别钟爱这个例子):时:盛大的传奇是2001