0、接上篇
?
上篇我们搭建好了MySQL主从复制,我觉得通过实践后的结果来倒推原理是最好的方式之一。下面通过分析MySQL主从服务器的状态,来学习下主从复制的原理。
先制作一个动画看主从复制的过程
从上篇的实践出发看整体的过程
一、MySQL主从服务器状态
1.主服务器状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000009 | 753 | | | |
+------------------+----------+--------------+------------------+-------------------+
说明主服务器当前写的日志文件为mysql-bin.000009(File字段),当前位置为753(Position字段) ?
2.从服务器状态
mysql> show slave status\G
*************************** 1. row ***************************
//从服务器IO线程状态:等待主服务器发送二进制日志事件
Slave_IO_State: Waiting for master to send event
//失败重连时间
Connect_Retry: 60
//I/O线程当前正在读取的主服务器二进制日志文件的名称
Master_Log_File: mysql-bin.000009
//在当前的主服务器二进制日志中,I/O线程已经读取的位置。
Read_Master_Log_Pos: 591
//SQL线程当前正在读取和执行的中继日志文件的名称
Relay_Log_File: 9696cc5c2787-relay-bin.000002
//在当前的中继日志中,SQL线程已读取和执行的位置。
Relay_Log_Pos: 320
//当前中继日志同步的二进制日志文件
Relay_Master_Log_File: mysql-bin.000009
//IO线程是否运行
Slave_IO_Running: Yes
//SQL线程是否运行
Slave_SQL_Running: Yes
//表示同步到主服务器的二进制日志偏移量的位置
Exec_Master_Log_Pos: 591
Relay_Log_Space: 534
//主服务器SQL线程运行状态:主服务器已经读取了所有中继日志,正在等待新的数据
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
SQL线程延时时间:(Read_Master_Log_Pos-Exec_Master_Log_Pos),单位为字节。上面的结果为0,表示当前主从服务器是完全同步的。 ?
3.取出主从服务器状态名词
将主从服务器的状态名词提取出来,然后通过文字或者图片将其串联起来。涉及的到名词如下 主服务器(master)、binlog、从服务器(slave)、IO线程、SQL线程、relay log。下面通过讲原理将其串联起来。
二、主从复制原理
1.主从复制需要几个线程完成?
MySQL同步复制功能由3个线程(master上1个,slave上2个)来实现。从服务器上是通过IO线程和SQL线程,主服务器的线程可以通过show processlist命令查看,该线程执行的命令是Binlog Dump,该线程当前状态是已经向从服务器发送全部的binlog(二进制日志),正在等待新数据。
2.这几个线程如何配合完成工作?
? 首先要明确的是slave请求master发送指定位置后的日志内容,这个指定位置需要slave上一次请求时,由master告诉slave。具体的步骤如下 ?
1.从服务器I/O线程发送请求:从服务器执行start slave命令后,slave就会创建一个I/O线程。I/O线程连接到master上,并请求master,要读取指定日志文件位置之后的日志内容。 ? 2.主服务器接收请求:主服务器接收到请求后创建一个线程,该线程把内容返回给slave的I/O线程。这个内容有日志所包含的信息,还有master的binlog文件名称及这次读取binlog日志的位置 3.从服务器I/O线程写入relay log文件:slave的I/O线程接收到信息后,将接收到的日志内容依次写入到slave的relay log文件的结尾处,并将从master读取到的binlog的文件名和位置记录到master-info文件中,以便下次再读取 ? 4.从服务器SQL线程解析relaylog文件:salve的SQL线程检测到relaylog中新增加了内容后,会马上解析该log文件中的内容成为在master真实执行那些可执行的SQL语句,并执行这些SQL语句。通过执行相同的SQL语句就保证了 master和slave的数据一致。
三、总结
最后我们简单总结下MySQL的主从复制。MySQL主从复制是读写分离、MySQL高可用集群的基础,随着软件的并发量越来越大,使用读写分离、MySQL集群的场景越来越多,可见MySQL主从复制的重要性。 然而,由于主从复制实现的方式是异步的,这就可能导致在复制数据时导致数据丢失的问题。下篇将分享MySQL的高可用架构,在不同场景使用不同的架构去规避主从复制数据丢失的问题。 ?
?
?
?
|