主从复制原理
**1.**msater将执行的事务写入二进制日志中
**2.**slave将master的binary log拷贝到自己的中继日志中
首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志
**3.**sql(slave上)线程从中继日志中读取事件,更新数据
异步复制
mysql异步复制过程:
基于binary log 和position异步复制
前提环境:
准备两台机器(服务器,我用的是centos7系统两台)两台机器需在同一网段,firewalld、selinux服务
1.数据保持一致:
即通过mysql(还原)和mysqldump(全备)命令将两台机器数据达到一致
**a.**在master全备-------------mysqldump -uroot -p’123456’ --all-databases >/lianxi/henhuan_dump.sql
**b.**将文件用scp命令传输到slave上-------------------scp /lianxi/henhuan_dump.sql root@192.168.31.182:/root
c. 在slave上将数据还原----------------mysql -uroot -p’henhuan123456’ <henhuan_dump.sql
2.配置文件:
**a.**在master配置文件中(/etc/my.cnf)加入两行:
[mysqld]
log_bin
server_id=1
**b.**在slave配置文件加入一行即可:
server_id=1
**c.**在master创建用户并授权(用来让slave来拿数据的用户)
创建用户-----CREATE USER ‘henhuan_slave’@’%’ IDENTIFIED BY ‘123456’;
授权-------GRANT REPLICATION SLAVE ON . TO ‘henhuan_slave’@’%’;
**d.**在slave运行语句:
root@(none) 16:13 mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.0.165’ ,
-> MASTER_USER=‘henhaun_slave’,
-> MASTER_PASSWORD=‘123456’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=‘sc-mysql-bin.000007’,
-> MASTER_LOG_POS=154;
注意:sc-mysql-bin.000007需要在master使用rshow master status命令查看,当前master的位置号
**e.**开启服务,运行start slave;
使用show slave status\G;查看状态,当下面两行都位yes即成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
**f.**可以进行测试,在master改变数据,slave数据是否发送改变
基于GTID的异步复制
**a.**在基于上面位置号的主从复制基础上更改配置:在master加入两条配置:
gtid-mode=ON
enforce-gtid-consistency=ON
再slave上加入四条配置:
log_bin
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave-updates=ON
**b.**再slave上清除配置reset master;再停止服务stop slave
最后再重新配置:
root@(none) 16:42 mysql>CHANGE MASTER TO MASTER_HOST=‘192.168.0.165’ ,
-> MASTER_USER=‘henhuan_slave’,
-> MASTER_PASSWORD=‘123456’,
-> MASTER_PORT=3306,
-> master_auto_position=1;
**c.**start slave开启服务,测试是否成功
同步复制
组复制-------------------------
需要讨论----原理–由若干个节点共同组成的一个复制组,一个事务的提交
必须经过组内大多数节点(n/2 +1)决议通过
半同步复制
mysql-semi-sync过程:
半同步配置过程:
1.master执行
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
2.在slave上执行
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
查看插件手否安装成功
root@(none) 10:29 mysql>show plugins;
3.设置系统变量,master上
root@(none) 10:28 mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;
4.设置系统变量,slave上
root@(none) 10:29 mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
5.在slave上执行
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
6.查看半同步是否开启
show global variables like ‘%rpl_semi%’;