好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MySQL之主从复制的过程和原理

    前几天搭建了MySQL的主从复制,已经搭建完成,但是主从复制的原理还不知道,所以来研究一下。

    本文的部分内容来自于互联网。

    主从复制的过程

    首先要了解到的是一个单向主从复制的实现是由三个线程来完成,master一个IO线程,slave一个IO

线程和一个SQL线程。

    1. slave 上面的IO线程连接上 master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

    2. master 接收到来自 slave 的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在master端的bin-log文件的名称以及在bin-log中的位置;

    3. slave的IO线程接收到信息后,将接收到的日志内容依次写入到slave端的Relay Log文件(hostname-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

  4. slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文件中的内容成为在 master 端真实执行时候的那些可执行的Query 语句,并在自身执行这些Query。这样,实际上就是在 master 端和slave 端执行了同样的Query,所以两端的数据是完全一样的。

    下面是实际的操作图

    1.首先看一下主库的状态

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M00/6C/92/wKioL1VMc9WAJUolAADln3tdavQ440.jpg" title="QQ截图20150508162316.png" alt="wKioL1VMc9WAJUolAADln3tdavQ440.jpg" />

    

2.然后看一下从库中master.info和nginx-relay-bin.000008(请无视名字,这个跟主机名有关)

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M02/6C/97/wKiom1VMc7iwixsnAAFNotQJQJ8605.jpg" title="QQ截图20150508162907.png" alt="wKiom1VMc7iwixsnAAFNotQJQJ8605.jpg" />

  

master.info中一部分文件内容,跟master的bin-log的名称和位置是一致的

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M00/6C/97/wKiom1VMc-yyt_TnAABnbg3KZ5Q941.jpg" title="QQ截图20150508162555.png" alt="wKiom1VMc-yyt_TnAABnbg3KZ5Q941.jpg" />

 

然后是nginx-relay-bin.000008的文件(有删节)

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M02/6C/92/wKioL1VMecPSwu1oAAV1-8HsXG4894.jpg" title="QQ截图20150508164339.png" alt="wKioL1VMecPSwu1oAAV1-8HsXG4894.jpg" />


然后主库建一个库测试一下

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M00/6C/97/wKiom1VMeK6TpglhAAEWvIzE2Yc027.jpg" title="QQ截图20150508165017.png" alt="wKiom1VMeK6TpglhAAEWvIzE2Yc027.jpg" />


看一下从库的 master.info和 nginx-relay-bin.000008文件

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M01/6C/97/wKiom1VMee_iFlBmAACMcP6l_lc383.jpg" style="float:none;" title="QQ截图20150508165219.png" alt="wKiom1VMee_iFlBmAACMcP6l_lc383.jpg" />


nginx-relay-bin.000008文件

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M02/6C/93/wKioL1VMe2OQ_KeRAAIOLzVRi0s218.jpg" style="float:none;" title="QQ截图20150508165326.png" alt="wKioL1VMe2OQ_KeRAAIOLzVRi0s218.jpg" />


现在我们来模拟一下故障,此时从数据库宕机,此时 master.info文件不变,但是 nginx-relay-bin.000008文件产生变化

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M00/6C/93/wKioL1VMfLjQ9QJ9AAGaO_LKvww685.jpg" title="QQ截图20150508170119.png" alt="wKioL1VMfLjQ9QJ9AAGaO_LKvww685.jpg" />


主数据库新建一个库测试一下,

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M02/6C/97/wKiom1VMfCvjx0QXAAFPL9ZQ99k350.jpg" title="QQ截图20150508170513.png" alt="wKiom1VMfCvjx0QXAAFPL9ZQ99k350.jpg" />


现在启动从数据库,此时relay-bin日志会重新产生两个,查看一下数值大的那个

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M01/6C/93/wKioL1VMfvmSbrTQAAFlGqdgxE0597.jpg" title="QQ截图20150508170948.png" alt="wKioL1VMfvmSbrTQAAFlGqdgxE0597.jpg" />


查看nginx.relay-bin.000010

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M00/6C/98/wKiom1VMf9bTVz4qAAZ53PEyrFA804.jpg" title="QQ截图20150508171325.png" alt="wKiom1VMf9bTVz4qAAZ53PEyrFA804.jpg" />


此时master.info文件也会更新到最新的pos

650) this.width=650;" src="http://s3.51cto测试数据/wyfs02/M01/6C/93/wKioL1VMgeOjolceAABurZycrxY285.jpg" title="QQ截图20150508172321.png" alt="wKioL1VMgeOjolceAABurZycrxY285.jpg" />

故障模拟完成。

写到这里,突然感觉写的实在是太繁琐了,详细一点也好,保证大家能看明白,不会云里雾里的感觉。


--------------------------------------分割线-----------------------------------------

说一下自己做实验时一些小细节

1.搭建完单向主从的时候,在主库创建了一个库sunys01做测试,然后在从库删掉了他,此时的主从数据不一致,但是主从还是正常的,主库再建一个库,从库也能同步的到数据。我一直以为主从同步只要是在从库进行过操作就会导致主从断掉。现在接上面的情况,从库删掉了sunys01,在主库也删掉sunys01,此时主从断裂,主库写数据从库无法同步数据, 现在我在从库重新创建了一个sunys01库,重启一下mysql,主从恢复了,主库中后续数据也成功同步。


2.做了一个双向主从在主1创建新库,同时他的master status变掉了,主1创建的库在主2也有,但是主2的master status也变掉了。我同学也是做的双主,但是主2的master status是不会变的,不知道是什么原因


写到这里终于结束了,有什么问题可以在评论中询问,大家共同进步

MySQL之主从复制的过程和原理

标签:mysql 主从同步的原理

查看更多关于MySQL之主从复制的过程和原理的详细内容...

  阅读:23次