共计 3994 个字符,预计需要花费 10 分钟才能阅读完成。
“ 三高 ”Mysql – Mysql 的根底构造理解
引言
内容为慕课网的 《高并发 高性能 高可用 MySQL 实战》 视频的学习笔记内容和集体整顿扩大之后的笔记,在疾速视频学习一遍之后发现了许多须要补充的点,比方三次握手的连贯和 Mysql 的外部交互流程等等,对于后续的章节也会整合多篇文章后续会陆续公布。
Mysql 的连贯形式
应用最多的形式是第一种形式,另外三种形式受限于非凡的平台形式实现,重点把握第一种 TCP/IP 的形式即可。
- tcp/ip 的连贯模式
- 共享内存的连贯形式
- 命名空间模式
- unix 套接字的连贯形式
Tcp/ip 的通信协定
这一块在视频中解说比拟浅,所以这里参考了多方材料后,以 《TCP/IP 协定》 作为参考介绍三次握手和四次挥手的过程。
通信协定也就是咱们常见的三次握手和四次挥手的流程,留神这里疏忽 TCP/IP 报文的格局介绍。
- SYN:同步序号。
- FIN:发送方实现标记。
- ACK:仅当 ACK= 1 时,确认号字段才无效,并且建设 TCP 连贯之后所有的连贯必须 ACK=1。
- ack:承受申请之后将申请序列号 + 1 进行回送应用。
- ISN:起始序号也别叫做 Seq,该序号由工夫决定,所以每一个 Tcp 都有一个惟一的起始序号,组成的形式是 开始的序号、一个冒号、隐含的结尾序号 及圆括号内的数据字节数,比方 1415531521:1415531521(0),如果字节为 0 则被暗藏,只有当存在字节数据或者 SYN、FIN 或 RST 被设置为 1 才进行展现。
- Mss:示意的是以后报文的最大字节数。
ISM 可看作是一个 32 比特的计 数器,每 4ms + 1。
三次握手建设 TCP 连贯(报问段 1 -3)
- 第一步:客户端被动关上 TCB 端口,服务器被动关上 TCB 端口。发起方携带一个 SYN 标记,并且携带一个 ISN 序号 Seq=x,然而须要留神的是第一步的过程这个 ISN 序号是暗藏传递的(因为没有传递数据),然而如果不存在数据的替换,则不会被显示。客户端发送 SYN 命令之把SYN=1,并且把 SYN-SENT(同步 - 已发送状态)。
- 第二步:服务器收到客户端 TCP 报文之后,也将 SYN=1,并且回送一个新的 ISN 序号 ack=x+1,并且将 ACK= 1 示意本人收到了,而后在返回参数回送本人新的序列号示意本人的确认申请 Seq=y,将状态设置为 SYN-RCVD(同步收到)状态,(示意心愿收到的序号为 xxxx1522),最初也是指定 MSS。
- 第三步:客户端收到服务器的确认报文之后,还须要向服务端返回确认报文,确认报文的 ACK=1,并且回传服务器传递的 ISN 序号 +1(ack = y+1),以及本人的 ISN 序号 +1(Seq = x+1),此时 TCP 连贯进入已连贯状态,ACK 是能够携带数据的,然而如果不携带数据则不耗费序列号。
- 最初一步:当服务器收到客户端的确认,也进入已连贯状态。
Mysql 认证连贯:
(参考资料:http://mysql.taobao.org/monthly/2018/08/07/)
Mysql 的认证链接能够看作是三次交互,留神第一次申请是服务端发动的,有点相似咱们去店外面买货色,首先闭口的必定是员工,比方问咱们要什么货色,于是咱们花钱买货色,而后把货色带走,认证过程能够相似于这样的一个过程。
- 服务端 → 客户端 发送初始化包:服务端首先确认是那个客户端须要连贯
- 客户端 → 服务端 验证
- 服务端 → 认证后果音讯
- 认证通过客户端与服务端断开
四次挥手端口 tcp 连贯(报文段 4 开始)
- 第一步(客户端):TCP 发送开释连贯的报文,进行发送数据,开释报文首部,把 FIN=1,同时发送序列号,依据上一次传送的序列号 + 1 传送 Seq = t + 1(因为下图是在连贯之后立马进行四次挥手,所以序列号没有变),此时客户端进行终止期待 1 的状态。留神 FIN 不携带数据也须要耗费序列号。
- 第二步(服务端):服务器回送确认报文,收回确认报文,ACK=1,并且把回传序列号 + 1 回传(ack = t + 1),而后再带上本人的序列号 Seq = y,此时服务端进入 CLOSE-WAIT 状态(敞开期待状态),TCP 服务器此时须要进行下层利用客户端向服务端申请开释,处于 半敞开 阶段,此时服务端仍然能够向客户端发数据并且客户端须要承受并解决,敞开期待状态意味着整个状态还须要继续一段时间。
- 第三步(客户端):客户端接管到服务端确认申请,此时客户端进入到 FIN-WAIT- 2 终止期待 2 的阶段,期待服务器的开释报文。(还有一部分服务器没有发送完的数据须要解决)
- 第四步(服务端):服务器把最初的数据处理结束,向客户端发送开释报文,FIN=1,ack=t + 1,因为须要把剩下的数据发送实现,假如解决实现之后须要带上本人的序列号 Seq=w,服务器进入 最初确认状态,期待客户端确认。
- 第五步(客户端):客户端收到报文之后,收回确认 ACK=1,ack=w+1,本人的序列号为 Seq = t + 1,此时客户端进入到了 TIME-WAIT(工夫期待状态),此时客户端还是没有开释,必须通过 2 * MSL(最长报文寿命) 之后,客户端撤掉 TCB 之后才进入 CLOSED 状态。
- 第六步(服务端):服务器收到客户端的申请立马进入 CLOSE 状态,同时撤销 TCB,完结此次 TCP 的连贯。(服务端完结 TCP 连贯要比客户端早一些)
为什么须要四次挥手能力敞开连贯?
TCP/IP 是一种全双工的协定,任何一方敞开都须要双向的确认操作,单方敞开须要给对方发送一个 FIN 来终止连贯,一端收到 FIN 告诉应用层的另一端终止数据的发送,而收到一个 FIN 仅仅阐明一个方向不进行数据流动,通常敞开的一方(发送 FIN 的一方)为被动敞开,接受方为被动敞开,因为全双工个性单方都须要对方被动敞开。
通过上面的图能够简略理解为什么要这样设计:
Mysql 的报文格式
Mysql 的报文格式比较简单,它次要分为上面的局部,Mysql 通过本人构建的协定进行外部通信,简略理解即可:
- 音讯头:3 个字节的报文长度,1 个字节的序号
- 音讯体:1 个字节指令,存储数据,长度不定
- 指令案例:切换数据库(0x02),查问指令(ox03)
如何应用工具验证如何通信?命令是如何执行的?
连贯下来之后会执行如下的操作流程。
- 客户端→服务端:发送命令包
- 服务端→客户端:发送回应包
命令是如何执行的?能够应用一些辅助的抓包工具查看,比方 windows 平台有一个 wireShark 的工具,咱们能够通过一个简略的抓包案例查看:
在理论的开始之前咱们须要弄清楚 Mysql 到底应用的是什么协定,MySQL 客户端应用 TCP 协定 作为底层传输协定,而应用 Mysql 公司本身的 Mysql Protocol 协定 作为应用层协定作为外部通信。
这里应用 window 的 wireShark 工具抓包,读者也能够应用 tcpdump 进行抓包,命令行操作更加简洁:
首先是三次握手的过程:
如上面的图所示,首先由客户端发动连贯申请,传送 Seq 序号和设置 SYN 为 1 并且设置为同步发送状态,接着服务端受到申请之后,将 ACK 设置为 1,并且将客户端序号 + 1 之后回送,并且也传递一个本人的序号,此时服务端也处于同步承受状态,最初当客户端受到服务端申请之后也把 ack 设置为 1,并且传递服务端的序列号,至此建设连贯。
接下来是客户端和服务端的交互,因为这里应用了 navicat 进行连贯测试,所以能够发现 navicat 在这其中发送了很多本人的包:
这里须要留神的是在外部通信的时候 Mysql 应用的是本身的协定,依据客户端的命令申请返回相应的数据。
最初是四次挥手的过程,因为下面进行了具体的解释正当就不再啰嗦了,四次挥手的过程要简单不少,客户端存在最终期待 1 和最终期待 2 的阶段,而服务端在承受到申请之后不会立即回复客户端能够敞开,而是须要将数据传输实现之后,再回送客户端进行传送,当客户端收到断开指令之后,则会立刻进行此次 TCP 交互,而客户端这里须要通过最长等待时间才会开释连贯,所以对于服务器连贯优化来说,TCP 的最长等待时间是一个重要的优化点。
数据库和 excel 的比照
- 存储和磁盘空间大小相似
- 数据库面向软件,提供接口
- excel 文件级别,面向终端用户
- 事务:数据库千人千面
常见的架构
事件驱动架构
事件驱动的模式常见于 GUI 的软件当中,咱们点击某个按钮的时候,会触发与之关联的其余事件组,从上面的架构图能够看到事件和事件执行之间是结偶的,有很好的复用性。
管道 - 过滤器架构
管道过滤的架构比拟常见是 http 申请过滤解决,比方咱们想要对于一个申请进行不同档次的剖析,对于申请次数,申请工夫,或者申请起源或者对于申请拦挡的解决,能够通过过滤链的形式对于申请进行解决。
微核架构
微核架构罕用于精简我的项目架构,通过插件的形式对于零碎的外围性能加强,微核架构具备很好的灵活性,能依据不同的理论状况进行灵便组合实现不同的成果。
分层架构
通过拆分 server 和存储引擎,将整个连贯的步骤拆分为上面的局部,sever 层负责连贯治理,而存储引擎则负责与后盾的交互动作。
数据库的基础架构
在 Mysql 的设计中,能够看到次要应用了三种架构模式:
- 事件驱动架构
- 分层架构
- 微核架构
常见存储引擎介绍
- innodb:互联网罕用,反对事务。
- myISAM:查问快。
- memory:长期内存表。
- Archive:归档表。
sql 语句查问过程
sql 的查问语句大抵分为上面四个模块:
- 查问缓存(8.0 删除)
- 分析器
- 优化器
- 执行器
- 存储引擎
上面是一个 SQL 查问的大抵步骤
- 查问缓存(8.0 删除)
分析器
- 剖析语法,解析语句
- 拆分编译语句
- 解析 SQL 的外围步骤
优化器
- 通过 mysql 的规定优化查问链路或者 sql 执行的过程
- 建设并且把执行打算传递给执行器
执行器
- 负责具体的 sql 执行
- 通过存储引擎的接口进行接口调用,最初后果返回给客户端
结语
后面的章节比拟根底,跳过了很多内容,本局部重点是三次握手和四次挥手的过程须要多相熟一下,另外 Mysql 最值得学习的是 InnoDB 存储引擎,如果对于数据库设计感兴趣是必定绕不过的。