mysql主从复制原理
MySQL Replication是MySQL的一个非常重要的功能,主要用于主服务器和从服务器之间的数据复制操作。
复制过程
主服务器数据库启用二进制日志,主服务器上的修改保存至本地二进制日志。
Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 BinaryLog 中的位置。
Slave的IO线程接收到信息后,将接收到的日志内容依次写入到Slave端的RelayLog文件(mysql-relay-lin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到 master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”。
Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave端执行了同样的 Query,所以两端的数据是完全一样的。
整体上来说,Replication是一个异步的复制过程,大致有3个步骤:
- master将改变记录到二进制日志(binary log)中;
- slave将master的binary log events拷贝到它的中继日志(relay log);
- slave重做中继日志中的事件,将改变反映它自己的数据。
复制线程
MySQL使用4个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上)。
- 当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送[记录在其binglog中的语句];
- 主服务器创建一个线程将二进制日志中的内容发送到从服务器。 该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。
- 从服务器I/O线程读取主服务器Binlog Dump线程发送的数据并将其拷贝到从服务器的本地文件中,即中继日志。
- 第4个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。 所以,每个从服务器有3个线程。有多个从库的主服务器将为每个当前连接的从服务器创建一个线程。
复制方案效果比对
单向复制有利于健壮性、速度和系统管理;从库可以分担主库的查询负载和备份压力;
方案一:传统一对一
方案二:链式
- 优点:极大减少主库的磁盘和网络压力;
- 缺点:中间一环故障,则导致后面2台数据异常;
方案三:一主多从
- 优点:任一从库异常不影响其他从库;
- 缺点:增加主库磁盘和网络压力;