MySQL 主从复制原理及工作过程
原理
MySQL 主从复制通过二进制日志(binlog)实现数据同步。主库(Master)将数据变更记录到 binlog 中,从库(Slave)通过 I/O 线程拉取 binlog 并保存为本地中继日志(relay log),再由 SQL 线程重放中继日志中的操作,从而实现数据同步。
工作过程
主库记录日志:主库将数据变更写入 binlog。
从库连接主库:从库的 I/O 线程连接主库,请求 binlog。
传输日志:主库的 binlog dump 线程将 binlog 发送给从库。
从库应用中继日志:从库的 I/O 线程将收到的 binlog 写入 relay log,SQL 线程重放 relay log 中的操作。
1、基于binlog的主从同步
Master配置
bash
[root@Master ~]# yum install -y mysql-server
#配置文件,注意://三台主从库的id必须不同
[root@Master ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=1 //直接在后面添加
[root@Master ~]# systemctl restart mysqld
#授权用户
mysql> create user rep@'192.168.1.%' identified with mysql_native_password by '123456';
mysql> grant replication slave on *.* to rep@'192.168.1.%';
mysql> show master status; //查看主服务器状态,日志用于从服务器同步,position是当前定位
Slave配置
bash
#配置文件
[root@Slave1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=2
[root@Slave1 ~]# systemctl restart mysqld
[root@Slave3 ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=3
[root@Slave3 ~]# systemctl restart mysqld
#设置复制参数,两个Slave一样的配置
mysql> change master to
-> master_host='192.168.1.11',
-> master_user='rep',
-> master_password='123456',
-> master_log_file='binlog.000001',
-> master_log_pos=1640,
-> get_master_public_key=1;
#启动复制进程,两个Slave都启动
mysql> start slave;
查看主从数据库的uuid是否一致
bash
SHOW GLOBAL VARIABLES LIKE 'server_uuid';
##########如果一致
# 停止从库 MySQL 服务
sudo systemctl stop mysql
# 删除从库 auto.cnf 文件
sudo rm /var/lib/mysql/auto.cnf
# 启动从库 MySQL 服务
sudo systemctl start mysql
-- 登录从库 MySQL
-- 停止从库复制进程
STOP SLAVE;
-- 启动从库复制进程
START SLAVE;
-- 检查从库复制状态
SHOW SLAVE STATUS \G;
验证
bash
#在主库创建一个数据库,看从库是否同步生成
mysql> create database feng;
Query OK, 1 row affected (0.01 sec)
2、 基于gtid的主从同步配置
开启gtid
bash
##主从一样
[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@localhost ~]# systemctl restart mysqld;
[root@localhost ~]# tail -3 /etc/my.cnf.d/mysql-server.cnf
server_id=142
gtid_mode=ON
enforce-gtid-consistency=ON
Master配置
bash
#修改配置文件
[root@Master ~]# vim /etc/my.cnf.d/mysql-server.cnf
#在最后添加
gtid_mode=ON
enforce-gtid-consistency=ON
#重启MySQL服务
[root@Master ~]# systemctl restart mysqld.service
#重置二进制日志和GTID
mysql> reset master;
#创建用户授予权限
mysql> create user rep@'192.168.1.%' identified with mysql_native_password by '123456'; //报错不影响因为之前创建过
mysql> grant replication slave on *.* to rep@'192.168.1.%';
#重新加载授权表
mysql> flush privileges;
Slave配置
bash
#Slave1和3相同配置
#修改配置文件
[root@Slave1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
#重启服务
[root@Slave1 ~]# systemctl restart mysqld.service
#配置连接到主库
mysql> change replication source to
-> source_host='192.168.1.11',
-> source_port=3306,
-> source_user='rep',
-> source_password='123456',
-> source_auto_position=1;
mysql> start replica;
验证
bash
#主
mysql> create database fengfeng;
Query OK, 1 row affected (0.01 sec)