"三高"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存储引擎,如果对于数据库设计感兴趣是必定绕不过的。