MySQL主从复制

MySQL复制

前言

MySQL内置的复制功能是构建基于MySQL的大规模、高性能应用的基础。这类应用使用所谓的“水平扩展”的架构。我们可以通过为服务器配置一个或多个备库的方式来进行数据同步 。复制功能不仅有利于构建高性能的应用,同时也是高可用性、可扩展性、灾难恢复、备份以及数据仓库工作的基础。

复制的工作机制

  1. 在主库中把数据记录到二进制日志(Binary Log)中。

    在每次需要提交事务完成数据更新之前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而不是每条语句执行的顺序来记录二进制日志。 在记录二进制日志后,主库会告诉存储引擎可以提交事务了。

  2. 备库将主库中的日志复制到自己的中继日志(Relay Log)中。

    备库会启动一个I/O线程,I/O线程将与主库建立一个普通的客户端连接,然后主库上会启动一个特殊的转储线程,这个线程读取主库上的二进制日志中的事件,备库I/O线程将接收的事件记录到中继日志中。

  3. 备库读取中继文件中的事件,将其重放到备库数据之上。

    备库的SQL进程从中继文件中读取事件并在备库中执行,从而实现备库事件的更新。

复制的配置

以下基于MySQL5.7配置,主备库服务器IP分别为192.168.137.128192.168.137.129

1. 创建复制账号
MySQL会赋予一些特殊的权限给复制的线程,在备库中的I/O线程会建立一个到主库的TCP/IP连接,因此主库中需要创建一个用户,并赋予其合适的权限。
MySQL主从复制
如上,创建用户repl,密码123465,并赋予REPLICATION SLAVE, REPLICATION CLIENT权限。

2. 配置主库
在主库的my.cnf增加或修改如下内容
MySQL主从复制
log_bin选项指定二进制日志文件的位置和命名,如果之前没有配置log_bin选项,则需要重启mysql服务。server_id 选项设置唯一的服务器ID

查看主库状态
MySQL主从复制
3. 配置备库
在备库的my.conf中添加或修改如下内容,并重启msyql
MySQL主从复制
relay_log选项指定中继日志的位置和命名。
log_slave_updates选项设置允许备库将重放时间也记录到自身的二进制日志中。
read_only选项设置阻止非特权用户修改数据。

4. 启动复制
指定主库IP,账号信息、二进制日志信息,MASTER_LOG_POS指定日志开始位置
MySQL主从复制

查看备库复制状态,对比执行START SLAVE操作前后
未执行START SLAVE前状态
MySQL主从复制
执行START SLAVE后状态
MySQL主从复制
Slave_IO_Running 代表备库I/O线程的运行状态。
Slave_SQL_Running 表示备库SQL线程的运行状态。
Slave_IO_State 表示I/O线程状态。上图显示表示等待主库传输数据。

复制常见结构

基本原则
1)一个mysql备库实例只能有一个主库
2)每个备库只能有一个唯一的服务器ID
3)一个主库可以有多个备库,一个备库可以有多个兄弟备库
4)如果打开了log_slave_updates选项,一个备库可以作为其他备库的主库。

一主库多备库

MySQL主从复制
这是最简单的结构,适用于小量写,大量读得场景。可以把读操作分摊到多个备库上,直到备库给主库造成了太大的负担或主备库之间的带宽成为瓶颈为止。也可以将多个备库用于不同的用途。

主 - 主复制

主动 - 主动模式

MySQL主从复制
这种模式下,两个服务器都被配置为对方的主库和备库。这种配置最大的问题是如何解决冲突,两个可写的互主服务器导致的问题非常多。这通常发生在两台服务器同时修改同一行记录,或同时在两台服务器上向一个包含AUTO_INCREMENT列的表中插入数据。MySQL5.0增加了新特性,可以设置auto_increment_increment(设置自增字段每次递增的量)和auto_increment_offset(设置自增字段从哪里开始递增),通过这两个选项自动为插入语句选择互不冲突的值。

主动 - 被动模式

MySQL主从复制
这种模式是主动 - 主动模式下的一个变体,主要区别在于其中一台服务器是只读的被动服务器。由于服务器的配置是对等的,因此使得切换主动-被动服务器方便,这也是构建容错性和高可用性系统非常强大的方式。

主 - 主模式配置

1)确保两台服务器上有相同的数据。
2)启用二进制日志,选择唯一的服务器ID,并创建复制账号。
3)启用备库更新的日志记录,这是故障转移和故障恢复的关键。
4)把被动服务器配置为只读,防止可能与主动服务器上的更新产生冲突,这点是可选的(主动 - 被动模式需配置)。
5)启动每个服务器的MySQL实例。
6)将每个主库设置为对方的备库,使用新创建的二进制日志开始工作。

拥有备库的主 - 主结构

MySQL主从复制
这种模式为每个主库增加了备库,这种配置优点是增加了冗余。对于不同地理位置的复制,能够消除站点单点失效的问题。

其他模式

环形复制

MySQL主从复制
环形结构可以有三个或更多的主库,每个服务器都是在它之前的服务器的备库,是在它之后服务器的主库。双主结构实际上是环形结构的一种特例。

树或金字塔形

MySQL主从复制
这种结构的好处是减少了主库的负担,它的缺点是中间层出现的任何错误都会影响到多个服务器。

—————END—————

参考文献
[1] 高性能MySQL(第3版)