一、主从复制概述:
主从复制作用1:读写分离,可以通过主从复制的方式来同步数据,然后通过读写分离提高数据库并发处理能力;其中一个是Master主库,负责写入数据;其它都是slave从库,负责读取数据。当主库进行更新的时候,会自动将数据复制到从库中,而在客户端读取数据的时候会从从库中进行读取。面对“读多写少"的需求,采用读写分离的方式可以实现更高的并发访间。同时还能对从服务器进行 负载均衡,让不同的读请求按照策略均匀地分发到不同的从服务器上,让读取更加顺畅。
主从复制作用2:数据备份,通过主从复制将主库上的数据复制到了从库上相当于是一种热备份机制,也就是在主库正常运行的情况下进行的备份,不会影响到服务;
主从复制作用3:具有高可用性。数据备份实际上是一种冗余的机制,通过这种冗余的方式可以换取数据库的高可用性,也就是当服务器出现故障或宕机的情况下可以切换到从服务器上,保证服务的正常运行。
二、主从复制原理:
Slave会从Master读取binlog来进行数据的同步
1.三个线程:
(1)二进制日志转储线程:是一个主库线程。当从库线程连接的时候主库可以将二进制日志发送给从库,当主库读取事件(Event)的时候会在Binlog上加锁,读取完成之后再将锁释放掉;
(2)从库I/O线程:会连接到主库,向主库发送请求更新Binlog。这时从库的I/O线程就可以读取到主库的二进制日志转储线程发送的Binlog更新部分,并且拷贝到本地的中继日志(Relaylog)。
(3)从库SQL线程:会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同步。
2.复制三步骤:
(1)Master将写操作记录到二进制日志(binlog)。这些记录叫做二进制日志事件(binary log events);
(2)Slave将Master的binary log events拷贝到它的中继日志(relay log)
(3)Slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的,而重启后从接入点开始复制。
3.复制的基本原则:
(1)每个slave只有一个master
(2)每个slave只能有一个唯一的服务器ID
(3)每个Master可以有多个Salve
三、同步数据一致性问题:
1.主从同步的要求:
(1)读库和写库的数据一致
(2)写数据必须写到写库
(3)读数据必须到读库
2.解决一致性问题的方法:
(1)异步复制:异步模式就是客户端提交COMMIT之后不需要等从库返回任何结果,而是直接将结果返回给客户端,这样做的好处是不会影响主库写的效率,但可能会存在主库宕机而Binlog还没有同步到从库的情况,也就是此时的主库和从库数据不一致。这时候从从库中选择一个作为新主,那么新主则可能缺少原来主服务器中已提交的事务。所以这种复制模式下的数据一致性是最弱的。
(2)半同步复制:MySQL5.5版本之后开始支持半同步复制的方式。原理是在客户端提交COMMIT之后不直接将结果返回给客户端,而是等待至少有一个从库接收到了Binlog,并且写入到中继日志中再返回给客户端。这样做的好处就是提高了数据的一致性,当然相比于异步复制来说至少多增加了一个网络连接的延迟,降低了主库写的效率。
(3)组复制:首先将多个节点共同组成一个复制组,在执行读写(RW)事务的时候需要通过一致性协议层(Consensus层)的同意,也就是读写事务想要进行提交必须要经过组里“大多数人”(对应Node节点)的同意。大多数指的是同意的节点数量需要大于(N/2+1),这样才可以进行提交。而针对只读(RO)事务则不需要经过组内同意直接COMMIT即可。在一个复制组内有多个节点组成,它们各自维护了自己的数据副本,并且在一致性协议层实现了原子消息和全局有序消息,从而保证组内数据的一致性;