AB复制(主从复制)

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端完全顺序的执行日志中所记录的各种操作。

  1. 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
  2. 从库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
  3. 从库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
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 > all.sql
#--master-data 参数是指对从服务器告诉从服务器从哪个二进制文件开始的

配置从服务器

[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。

文中内容适用于初学者 @小白

发布了17 篇原创文章 · 获赞 19 · 访问量 1105

猜你喜欢

转载自blog.csdn.net/little_baixb/article/details/104927855