mysql主从复制

原理:

        MySQL从3.23版本开始提供复制功能,复制主要是指将主服务器的DDL和DML操作,通过二进制日志(binLog日志),传到服务的服务器上,然后在从服务器上对这些日志从新执行,从而实现从服务器与主服务器的数据同步。MySQL支持一台主服务器同时向多台从服务器进行复制,从服务器同时也可以作为其他服务器的主服务器,实现链状的复制。

Mysql主从复制的实现原理图大致如下(来源网络):


MySQL主从复制的备份 mysql 5.7 主从复制_MySQL主从复制的备份



主从复制分两种,异步复制和半同步复制,mysql默认异步复制


异步同步:

在主节点上执行命令以后生成一个日志文件,然后将日至文件发送给从节点,最后提交,从节点收到日志文件后,开始同步里边的数据(事物),最后得到与主节点一致的数据, 效果图如下(图片来源于京东发布的MGR官方文档)

MySQL主从复制的备份 mysql 5.7 主从复制_服务器_02



半同步复制:

半同步复制是在协议中添加一个同步步骤,主节点在发送完日志文件之后,等待来自节点的回应,收到从节点的同步确认之后才去提交数据(保证数据一定被备份了)

效果图如下(图片来源于京东发布的MGR官方文档)

MySQL主从复制的备份 mysql 5.7 主从复制_MySQL主从复制的备份_03

90

一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主)---->IO Thead(从)-----> SQL Thread(从)

复制只能是单向的,从主(master)到从(slave)

master用户写入数据,生成event记录到binary-log(二进制日志)中

slave接收master上传来的binlog,然后按照顺序应用,重现master上的用户操作。


配置(默认异步复制):

环境:redhat6.5

数据库版本:5.7

主节点:172.25.53.1

从节点:172.25.53.2


首先主从节点安装mysql:

 yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y

主节点配置:

vim /etc/my.cnf

MySQL主从复制的备份 mysql 5.7 主从复制_MySQL主从复制的备份_04

log-bin=mysql-bin 启动二进制文件

server -id =1 必须为1到231之间的一个整数值

#binlog-ignore-db=mysql #不同步数据库mysql
#binlog-do-db=test #只同步数据库test,如果要同步多个数据库,就再写一行 binlog-do
-db=*** 以此类推

/etc/init.d/mysqld start --- 启动服务

为从机添加同步账户:

mysql5.7对于密码强度有要求,我们可以通过命令修改密码强度要求(这个是暂时的),给一个简单密码

1)设置密码等级:mysql> set global validate_password_policy=0;

2)设置密码长度:mysql>set global validate_password_length=0;

然后退出mysql

3)设置密码:mysql_secure_installation

再使用新密码进入mysql

4)设置从机同步账户mysql 密码redhat 从机ip172.25.53.2:

grant replication slave,reload,super on*.*to mysql@'172.25.53.2'identified by 'redhat';

检测:

MySQL主从复制的备份 mysql 5.7 主从复制_同步复制_05

将主节点状态显示的File与Position数据保存,一会节点同步要用

file:mysql-bin.000003

position:1019


从节点配置:

vim /etc/my.cnf:

添加server-id=2

/etc/init.d/mysqld start --- 启动服务


1)设置密码等级:mysql> set global validate_password_policy=0;

2)设置密码长度:mysql>set global validate_password_length=0;

然后退出mysql

3)设置密码:mysql_secure_installation

再使用新密码进入mysql

MySQL主从复制的备份 mysql 5.7 主从复制_同步复制_06

4)关掉slave

5)同步主机数据库(logfile和pos都是之前主机上show master status获取的,user和passwd是之前主机上的同步帐号)

6)关闭slave


这种同步是pos同步:文件日志中有一个pos值,这里让从节点从主节点的pos=1019处去同步数据,要同步的文档是mysql-bin.000003


检测:

MySQL主从复制的备份 mysql 5.7 主从复制_服务器_07

只要Slave_IO_Running和Slave_SQL_Running为yes,就代表同步成功,表示从节点(slave)上两个线程正常运行。





半同步复制配置:

mysql默认异步复制,在设置半同步之后,如果节点出了问题(master收不到slavedeack返回值),一定等待时间之后,系统会自动切换回异步复制

配置:

主节点:master

MySQL主从复制的备份 mysql 5.7 主从复制_mysql_08


rpl_semi_sync_master_enabled=ON表示开启半同步复制

rpl_semi_sync_master_timeout=1000默认1000毫秒,即10秒超时,将切换为异步复制

rpl_semi_sync_master_wait_no_slave表示是否允许master每个事物都要等待slave接收确认,默认为ON

rpl_semi_sync_master_trace_level=32表示用于开启半同步复制时的调试级别,默认32



从节点slave:

MySQL主从复制的备份 mysql 5.7 主从复制_服务器_09

rpl_semi_sync_slave_enabled=ON表示在slave已经开始半同步复制模式

rpl_semi_sync_slave_trace_level=32表示用于开启半同步复制时的调试级别,默认32

MySQL主从复制的备份 mysql 5.7 主从复制_mysql_10

rpl_semi_sync_master_status表示主服务器使用是异步还是半同步复制

rpl_semi_sync_master_client表示从服务器有多少个配置成半同步复制

rpl_semi_sync_master_yes_tx表示从服务器确认成功提交的数量

rpl_semi_sync_master_no_tx表示从服务器确认失败提交的数量


MySQL主从复制的备份 mysql 5.7 主从复制_mysql_11



rpl_semi_sync_slave_status表示从服务器开启半同步复制

测试:

模拟slave挂掉,master等待10s仍没接收到反馈信号,则转为异步复制模式,继续执行

首先同步创建数据库aa

1、slave执行stop slave;关闭主从复制

2、master在aa数据库中创建表tab2,,没接收到反馈信号,等待十秒后(Rpl_semi_sync_master_timeout=1000等待超时),继续执行

master:


MySQL主从复制的备份 mysql 5.7 主从复制_mysql_12


slave:

MySQL主从复制的备份 mysql 5.7 主从复制_MySQL主从复制的备份_13

3、master在数据库中再创建tab3,不需要等待反馈,直接执行

【当反馈超时时,master将切换到异步复制模式。此时是异步模式,不需要等待】


MySQL主从复制的备份 mysql 5.7 主从复制_服务器_14


4、slave执行start slave,数据开始同步,建立tab2、tab3,反馈给master,并切换为半同步复制

MySQL主从复制的备份 mysql 5.7 主从复制_mysql_15

5、slave执行stop slave;关闭主从复制

6、master在数据库中创建表tab5,此时需要等待10s,接收slave反馈信号;等待超时,切换为异步复制模式,继续执行

步骤4时,数据同步已经反馈给master,此时master已经是半同步复制模式】


MySQL主从复制的备份 mysql 5.7 主从复制_服务器_16