一直对这部分不太了解,稍微看了一下,但由于知识储备有限,错误在所难免。


总的看起来MySQL在这部分依旧使用了常规的 reactor+线程池高并发网络模型,这里我们以poll为列,有如下特点:

  • 主reactor通过poll对listen fd的POLLIN event进行监控,并且设置了非阻塞。

  • 如果主reactor收到新的连接请求,在线程池中获取一个线程

  • 如果线程池中没有可用的线程,则新建线程

  • 新的线程对同样通过ppoll对连接fd的POLLIN event进行监控,并且负责实际业务逻辑的处理。

貌似看起来大佬的手法都是通用的,都是按照一定模式写出来的。当然实际上涉及的东西还是非常多,但是这里我们仅仅了解网络框架部分,对于线程池\vio通信模块\net协议模块不做讨论,因为我也不了解,这里主要看看网络框架。

简要流程分析

  • network_init 这部分主要对实例的端口进行bind->listen,并且设置好poll监控的event为 POLLIN,同时会将listen fd设置为非堵塞,这里还需要注意一点socket的属性设置了SO_REUSEADDR,这表明对于处于TIME_WAIT状态的连接,MySQLD客户端的端口能够快速重用,而不需要等待2MSL超时。

  • connection_event_loop 和所有的网络框架一样,这里需要开启主循环了。循环的目的当然就是不断监控poll的POLLIN和accpet 后返回连接fd,如果打开函数Mysqld_socket_listener::listen_for_connection_event就能看到一上来就是poll开始了。最后会将accpet的连接fd封装到Channel_info返回。并且随后本函数还负责了新线程的建立,这里可以考虑为我们的session即将诞生。随后调用的就是这里主要开始调用Per_thread_connection_handler::add_connection。首先会在线程池中获取一个已经建立好的线程来进行处理,这里和我们的参数thread_cache有关,这种缓存的线程通常在函数Per_thread_connection_handler::block_until_new_connection处堵塞,等待唤醒,一旦有足够的缓存的线程就会唤醒并且完成出队操作。当然了,如果线程吃没有缓存的线程,则新建线程用于新会话的处理。完成这一步后我们的主reactor线程也就是我们main线程就会(注意不是Innodb的master线程)堵塞在poll上等待新的连接请求的到来,来一个处理一个。等待如下,

main ->mysqld_main -> Connection_acceptor<Mysqld_socket_listener>::connection_event_loop ->Mysqld_socket_listener::listen_for_connection_event ->poll ()
  • handle_connection 这里新建的线程就是处理和连接fd相关的写入信息了,注意这里是一个for死循环,这是因为对于缓存的线程来讲,需要堵塞在block_until_new_connection,然后等待下一次拿出来处理新的连接请求。同时需要注意来到这里实际上TCP协议的3次握手,但是MySQL net协议的握手还没有完成。已经完成了如下抓包:

对于用户会话线程通常叫做thread_one_connection,接着会调用thd_prepare_connection->login_connection将准备对连接fd进行ppoll的超时参数设置为connect_timeout指定的值,也就是言外之意connect_timeout是在处理连接请求的时候生效的参数。然后thd_prepare_connection->login_connection->check_connection,在函数check_connection中完成主要任务是:

  1. ip_to_hostname函数:host_cache和ip相关的反解析动作,并且判断是否超过了max_connection_errors 参数,如果们设置 skip-host-cache skip-name-resolve就不会有这个动作。

  2. acl_check_host 函数:应该是对登陆网段等进行鉴定,是否符合登陆网段的需求,主要来自mysql.user表。

  3. acl_authenticate 函数:(Perform the handshake, authorize the client)这里应该就是要进行MySQL net的握手了,并且完成如密码认证等操作。如果是native password则调用native_password_authenticate进行密码验证。

  4. check_and_update_password_lock_state函数:主要完成对密码错误登陆次数/密码锁定天数的判定,如果不符合要求则报错Account is blocked for %s day(s) (%s day(s) remaining) due to %u consecutive failed logins. Use FLUSH PRIVILEGES or ALTER USER to reset."

在login_connection的末尾会将连接fd的ppoll的timeout参数设置为read_timeout/write_timeout。最后接下来就是进行命令处理的环节了。也就是do_command。通常我们的会话就堵塞在这里等待客户端命令的到来如下:

#0  0x00007ffff5e2dcff in ppoll () from /lib64/libc.so.6
#1  0x00000000058bba82 in vio_io_wait (vio=0x7fffa801b990, event=VIO_IO_EVENT_READ, timeout=28800000) at /newdata/mysql-8.0.23/vio/viosocket.cc:847
#2  0x00000000058ba4c5 in vio_socket_io_wait (vio=0x7fffa801b990, event=VIO_IO_EVENT_READ) at /newdata/mysql-8.0.23/vio/viosocket.cc:105
#3  0x00000000058bc45b in vio_ssl_read (vio=0x7fffa801b990, buf=0x7fffa800e900 "\001", size=4) at /newdata/mysql-8.0.23/vio/viossl.cc:294
#4  0x00000000039bee83 in net_read_raw_loop (net=0x7fffa800d430, count=4) at /newdata/mysql-8.0.23/sql-common/net_serv.cc:1336
#5  0x00000000039bf1ef in net_read_packet_header (net=0x7fffa800d430) at /newdata/mysql-8.0.23/sql-common/net_serv.cc:1419
#6  0x00000000039c050a in net_read_packet (net=0x7fffa800d430, complen=0x7fffdc4fb9c8) at /newdata/mysql-8.0.23/sql-common/net_serv.cc:2010
#7  0x00000000039c0789 in net_read_uncompressed_packet (net=0x7fffa800d430, len=@0x7fffdc4fba08: 140736889600560) at /newdata/mysql-8.0.23/sql-common/net_serv.cc:2085
#8  0x00000000039c0a77 in my_net_read (net=0x7fffa800d430) at /newdata/mysql-8.0.23/sql-common/net_serv.cc:2161
#9  0x0000000003e23f6e in Protocol_classic::read_packet (this=0x7fffa801a780) at /newdata/mysql-8.0.23/sql/protocol_classic.cc:1404
#10 0x0000000003e25179 in Protocol_classic::get_command (this=0x7fffa801a780, com_data=0x7fffdc4fbb00, cmd=0x7fffdc4fbb2c) at /newdata/mysql-8.0.23/sql/protocol_classic.cc:2975
#11 0x00000000037f063d in do_command (thd=0x7fffa800b980) at /newdata/mysql-8.0.23/sql/sql_parse.cc:1266
#12 0x00000000039c5c91 in handle_connection (arg=0xbe8d880) at /newdata/mysql-8.0.23/sql/conn_handler/connection_handler_per_thread.cc:301
  • 其他 当然我们注意的是,读取命令和返回数据给客户端是通过参数read_timeout/write_timeout控制,但是等待命令的到来是通过参数wait_timeout/interactive_timeout。但是他们同样作用于连接fd的ppoll的timeout参数上。

最后:

这是今年最后一次发公众号,感谢领导同事朋友对工作的支持。顺便灌个鸡汤"让我们一起带着好奇,带着梦想,向星辰大海进发!",来年再战了。

MySQL:网络连接框架简析相关推荐

  1. Volley网络请求框架简析——Android网络请求框架(三)

    题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个 ...

  2. oneinstack mysql_使用oneinstack安装mysql设置远程连接教程简析

    使用oneinstack安装mysql设置远程连接教程简析 发布时间:2020-04-30 11:13:56 来源:亿速云 阅读:167 作者:三月 本文主要给大家介绍使用oneinstack安装my ...

  3. MTK IMS框架简析(2)——IMS注册过程

    之前在<MTK IMS框架简析(1)--代码架构及模块初始化> 中已经分析了ims代码的构成和重点类的初始化,接下来以启用VOLTE子功能为例,具体分析AP侧IMS服务的注册过程. 概要 ...

  4. DirectX游戏开发之代码的框架简析

    DirectX游戏开发之代码的框架简析 此次学习过程中,主要参考的是大神"毛星云"的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改. 在这两个上面你能够学得更 ...

  5. 网络协议:简析三次握手协议

    一,简析三次握手协议 首先来看我们生活中很常见的一件事: 在我们网购的时候,常常会跟客服这样聊天:我们向客服询问某件事,客服回答,然后我们断网了...过了一会儿,我们再登陆就收到了客服的回答. 这个交 ...

  6. slg游戏客户端框架简析

    前言 从18年3月开始,进入新公司,参与一款slg海战类游戏的开发,全程负责slg海战类游戏大地图模块的开发,以及部分框架的完善和其他内容的开发.游戏已经正式上线一段时间了,工作空闲了一些,趁空闲的这 ...

  7. 两台手机通过4g网络直接通讯_王者不卡了!手游电竞网络保障方案简析

    目前手游电竞行业以迅雷不及掩耳之势兴起,王者荣耀,和平精英,QQ飞车等等已经有了自己专属的电竞赛事. 相对于电脑(PC)有线终端来说,手游电竞使用的网络都是无线传输,无线相对于有线来说存在先天的缺陷- ...

  8. python网络编程实例简析

    本文实例讲述了python网络编程,分享给大家供大家参考. 具体方法如下: 服务端代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from SocketS ...

  9. python网络编程案例_python网络编程实例简析

    本文实例讲述了python网络编程,分享给大家供大家参考. 具体方法如下: 服务端代码如下: from SocketServer import(TCPServer as TCP, StreamRequ ...

最新文章

  1. JS数字转换成货币格式
  2. Win10环境下搭建virtualenvwrapper-win
  3. 老男孩Linux运维第41期20171016第六周学习重点课堂记录
  4. 今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)
  5. [register]-ARM64重要寄存器介绍
  6. java加载一个来自项目之外的java文件,执行其main方法的一种实现方式
  7. WatchOS系统开发大全(7)-WKInterfaceImage
  8. 在Visual Studio Code中配置GO开发环境
  9. 第十一章 Helm-kubernetes的包管理器(上)
  10. 每天打卡心情好(洛谷P1664题题解,Java语言描述)
  11. 国际码可以直接应用于计算机,2012年自考计算机应用基础试题及答案
  12. html怎么更改手势手型,弹钢琴时纠正手型手势的正确方法
  13. texstudio如何安装cjk宏包_MikTex+TexStudio配置论文写作环境
  14. 图数据集之cora数据集介绍- 用pyton处理 - 可用于GCN任务
  15. 易筋SpringBoot 2.1 | 第廿八篇:SpringBoot之循环引用Circular Dependency
  16. 随便谈谈IT行业的几个定律
  17. 2610_lab2 命令行与快捷键
  18. 关于投资与投机、基金
  19. 流体力学课上的老师这句话,让我义无反顾的上了CFD这艘“贼船”
  20. A.Jelly (简单BFS三维)

热门文章

  1. Python作为移动客户端后台服务器
  2. [Python人工智能] 十七.Keras搭建分类神经网络及MNIST数字图像案例分析
  3. executeQuery、executeUpdate和execute
  4. 关于DDK中的编译知识
  5. 【大数据处理】广州餐饮店铺爬虫并可视化,上传至hdfs
  6. LUR 算法 原理(附带自己实现源码)
  7. 学java有前途吗?方兴未艾!
  8. java中flush()的作用的是什么?与close有什么联系
  9. 开发日志:浏览器宽度大于400px,td的宽度按百分比自适应,小于400px时,宽度为指定的值
  10. 云服务器价格比较,用哪家的比较划算?