Mysql 5.X版本整体介绍

Mysql 8.X版本和 5.X版本相比,有比较大的调整。目前工作中应用最广的是Mysql 5.6/5.7的版本,所以本系列文章将聚焦于对Mysql 5.6/5.7版本进行介绍,8.X版本的相关改动,有机会再单独整理。

一、Mysql体系结构

Mysql是一个单进程多线程、基于C/S架构的关系型数据库管理系统,其体系结构如图1所示 (图片摘自Mysql官方手册,5.6+的版本进行了少许调整,总体上仍是准确的),虚线标出的查询缓存和缓冲区部分在Mysql 8.X版本中已废弃,侧面反映了数据库的查询缓存实际上比较鸡肋。其中,“Connectors”是指提供连接能力的各种组件和API,我们可以简单地理解为各种客户端,“Server”代表服务端实例。
Mysql 5.X版本整体介绍_第1张图片

图1 Mysql体系结构

1.1 C/S通信协议相关内容

在服务器启动的过程中,创建了套接字且绑定了端口,然后在handle_connections_methods()函数中完成监听,监听其实就是等待用户的连接请求。这个函数中会处理三种连接方式:命名管道、套接字及共享内存。一般情况下,都是用套接字的连接方式,其他连接方式只有在一定条件下才能使用,所以本文只介绍套接字相关的部分。

MySQL客户端进程和服务器进程的Connection Pool之间是基于Mysql Client/Server协议[1]进行通讯的,该协议用于连接、代理、主备复制等操作,支持 SSL、压缩等特性。

Mysql C/S协议的内涵比较丰富,它规定了连接的各个生命周期的数据格式和行为,包括:各数据类型的编码格式、各种操作的请求数据包的格式、结果返回包的格式、字符集、数据包压缩和数据包TLS加密等等。

连接的生命周期包括三部分内容:连接阶段 (Connection Phase)、请求阶段 (Command Phase) 和拷贝协议 (Replication Protocol)。其中,拷贝协议比较独立,主要用于主从节点间的binlog同步。其大体流程是:建立连接后,Client向Server发送一个MySQL binlog dump的命令,随后,Server不断地给Client发送binlog event。本文不再详细介绍,如果希望进一步了解,推荐查看go-mysql-elasticsearch作者写的这篇文章:深入解析MySQL replication协议[3]。下面我们重点介绍一下连接阶段和请求阶段。

1.1.1 连接阶段(Connection Phase)通信

1.协议数据包
先简单介绍Mysql协议的数据包(packet)[2],Mysql的数据包均由header和body两部分构成:header总共有4个字节,3个字节用来标识 payload 的大小,1个字节记录sequence ID,来保证交互时报文的顺序;body则保存实际的负载数据(payload)。

+--------------------+--------------+---------------------------------------------------+
|      3 Bytes       |    1 Byte    |                   N Bytes                         |
+--------------------+--------------+---------------------------------------------------+
|<= length of body =>|<= sequence =>|<==================== data =======================>|
|<=

你可能感兴趣的:(Java,mysql,数据库,memcached)