Mysql复制关系
Posted 月牙儿June
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql复制关系相关的知识,希望对你有一定的参考价值。
复制分成三步:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
MySQL Binlog 有三种格式,分别是Statement(语句)、Row(行)、Mixd(混合)。
Statement记录了用户执行的原始SQL,而Row则是记录了行的修改情况,在mysql 5.6以上的版本默认是Mixd格式,但为了保证复制数据的完整性,建议生产环境都使用Row格式,就前面所说的Row记录的是行数据的修改情况,而不是原始SQL。
复制存在多种模式,定义为异步复制、半同步复制以及同步复制。
异步复制
MySQL默认使用异步复制。更新提交到主服务器数据库,然后转发并应用到从服务器。主服务器不需要等待从服务器接收到更新,因此能够继续处理其他写入操作,不会因为等待从服务器的确认而被阻塞。
使用异步复制时,发生主服务器故障的情况下,不能保证所有的更新能够复制到从服务器。下面讨论的半同步复制能够增强主服务器与从服务器之间的数据一致性,降低故障转移时的数据丢失风险。
对于存在大量写入操作的高事务应用,从服务器明显会存在已提交更新的延迟(滞后)。
使用正确的组件和调优,复制对于应用而言可以是近似接近即时的。
使用异步复制,从服务器从主服务器接收更新时不需要永久性连接。这意味着可以通过长距离的连接,甚至临时的或者间断的连接进行更新。根据配置的不同,可以复制所有的数据库,指定的数据库,甚至是数据库内指定的表。
半同步复制
半同步复制可以作为默认的异步复制的替代方案,用以提高数据完整性。
使用半同步复制,提交操作只有当一个从服务器已经接收到更新,或者超时后才返回客户端。因此,它可以确保数据存在于主服务器以及至少一个从服务器中(注意,提交操作返回时,从服务器已经接收到更新,但不一定已经应用了该更新)。
可以组合使用不同的复制模式,因此一些从服务器配置为异步复制,而其他从服务器使用半同步复制。这样最终意味着开发人员/DBA能够基于每个从服务器确定合适的数据一致性和性能级别。
以上描述的不同复制模式可以与完全同步复制进行比较,后者使用“两阶段提交”协议同时将数据提交到两个或者更多实例中。
同步复制能够确保多个系统之间的一致性,故障时提供更快的故障转移时间,但是会因为在节点之间传递更多的消息导致性能消耗。
复制的常用拓扑结构
复制的体系结构有以下一些基本原则:
(1) 每个slave只能有一个master;
(2) 每个slave只能有一个唯一的服务器ID;
(3) 每个master可以有很多slave;
(4) 如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新。
MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master。
但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。
1.单一master和多slave
由一个master和一个slave组成复制系统是最简单的情况。
Slave之间并不相互通信,只能与master进行通信。
如果写操作较少,而读操作很时,可以采取这种结构。
你可以将读操作分布到其它的slave,从而减小master的压力。
但是,当slave增加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。
这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。一些建议:
(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);
(2) 用一个slave作为备用master,只进行复制;
(3) 用一个远程的slave,用于灾难恢复;
2.主动模式的Master-Master(Master-Master in Active-Active Mode)
Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。
主动的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结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方
式来模拟这种多主服务器的复制。
3.主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)
这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不
同点在于其中一个服务只能进行只读操作。
4.带从服务器的Master-Master结构(Master-Master with Slaves)
这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的
请求放到slave上。
以上是关于Mysql复制关系的主要内容,如果未能解决你的问题,请参考以下文章