MySQL复制-主从原理

1 什么是复制
同它字面的意思一样,复制要解决的问题就是让一台服务器的数据同其他服务器保持同步,同文件copy等的意思相同,就是将修改的数据从一台数据库服务器拷贝到另外一台或者多台数据库服务器。

2 为何要有这玩意
解决高并发和系统的水平伸缩通常需要采用读写分离架构,通过将主库产生的数据同步到多个备库,然后将读操作分担到备库中,这个同步就需要使用复制技术。

为了保障系统的高可用性需要将数据做冗余备份,复制是备份的基础,后面专门介绍二者的不同之处。

3 复制原理
复制是通过在主库中记录二进制日志,然后在备库上重放日志的方式实现的。
复制的架构如下图所示:



1)主库将数据修改记录到二进制日志中,也称为bin log。
2)备库IO线程将主库的日志复制到备库的中继日志中,也称为relay log。
3)备库的SQL线程重放中继日志,将数据同步。


4 行复制和语句复制,各自的优缺点
MySQL支持基于行的复制和基于语句的复制,两种复制方式。
4.1 基于语句的复制
这种方式是主库记录下数据修改的语句,备库上将这些语句再重放一遍。
优点:
1)实现简单。
2)占用的带宽小。例如如果更新一个大表 update tbl set col='两种复制的优缺点',如果基于语句复制,仅仅需要重放一个SQL语句,但如果基于行的复制,则需要重放所有的数据修改。


缺点:
1)如果语句中含有时间戳等函数,则复制后会有差异。
2)更新必须是串行的,否则并发情况下可能会出现问题。
3)如果存在触发器或者存储过程,经常会有问题。

4.2 基于行的复制
这种方式下主库记录的是实际修改的数据,备库上重放这些修改。

优点:
1)可以正确的复制每一行。
2)无需重放用于更新的查询,开销小。例如将一个大表的数据做汇总,然后汇入到小表中,这种方式下如果采用基于语句的复制,则对于大表的汇总需要在备库上重新统计一遍,而基于行的复制,则只需要重放更新到汇总表的少量记录即可。

要尽量避免此类语句采取基于语句的复制,这样会在备库消耗很多的CPU,加大备库的延迟,可以考虑将此类语句移到应用中,在应用中解决。

缺点:
1)无法判断主库上执行了哪些SQL语句


MySQL在两者之间进行动态切换,默认采用基于语句的复制,如果发现语句如果无法被正确的复制,则切换成基于行的复制。


5复制和备份的区别
举个例子,如果在主库上误执行了drop table tbl 操作,复制会将备库的这个表也干掉,而备份可以帮助您从错误的操作中恢复回来。


关于这个主题,还有很多东东,笔者非DBA,我觉得知道这些就差不多了。





《高性能MySQL》

猜你喜欢

转载自frank1234.iteye.com/blog/2165223