MySQL主从同步探究


image.png

主从同步,顾名思义,就是有两台甚至多台MySQL服务器,对任何一个数据库的操作都自动同步到另外一个数据库,使两个数据库数据始终保持一致。 

这样做的好处:

 1. 做灾备,任意一个数据库出现问题,马上可切换到其他正常运行的服务器 

 2. 做负载均衡,可以将请求分发到其他服务器,提高网站吞吐量。

 3. 读写分离,多台服务器分别处理读、写的操作,提高性能

本教程基于docker 进行配置 ,MySQL版本:5.6.36

主服务器:master A

从服务器:slave B


原理我就照抄了一段,我这里主要将配置:

简单的说就是把 一个服务器上执行过的sql语句在别的服务器上也重复执行一遍, 这样只要两个数据库的初态是一样的,那么它们就能一直同步。当然这种复制和重复都是mysql自动实现的,我们只需要配置即可。我们进一步详细介绍原理的细节, 这有一张图:

上图中有两个服务器, 演示了从一个主服务器(master) 把数据同步到从服务器(slave)的过程。这是一个主-从复制的例子。 主-主互相复制只是把上面的例子反过来再做一遍。 所以我们以这个例子介绍原理。

对于一个mysql服务器, 一般有两个线程来负责复制和被复制。当开启复制之后。

 1. 作为主服务器Master,  会把自己的每一次改动都记录到 二进制日志 Binarylog 中。 (从服务器会负责来读取这个log, 然后在自己那里再执行一遍。)

 2. 作为从服务器Slave, 会用master上的账号登陆到 master上, 读取master的Binarylog,  写入到自己的中继日志 Relaylog, 然后自己的sql线程会负责读取这个中继日志,并执行一遍。  到这里主服务器上的更改就同步到从服务器上了。

在mysql上可以查看当前服务器的主,从状态。 其实就是当前服务器的 Binary(作为主服务器角色)状态和位置。 以及其RelayLog(作为从服务器)的复制进度。


主服务器的配置

创建一个备份的用户:

grant replication slave on *.* to 'repl_user'@'192.***.***.***' identified by 'hj34$%&mnkb'

在mysqld里面进行配置

# 启用二进制日志
log_bin = mysql-bin
# 服务器唯一ID
server-id = 1
log-bin-index=mysql-bin.index
sync_binlog=1
binlog_format=mixed

binlog-do-db = student
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
#auto-increment-increment = 10
#auto-increment-offset = 1

binlog-do-db 用来表示,只把哪些数据库的改动记录到binary日志中。 可以写上关注hello数据库。 但是我把它注释掉了。 只是展示一下。 可以写多行,表示关注多个数据库。

binlog-ignore-db 表示,需要忽略哪些数据库。我这里忽略了其他的4个数据库。

 后面两个用于在 双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。  解决这个问题的办法就是让每个数据库的自增主键不连续。  上图说是, 我假设需要将来可能需要10台服务器做备份, 所以auto-increment-increment 设为10.   而 auto-increment-offset=1 表示这台服务器的序号。 从1开始, 不超过auto-increment-increment。

这样做之后, 我在这台服务器上插入的第一个id就是 1, 第二行的id就是 11了, 而不是2.

(同理,在第二台服务器上插入的第一个id就是2, 第二行就是12, 这个后面再介绍) 这样就不会出现主键冲突了。此处不做互相备份,所以注释掉了

最后mysql>show master status;记录一下file和Position

从服务器的配置

在mysqld里面配置:

log_bin = mysql-bin
server-id = 2
log-bin-index=mysql-bin.index
sync_binlog=1
binlog_format=mixed

replicate-ignore-db = mysql
replicate-ignore-db = performance_schema
replicate-ignore-db = information_schema
relay-log = slave-relay-bin
#log-slave-updates = ON

server-id 必须保证每个服务器不一样。 这可能和循环同步有关。 防止进入死循环。

replicate-do-db 可以指定需要复制的数据库, 我这里注掉了。 演示一下。

replicate-ignore-db 复制时需要排除的数据库, 我使用了,这个。 除开系统的几个数据库之外,所有的数据库都复制。

relay_log 中继日志的名字。 前面说到了, 复制线程需要先把远程的变化拷贝到这个中继日志中, 在执行。

log-slave-updates 意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。 当你的B服务器需要作为另外一个服务器的主服务器的时候需要打开。  就是双主互相备份,或者多主循环备份。 我们这里不需要,注释。

重启进入mysql执行,开启同步

change master to master_host='192.168.0.104', #Master 服务器Ip
master_port=3306,
master_user='repl',
master_password='mysql', 
master_log_file='master-bin.000001',//刚刚记录下file
master_log_pos=0;//刚刚记录下的position

重启进入mysql执行,show slave status\G


注意图中的红框, 两个都是Yes, 说明开启成功。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

注意:两个服务器的库要保持一致,才能同步库里的表


本文 暂无 评论

Top