MySQL主从复制原理解析

MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库复制到另一个MySQL数据库,在master与Slave之间实现整个主从复制的过程是有三个线程参与完成的。其中两个线程(SQL线程和IO线程)在slave端,另一个线程(I/O线程)在master端。

复制概述

MySQL内置的复制功能是构建大型、高性能应用程序的基础。将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将MySQL的某一台主机的数据复制到其它主机(slave)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

注:当进行复制时,所有对复制中表的更新必须在主服务器上进行。否则,你必须要小心,以避免对主服务器上的表进行的更新与对从服务器上的表的更新之间的冲突。

MySQL复制的应用常见场景?

1、从服务器作为主服务器的实时数据备份

2、主从服务器实现读写分离,从服务器实现负载均衡

3、把多个从服务器根据业务重要性进行拆分访问

主从复制实现基本原理?

1、复制是MySQL自带的一项功能,允许服务器将更改从一个服务器的一个实例复制到另一个实例。

2、主服务器将所有数据和结构更改记录到二进制日志中。

3、从属服务器从主服务器请求该二进制日志并在本地应用其内容。即通过把主库的binlog传送到从库,从新解析应用到从库。

MySQL支持的复制类型

(1)基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。

一旦发现没法精确复制时,会自动选择基于行的复制。

(2)基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL5.0开始支持。

(3)混合类型复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

复制解决的问题

1、数据分布(data distribution) 2、负载均衡(load balancing)

3、备份(backups) 4、高可用和容错行(high availability and failover)

复制过程

1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave

2、从库的IO线程和主库的dump线程建立连接。

3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。

4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。

5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中

6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge

主从复制状态失败原因?

1、主机没启动,或者宕机,检查主库状态。

2、网络通信问题,使用ping命令检查;或使用shell命令进行shell端登录测试。

3、防火墙,selinux

4、复制用户名、密码、端口号、地址有问题,使用MySQL命令进行shell端登录测试。

5、MySQL自动解析,会将连接的IP解析成主机名(skip-name-resolve=0)写入my.cnf文件即可。

6、从库IO异常关闭,通过show slave status\G进行查看