一:MYSQL REPLICATION
什么是MYSQL replication
- Replication可以实现将数据从一台数据库服务器(master)复制到一或多台数据库服务器(slave)
- 默认情况下属于异步复制,无需维持长连接
- 通过配置,可以复制所有的库或者几个库,甚至库中的一些表
- 是MySQL内建的,本身自带的
REPLICATION的作用
1、Fail Over 故障切换
2、Backup Server 备份服务,无法对SQL语句执行产生的故障恢复,有限的备份
3、High Performance /pə’fɔːm(ə)ns/ 高性能,可以多台slave,实现读写分离
REPLICATION如何工作
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,修改salve上的数据。
mysql主从复制中:
第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
第三步:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
REPLICATION常见方案:
1、ONE MASTER AND MUTI SALVE 一主多备
一般用来做读写分离的,master写,其他slave读,这种架构最大问题I/O压力集中
在Master上 <多台同步影响IO>
2、M-S-S
使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates
Slave中继可使用 Black-hole 存储引擎,不会把数据存储到磁盘,只记录二进制日志
3、M-M 双主互备 (互为主从)
很多人误以为这样可以做到MySQL负载均衡,实际没什么好处,每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性
4、M-M-M
监控三台机器互相做对方的master
天生的缺陷:复制延迟,slave上同步要慢于master,如果大并发的情况那延迟更严重
Mysql在5.6已经自身可以实现fail over故障切换
5、ONE SLAVE MUTI MASTER 一从对多主
好处:节省成本,将多个master数据自动化整合
缺陷:对库和表数据的修改较多
配置主数据库服务器XUEGOD63
创建需要同步的数据库:
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
service mysqld stop
配置my.cnf:
vim /etc/my.cnf
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
重启mysql ( 如果重启卡死现象,kill掉再启动)
Systemctl restart mysqld
授权:
mysql> grant replication slave on *.* to slave@10.10.10.64 identified by "123456";
查看状态信息:
mysql> show master status;
复制前要保证同步的数据库一致
mysqldump -uroot -p123456 HA >HA.sql #可以导出数据库
将导出的数据库传给从服务器
方法:scp HA.sql 10.10.10.64:/root
配置从数据库服务器XUEGOD64
导入数据库,和主数据库服务器保持一致
mysql> create database HA;
mysql -uroot -p123456 HA<HA.sql
修改从服务器配置文件:
从服务器没必要开启bin-log日志
mysql>stop slave; #停止slave
mysql> change master to master_host='10.10.10.63',master_user='slave',master_password='123456';
mysql> start slave; #启动slave
三:部署MYSQL主主双向主从复制 M-M(恢复快照再实验)
通过mysql主主:进行mysql 双向同步数据库HA的配置
mysql主:服务端:XUEGOD63 IP:10.10.10.63
mysql主:服务端:XUEGOD64 IP:10.10.10.64
如果没有恢复快照要先清空一下二进制日志,mysql> reset master
在上面主从的基础上进行配置
配置XUEGOD63
它有两种身份:
身份1: XUEGOD64的主。 身份2: XUEGOD64的从。
vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin-master
binlog-do-db=HA
binlog-ignore-db=mysql #避免同步mysql用户 相关配置
service mysqld restart
授权:
mysql> grant replication slave on *.* to slave@'10.10.10.%' identified by '123456';
如果不符合密码要求修改如下(5.7版本)
mysql> set global validate_password_policy=0; #定义复杂度
mysql> set global validate_password_length=1; #定义长度 默认是8
关闭密码强度审计,在my.cnf添加validate-password=off
grant replication slave on *.* to slave@'10.10.10.%' identified by '123456';
mysql> flush privileges;
#记得刷新授权表
先测试一下从帐号登陆是否正常
[root@xuegod64 ~]# mysql -uslave -p123456 -h 10.10.10.63
然后作主授权给从xuegod63,
[root@xuegod64 ~]# grant replication slave on *.* to slave@'10.10.10.63' identified by '123456';
指定哪台是xuegod64的master
[root@XUEGOD64 ~]# mysql -uroot -p123456
mysql> stop slave;
mysql> change master to master_host='10.10.10.63' master_user='slave',master_password='123456';
mysql> start slave;
mysql> show slave status\G
再回来配置XUEGOD63
先测试一下从帐号登陆是否正常
[root@xuegod63~]# mysql -uslave -p123456 -h 10.10.10.64 #可以登陆
指定哪台是xuegod63的master
[root@XUEGOD63 ~]# mysql -uroot -p123456
mysql> change master to master_host='10.10.10.64',master_user='slave',master_password='123456';
mysql> start slave;
mysql> show slave status\G
插入数据测试 同步成功
mysql> show slave status \G
注意如果是复制mysql数据,uuid相同会导致同步不成功。auto.cnf
https://www.cnblogs.com/xusx/articles/6597748.html
删除主从复制
stop slave;
reset slave all;
来源:https://blog.csdn.net/qq_36180226/article/details/100938909