MySQL系列连载之主从复制原理

Mysql 复制(Replication)

一、Mysql 复制做用html

  • 负载平衡(load balancing)
  • 备份
  • 高可用性(high availability)和容错

二、Mysql 复制原理mysql

主要有三步(以下图):linux

master将改变记录到二进制日志(binary log)中(这些记录叫作二进制日志事件,binary log events);sql

slave将master的binary log events拷贝到它的中继日志(relay log);数据库

slave重作中继日志中的事件,将改变它本身的数据。缓存

MySQL系列连载之主从复制原理MySQL系列连载之主从复制原理

具体说明:服务器

该过程的第一部分就是master记录二进制日志。在每一个事务更新数据完成以前,master在二进制日志记录这些改变。MySQL将事务串行的写入二进制日志,即便事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。网络

下一步就是slave将master的binary log拷贝到它本身的中继日志。 首先,slave开始一个工做线程——I/O线程。I/O线程在master上打开一个普通的链接,而后开始binlog dump process。 Binlog dump process从master的二进制日志中读取事件,若是已经跟上master,它会休眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。架构

SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志一般会位于OS的缓存中,因此中继日志的开销很小。性能

此外,在master中也有一个工做线程:和其它MySQL的链接同样,slave在master中打开一个链接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操做不能在slave上并行操做。因此slave上数据通常要慢于master上数据。即master与slave之间的数据在必定时间内会不一样步。

Mysql 复制(Replication)类型

一、一主多从模式

注,由一个master和一个slave组成复制系统是最简单的状况。Slave之间并不相互通讯,只能与master进行通讯。

MySQL系列连载之主从复制原理MySQL系列连载之主从复制原理

具体说明:

若是写操做较少,而读操做不少时,能够采起这种架构。你能够将读操做分布到其它的slave,从而减少master的压力。

可是,当slave增长到必定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。

这种架构虽然简单,可是,它却很是灵活,足够知足大多数应用需求。

一些建议:

不一样的slave扮演不一样的做用(例如使用不一样的索引,或者不一样的存储引擎)

用一个slave做为备用master,只进行复制

用一个远程的slave,用于灾难恢复

发送复制事件到其它slave,当设置log_slave_updates时,你可让slave扮演其它slave的master。

此时,slave把SQL线程执行的事件写进本身的二进制日志(binary log),而后,它的slave能够获取这些事件并执行它
MySQL级联复制(A->B->C)log_slave_updates

MySQL主从结构实际中是用到最多的一种架构。

新上的两台服务器B和C,要替换掉以前旧的服务器A,同时,B和C是新的主从关系。所以,配置成级联复制,来迁移数据,也方便切换。

架构图以下:

master A ——> slave B ——> slave C

有这么状况发生了,服务器B能够正常复制服务器A的数据,服务器B和C主从状态Slave_IO_Running和Slave_SQL_Running都是yes的,可是服务器C却没法复制新的数据。

缘由分析:

1. 检查服务器B有没有开启二进制日志log_bin

2. log_slave_updates是否启用

log_slave_updates是将从服务器从主服务器收到的更新记入到从服务器本身的二进制日志文件中。

上面的问题是因为没有启用log_slave_updates = 1致使的。

总结:

所以,对于mysql级联复制,上游的从服务器不只仅要开启log_bin还要开启log_slave_updates,不然将致使下游的从服务器没法更新复制。

二、双主模式

注,Master-Master复制的两台服务器,既是master,又是另外一台服务器的slave。
MySQL系列连载之主从复制原理MySQL系列连载之主从复制原理

具体说明:

主的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都须要本身的可写的数据副本。

这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,若是两个服务器分别同时执行以下语句:

在第一个服务器上执行:

mysql> UPDATE tbl SET col=col + 1;

在第二个服务器上执行:

mysql> UPDATE tbl SET col=col * 2;

那么结果是多少呢?一台服务器是4,另外一个服务器是3,可是,这并不会产生错误。

实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),

这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),可是,若是你实在有这种需求,

你能够采用MySQL Cluster,以及将Cluster和Replication结合起来,能够创建强大的高性能的数据库平台。

可是,能够经过其它一些方式来模拟这种多主服务器的复制。

三、主从模式

注,这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具备容错和高可用性的系统。

MySQL系列连载之主从复制原理MySQL系列连载之主从复制原理

四、带从服务器的Master-Master结构(Master-Master with Slaves)

注,这种结构的优势就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,并且还能够将读密集型的请求放到slave上。

MySQL系列连载之主从复制原理MySQL系列连载之主从复制原理

总结:通常经常使用的两种复制类型一种是主从模式,另外一种是一主多从模式。在这咱们主要讲解主从模式复制。

本文地址:http://www.linuxprobe.com/mysql-replication-theory.html

相关文章
相关标签/搜索