前言
在 mysql 的服务器配置中, 我们经常会使用到几个 timeout
诸如 connect_timeout, wait_timeout, interactive_timeout, read_timeout, write_timeout 等等
我们 这里来看一下 他们的具体的使用场景, 以及具体控制的相关信息 是什么
connect_timeout
这个是 客户端 和 服务器建立连接之后, 客户端需要向服务器发起认证请求
如果在 connect_timeout 期限内, 客户端未发送认证请求, 服务器会断开 和 客户端的连接
客户端和服务器这边新建了连接之后, 需要登录, 登录的时候设置了 socket 的读写超时时间为 connect_timeout
登录之后, 如果是登录成功
将 socket 的读写超时时间更新为 net_read_timeout, net_write_timeout
wait_timeout/interactive_timeout
这两个超时时间, 控制的是 一个连接 如果超过多久, 没有交互了, mysql 这边可以关闭这个连接了
从描述上面看, 二者基本上是一样的, 从业务控制上面看, interactive_timeout 被转换为了 wait_timeout
这里是 登录校验 的时候, 将 interactive_timeout 转换为了 wait_timeout
这里是具体使用到的地方, “thd->get_protocol()->get_command” 是轮询 socket, 查看客户端是否有请求数据过来
因此 在轮询之前, 将 socket 的超时时间更新为了 wait_timeout
当前连接, 如果是超过了 wait_timeout 没有活跃, 则 超时, 然后 外层 handle_connection 的循环, 走 end_connection, close_connection 的相关流程
read_timeout/write_timeout
这两个主要控制的就是 服务器这边从客户端读取数据, 和 服务器往客户端写出数据 的超时时间控制了
这两个系统变量 描述信息如下
read_timeout 的这边使用如下, 在处理客户端请求之前, 将 socket 的读取超时时间更新为 read_timeout
如果是 服务器这边读取客户端的请求数据, 超过了 read_timeout, 则超时
write_timeout 的这边配置是在 登录连接之后, 将 socket 的写出超时时间更新为了 write_timeout
然后 后面的, 请求处理等等相关, 均是基于这个 write_timeout 的配置
read_timeout 的整体更新流程
这个是在 创建连接, 处理业务, 关闭连接 的几个阶段的 socket 读取超时 时间的更新的一个大致的情况
初始化的时候, 使用全局变量的 read_timeout 进行初始化 读取超时时间
然后是 登录的使用, 使用 connect_timeout 来更新 socket 的读取超时时间
然后是 登录验证之后, 将 socket 的读取超时时间更新为了 read_timeout
然后是 轮询客户端请求之前, 将 socket 的超时时间 更新为了 wait_timeout
然后是处理客户端请求之前, 将 socket 的读取超时时间更新为了 read_timeout
之后是随着连接的 生命周期的业务处理, 在等待客户端请求信息之前将 socket 的读取超时时间更新为 wait_timeout, 在处理客户端的请求信息之前将 socket 的读取超时时间更新为 read_timeout
write_timeout 的整体更新流程
这个是在 创建连接, 处理业务, 关闭连接 的几个阶段的 socket 写出超时 时间的更新的一个大致的情况
初始化的时候, 使用全局变量的 write_timeout 进行初始化 写出超时时间
然后是 登录的使用, 使用 connect_timeout 来更新 socket 的读取写出时间
然后是 登录验证之后, 将 socket 的读取超时时间更新为了 write_timeout
然后在之后连接的生命周期中, socket 的写出超时时间, 一直是 write_timeout
完