mysql主从复制
原理:
MySQL从3.23版本开始提供复制功能,复制主要是指将主服务器的DDL和DML操作,通过二进制日志(binLog日志),传到服务的服务器上,然后在从服务器上对这些日志从新执行,从而实现从服务器与主服务器的数据同步。MySQL支持一台主服务器同时向多台从服务器进行复制,从服务器同时也可以作为其他服务器的主服务器,实现链状的复制。
Mysql主从复制的实现原理图大致如下(来源网络):
主从复制分两种,异步复制和半同步复制,mysql默认异步复制
异步同步:
在主节点上执行命令以后生成一个日志文件,然后将日至文件发送给从节点,最后提交,从节点收到日志文件后,开始同步里边的数据(事物),最后得到与主节点一致的数据, 效果图如下(图片来源于京东发布的MGR官方文档)
半同步复制:
半同步复制是在协议中添加一个同步步骤,主节点在发送完日志文件之后,等待来自节点的回应,收到从节点的同步确认之后才去提交数据(保证数据一定被备份了)
效果图如下(图片来源于京东发布的MGR官方文档)
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
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';
检测:
将主节点状态显示的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
4)关掉slave
5)同步主机数据库(logfile和pos都是之前主机上show master status获取的,user和passwd是之前主机上的同步帐号)
6)关闭slave
这种同步是pos同步:文件日志中有一个pos值,这里让从节点从主节点的pos=1019处去同步数据,要同步的文档是mysql-bin.000003
检测:
只要Slave_IO_Running和Slave_SQL_Running为yes,就代表同步成功,表示从节点(slave)上两个线程正常运行。
半同步复制配置:
mysql默认异步复制,在设置半同步之后,如果节点出了问题(master收不到slavedeack返回值),一定等待时间之后,系统会自动切换回异步复制
配置:
主节点:master
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:
rpl_semi_sync_slave_enabled=ON表示在slave已经开始半同步复制模式
rpl_semi_sync_slave_trace_level=32表示用于开启半同步复制时的调试级别,默认32
rpl_semi_sync_master_status表示主服务器使用是异步还是半同步复制
rpl_semi_sync_master_client表示从服务器有多少个配置成半同步复制
rpl_semi_sync_master_yes_tx表示从服务器确认成功提交的数量
rpl_semi_sync_master_no_tx表示从服务器确认失败提交的数量
rpl_semi_sync_slave_status表示从服务器开启半同步复制
测试:
模拟slave挂掉,master等待10s仍没接收到反馈信号,则转为异步复制模式,继续执行
首先同步创建数据库aa
1、slave执行stop slave;关闭主从复制
2、master在aa数据库中创建表tab2,,没接收到反馈信号,等待十秒后(Rpl_semi_sync_master_timeout=1000等待超时),继续执行
master:
slave:
3、master在数据库中再创建tab3,不需要等待反馈,直接执行
【当反馈超时时,master将切换到异步复制模式。此时是异步模式,不需要等待】
4、slave执行start slave,数据开始同步,建立tab2、tab3,反馈给master,并切换为半同步复制
5、slave执行stop slave;关闭主从复制
6、master在数据库中创建表tab5,此时需要等待10s,接收slave反馈信号;等待超时,切换为异步复制模式,继续执行
步骤4时,数据同步已经反馈给master,此时master已经是半同步复制模式】