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

Crq
Crq
Crq
1161
文章
0
评论
2024年12月18日02:51:57
评论
56 2470字阅读8分14秒
摘要

MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

Mysql 复制(Replication)

1、Mysql 复制作用
  • 负载平衡(load balancing)
  • 备份
  • 高可用性(high availability)和容错
2、Mysql 复制原理

主要有三步(如下图):

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

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

slave重做中继日志中的事件,将改变它自己的数据。

具体说明:

该过程的第一部分就是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)类型

1、一主多从模式

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

具体说明:

如果写操作较少,而读操作很多时,可以采取这种架构。你可以将读操作分布到其它的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,否则将导致下游的从服务器无法更新复制。

2、双主模式

注,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结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。

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

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

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

weinxin
我的微信
这是我的微信扫一扫
Crq
  • 本文由 发表于 2024年12月18日02:51:57
  • 转载请注明:https://www.cncrq.com/12189.html
DevOps监控微服务的五原则 Linux教程

DevOps监控微服务的五原则

监控是微服务控制系统的关键部分,你的软件越复杂,那么你就越难了解其性能及问题排障。鉴于软件交付发生的巨大改变,监控系统同样需要进行彻底的改造,以便在微服务环境下表现更好。
Linux 中重置数据库的 root 密码的技巧 Linux教程

Linux 中重置数据库的 root 密码的技巧

其中一项是设置数据库 root 帐户的密码 - 你必须保持私密,并仅在绝对需要时使用。如果你忘记了密码或需要重置密码(例如,当数据库管理员换人或被裁员!),这篇文章会派上用场。
总说Linux,到底什么是Linux? Linux教程

总说Linux,到底什么是Linux?

Linux是最知名和最常用的开源操作系统。作为一个操作系统,Linux是一个软件,位于计算机上的所有其他软件的下面,从这些程序接收请求并将这些请求转发到计算机硬件。
Ubuntu12.04嵌入式交叉编译环境搭建 Linux教程

Ubuntu12.04嵌入式交叉编译环境搭建

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译,这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: