一、mysql主从复制的基本原理
我们实现的是 mysql 的异步复制
异步复制:即一条语句开始,主服务器不会等待从服务器执行完,而是主服务器一执行完就开始下一条语句,这是对主服务器并发型的考虑
slave 端会开启两个 thread,Slave I/O thread 和 Slave SQL thread,Slave I/O thread 负责从 master 的二进制日志中读取事件并将这些时间信息存放发到 relay-log 中,Slave SQL thread 负责从 relay-log 日志读取事件,并重放其中的事件而更新 slave 的数据,使其与 master 中的数据一致
主服务器上必须开启二进制日志,而从服务器上只需开启中继日志
二、服务器详情
机器 | IP |
---|---|
主机 | 192.168.1.1 |
从机 | 192.168.1.2 |
三、主从配置
1. 主机配置
修改 my.cnf 配置文件
vim /etc/my.cnf
## 开启二进制日志并指定 server-id
log-bin=mysql-bin
binlog_format=mixed
server-id=1
重启 mysql
service mysql restart
创建具有复制权限的用户 ,此处 Mysql 5.7 和 Mysql 8.0 有些区别
========================================= Mysql 5.7 ============================================
## 使用 root 账户,其他账户会有权限不足的情况
mysql -uroot -p
## 这句话意思是,主机允许 slave 用户,通过密码 123456,在 192.168.1.2 这台服务器上访问当前这台 master
mysql> grant replication slave on *.* to slave@192.168.1.2 identified by '123456';
## 刷新
flush privileges;
===============================================================================================
========================================= Mysql 8.0 ============================================
## 使用 root 账户,其他账户会有权限不足的情况
mysql -uroot -p
## mysql8.0 授权用户需要先创建,创建和授权同一条语句的话会报错
mysql> create user 'slave'@'192.168.1.2' identified by '123456';
## 再授权
mysql> grant replication slave on *.* to 'slave'@'192.168.1.2' with grant option;
## 刷新
flush privileges;
===============================================================================================
查看 master 信息
mysql> show master status;
2. 从机配置
修改 my.cnf 配置文件
vim /etc/my.cnf
## 开启中继日志并指定 server-id 和 只读
# log-bin=mysql-bin
# binlog_format = mixed
relay-log=mysql-relay-bin
server-id=2
read-only=on
重启 mysql
service mysql restart
让从机成为 Slave
mysql -uroot -p
mysql> stop slave;
## 设置从机监听主机:master_log_file 和 master_log_pos 与主机 master 信息一致
mysql> change master to master_host='192.168.1.1',master_user='slave',master_password='123456',master_log_file='mysql-bin.000008', master_log_pos=106;
mysql> start slave;
查看 Slave 状态
mysql> show slave status\G;
## 等待主机发送事件
Slave_IO_State : Waiting for master to send event
## 若它为 No,检查下主机防火墙是否已关闭
Slave_IO_Running: Yes
## 这俩项都是 yes 则配置成功
Slave_SQL_Running: Yes
3. 测试
在主机增删改操作,从机也会执行同样的操作