AB复制及用户
什么是AB复制
AB复制又称主从复制,实现的是数据同步。要做MySQL主从复制,数据库版本尽量保持一致。如果版本不一致,从服务器版本高于主服务器,不能做双向复制。
MySQL 主从复制的好处:第一解决宕机带来的数据不一致,因为MySQL 主从复制可以实时备份数据;第二减轻数据库服务器的压力,多台服务器的性能比单台要好。但是MySQL 主从复制不适用于大数据量,如果是大数据环境,推荐使用集群。
主从复制的作用:
1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问 的频率,提高单个机器的I/O性能。
3.读写分离,使数据库能支撑更大的并发。
(1)在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力(主库写,从库读,降压)。
(2)在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全。
主从复制的原理
原理: 实现整个主从复制,需要由Master服务器上的IO进程和Slave服务器上的Sql进程、IO进程共同完成。 要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为整个MySQL复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全顺序的执行日志中所记录的各种操作。
- 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
- 从库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
- 从库SQL线程读取中继日志中的事件,将其重放到从库数据库之上。
master 负责写 -----A(主)
slave relay-log -----B (从)
I/o 负责通信读取binlog日志
SQL 负责写数据
在主库上更新事件(update、insert、delete、create),被写到binlog日志中,从库发起连接,连接到主库 ,此时主库创建一个binlog dump thread的线程,把binlog日志里的内容发送到从库,从库启动之后,创建一个I/O线程来读取主库传过来的binlog内容并将它写入到relay log(中继日志)中,还会创建一个SQL线程用来从relay log里面读取内容,将更新的内容写入到slave(从库)。
主从复制binlog日志方式
两台机器的环境必须一致,时间也要相同,尽量安装同一版本的MySQL。
如果主服务器上有其它数据,则需要手动将它备份并拷贝到从服务器上,一定要保证环境一致。
在两台机器的hosts文件中配置解析
192.168.202.130 mysql-master
192.168.202.131 mysql-slave
配置主服务器
在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID(id为1)。需要重启服务器。
[root@xiaobai-master] systemctl stop firewalld;setenforce 0
#关闭两台机器的防火墙和SELinux
[root@xiaobai-master] systemctl start mysqld
[root@xiaobai-master] systemctl enable mysqld
#编辑主服务器的主配置文件 my.cnf ,添加如下内容
[mysqld]
log-bin=/var/log/mysql/mysql-bin/mysql_bin
server-id=1
退出主配置文件后创建binlog日志,并重启MySQL服务
[root@xiaobai-master] mkdir /var/log/mysql
[root@xiaobai-master] chown mysql.mysql /var/log/mysql
[root@xiaobai-master] systemctl restart mysqld
查找密码并修改
[root@xiaobai-master] grep password /var/log/mysqld.log
[root@xiaobai-master] mysqladmin -uroot -p'fpcM1ry:wqf*' password 'XiaoBai@123!'
用root用户登录MySQL并创建主从复制用户
mysql> grant replication slave on *.* TO 'bai'@'%' identified by 'XiaoBai@123!'; #创建主从复制用户bai并授权
mysql> flush privileges;
mysql> show master status \G #查看主服务器的二进制文件信息
==如果已经开启了二进制日志,但之前没有同步数据(环境不一致)则备份数据时语句要修改
[root@xiaobai-master] mysqldump -A --master-data=2 --lock-all-tables --flush-logs > all.sql
--flush-logs刷新二进制日志,可以记录刷新后的位置方便恢复使用
加入--single-transaction参数可以防止备份时写入或者加入--lock-all-tables锁表
#--master-data 有0,1,2三个参数是指对从服务器告诉从服务器从哪个二进制文件开始的(0表示不记录二进制文件位置,1表示记录二进制文件位置不注释,2表示记录二进制文件位置并注释)
配置从服务器
[root@xiaobai-slave] systemctl start mysqld
[root@xiaobai-slave] systemctl enable mysqld
#编辑从服务器的主配置文件 my.cnf ,添加如下内容
[mysqld]
server-id=2
[root@xiaobai-slave] systemctl restart mysqld
同主服务器一样查找密码并修改密码,登录MySQL
#在从服务器上指定和主服务器同步的信息
mysql> change master to
-> master_host='192.168.202.130',
-> master_port=3306,
-> master_user='bai',
-> master_password='XiaoBai@123!',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=588;
#只要不写分号可以敲回车换行写
#master_port默认端口3306可以不写
#master_host主服务器ip
mysql> start slave; #启动从服务器
mysql> show slave status \G #查看主从复制状态
Slave_IO_Running: No
检查以下几项
1、防火墙和SELinux
2、授权信息
3、检查master主机名是否能被slave解析
4、ping master主机的ip是否通
Slave_SQL_Running: No
检查以下几项
1、配置的master二进制日志名是否正确
2、配置的master二进制日志的位置是否正确
3、也可以查看/var/log/mysqld.log日志里的报错信息
M-S架构GTID基于事务ID复制
GTID
1、什么是GTID?
全局事务标识:global transaction identifiers 是用来代替传统复制的方法,GTID复制与普通复制模式 的大不同就是不需要指定二进制文件名和位置。
GTID工作原理
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
部署GTID主从复制
准备两台机器,关闭防火墙和selinux,两台机器环境必须一致,时间也要一致,gtid和binlog只能存在一个,id不能重复。
同样解析到/etc/hosts
启动MySQL服务并设为开机自启动
在两台机器的hosts文件中配置解析
192.168.202.130 mysql-master
192.168.202.131 mysql-slave
有数据先导数据
[root@xiaobai-master] mysqldump -uroot -p'XiaoBai@123!' --set-gtid-purged=OFF 库名 > test.sql #gtid开启
[root@xiaobai-master] ls
test.sql
[root@xiaobai-master] scp test.sql 192.168.202.131:/root/
开启 GTID 后的导出导入数据的注意点
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don’t want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events
意思是: 当前数据库实例中开启了 GTID 功能, 在开启有 GTID 功能的数据库实例中, 导出其中任何一个 库, 如果没有显示地指定 --set-gtid-purged参数, 都会提示这一行信息. 意思是默认情况下, 导出的库中含有 GTID 信息, 如果不想导出包含有 GTID 信息的数据库, 需要显示地添加 --set-gtid-purged=OFF参数
mysqldump -uroot -p --set-gtid-purged=OFF --all-databases > alldb.db
导出入数据是就可以相往常一样导出入了
主服务器配置
[root@xiaobai-master] vim /etc/my.cnf
[mysqld]
server-id=1
log-bin = mylog
gtid_mode = ON #开启gtid
enforce_gtid_consistency #强制gtid
[root@xiaobai-master] systemctl restart mysqld
#登录mysql创建用户并授权
#刷新权限,注意:如果不成功删除以前的binlog日志
从服务器操作及配置
[root@xiaobai-slave] mysql -uroot -p'XiaoBai@123!'
mysql> create database 库名; #库名要和主服务器上的一样,然后退出
[root@xiaobai-slave] mysql -uroot -p'XiaoBai@123!' test < test.sql
[root@xiaobai-slave] vim /etc/my.cnf
[mysqld]
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
[root@xiaobai-slave] systemctl restart mysqld
#登录MySQL
mysql> change master to
-> master_host='192.168.202.131', #主ip,地址,最好用域名
-> master_user='授权用户', #主服务上面创建的用户
-> master_password='授权密码',
-> master_auto_position=1;
mysql> start slave;
mysql> show slave status \G
#IO和SQL两个地方都为yes则成功
注意: 在关闭和启动mysql服务的时候按顺序先启动master。