1、主从复制(附实验)
1.1 主从复制原理
- 主节点负责用户的写操作,用户发起写操作后,会修改数据库
- 数据库修改后,会更新主节点上的二进制日志
- 从服务器会开启io线程,主动请求和主服务器一致
- 主服务器会产生一个 dump线程, 一边读取二进制日志一边将二进制日志通过 网络传给从服务器
- 从服务器会写入中继日志,这时只是生成了一个文件,并没有同步
- 从服务器再开启 sql线程将 中继日志中 操作写入数据库完成更新
主要是:两个日志,三个线程。
1.2 主从复制实验
实验环境:
主节点 192.168.125.130
从节点 192.168.125.150
实验目的:使主节点的数据和从节点的数据保持一致
- 主节点设置:
js
`关闭防火墙:`
systemctl stop firewalld
setenforce 0
`开启二进制日志:`
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server_id=130
log-bin=/data/mysql-bin
read-only=ON
`修改权限并重启:`
[root@localhost ~]#mkdir /data/ -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
mysql -uroot -pabc123 -e "select @@server_id;" //也可以免交互查看
`设置复制用户和密码:`
set global validate_password_policy=0; //特殊字符
set global validate_password_length=1; //密码长度
grant replication slave on *.* to wxy@'192.168.125.%' identified by 'abc123';
`查看二进制文件:`
show master status; //查看二进制日志位置
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
show processlist;
#查看线程 对面从服务器,连过来之后才能查看
- 从节点设置:
js
`开启二进制日志:`
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
server_id=150
log-bin=/data/mysql-bin
read-only=ON //可选项,尽量加
`修改权限并重启:`
[root@localhost ~]#mkdir /data/ -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
`io线程接收二进制日志:`
CHANGE MASTER TO //可以查看help change master to命令
MASTER_HOST='192.168.125.130',
MASTER_USER='wxy',
MASTER_PASSWORD='abc123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', //这两项要与主节点的show master status命令内容保持一致
MASTER_LOG_POS=154; //注意最后分号!!!
`开启线程,并查看状态:`
(root@localhost) [(none)]> start slave;
#开启线程,开启主从复制
(root@localhost) [(none)]> show slave status\G; //查看设置的状态
##如果未开启或者有问题就是No
Slave_IO_Running: Yes //io线程要是yes
Slave_SQL_Running: Yes //sql线程也要是yes
Seconds_Behind_Master: null或0 //目前数据差异,大于0就是数据不同步
#如果两个线程不是yes
(root@localhost) [(none)]> stop slave;
(root@localhost) [(none)]> reset slave all;
重新配置
- 主节点测试
js
create database wxy;
#在主节点上建立数据测试
#主节点和从节点内容一致,即为成功!
(root@localhost) [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| sys |
| wxy |
+--------------------+
2、主从复制+完全备份实验
实验环境:
主节点 192.168.125.130
从节点 192.168.125.150
实验目的:主节点的数据库已经运行一段时间,产生了一定量的数据,主从复制只能复制开启后数据,主从之间如果要保持完全一致,之前的数据要通过完全备份进行同步
- 主节点设置
js
`关闭防火墙、加载hellodb数据库:`
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# mysql -uroot -pabc123 < hellodb_innodb.sql
`开启二进制日志:`
[root@localhost ~]# vim /etc/my.cnf
server-id=130
log-bin=/data/mysql-bin
[root@localhost ~]# mkdir -p /data/
[root@localhost ~]# chown mysql.mysql /data/ -R
[root@localhost ~]# systemctl restart mysqld
`备份所有数据库和表,并压缩`
[root@localhost ~]# mysqldump -uroot -pabc123 -A -F --master-data=1 --single-transaction |gzip > /data/all.sql.gz
`将二进制日志,远程拷贝到从节点`
[root@localhost ~]# scp -r /data/all.sql.gz 192.168.125.150:/opt
[root@localhost ~]# mysql -uroot -pabc123
`创建主从复制用户`
create user wxy@'192.168.125.%' identified by "Admin@123"; #新建主从复制用户
grant replication slave on *.* to wxy@'192.168.125.%'; # 授权主从复制用户
- 从节点设置
js
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
`开启二进制日志:`
[root@localhost ~]#vim /etc/my.cnf
server-id=150
log-bin=/data/mysql-bin
[root@localhost ~]# mkdir -p /data/
[root@localhost ~]# chown mysql.mysql /data/ -R
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# gzip -d /opt/all.sql.gz
`修改备份脚本:`
[root@localhost ~]# vim /opt/all.sql
##找到CHANGE MASTER TO的行,修改如下:
CHANGE MASTER TO
MASTER_HOST='192.168.125.130',
MASTER_USER='wxy',
MASTER_PASSWORD='Admin@123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;
###由于之前备份时加入了 --master-data=1 选项,就添加了主从复制的选项000002文件的154位置往后开始主从复制。000002文件154位置之前的配置,由备份文件自行实现
`导入数据库:`
[root@localhost ~]#mysql -uroot -pabc123
mysql> set sql_log_bin=0; #关闭二进制日志
mysql> source /opt/all.sql #导入数据库
mysql> start slave; #开启从节点
mysql> show slave status\G; #查看从节点的状态
3、级联主从复制 实验
- 主节点设置
js
root@localhost ~]#vim /etc/my.cnf
[mysqld]
server_id=130
log-bin=/data/mysql-bin
read-only //主节点尽量不要设置只读。因为主节点一般都是性能好的设备,可以进行读写,只读适合在从节点上设置。
[root@localhost ~]#mkdir /data -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
select @@server_id;
#可以查看serverid 默认都是1
set global validate_password_policy=0;
set global validate_password_length=1;
#密码策略
grant replication slave on *.* to wxy@'192.168.125.%' identified by 'abc123';
#建立复制用户
select user,host from mysql.user;
#查看用户信息表
show master status;
#查看二进制日志位置,先创建用户,再查看位置
show processlist;
#查看线程
- 二级节点(既是主,也是从)
二级节点对于主,属于从;但是对于下面的从,又是主。
js
root@localhost ~]#vim /etc/my.cnf
#修改文件
[mysqld]
server_id=150
log-bin=/data/mysql-bin
read-only
log_slave_updates //注意 这个设置一定要加
[root@localhost ~]#mkdir /data/ -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
CHANGE MASTER TO
MASTER_HOST='192.168.125.130',
MASTER_USER='wxy',
MASTER_PASSWORD='abc123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=448;
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to wxy@'192.168.125.%' identified by 'abc123';
start slave;
#开启线程,开启主从复制
show slave status\G;
#查看设置的状态
Seconds_Behind_Master: NULL
#目前数据差
show master logs;
#查看 从节点的复制位置
- 从节点设置
js
root@localhost ~]#vim /etc/my.cnf
#修改文件
[mysqld]
server_id=100
log-bin=/data/mysql-bin
read-only
[root@localhost ~]#mkdir /data -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
CHANGE MASTER TO
MASTER_HOST='192.168.125.150',
MASTER_USER='wxy',
MASTER_PASSWORD='abc123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=448;
show slave status\G;
#查看设置的状态
Seconds_Behind_Master: NULL
#目前数据差
start slave;
#开启线程,开启主从复制
4、半同步主从复制 实验
推荐行row,然后是混合,不推荐语句模式
- 主服务器:
192.168.125.130
js
[root@localhost ~]#rpm -ql mysql-community-server |grep semisync //查看插件
[root@localhost ~]#vim /etc/my.cnf
#修改文件
[mysqld]
server_id=130
log-bin=/data/mysql-bin
read-only
#rpl_semi_sync_master_enabled=ON
#rpl_semi_sync_master_timeout=3000
#修改此行,需要先安装semisync_master.so插件后,再重启,否则无法启动 开启半同步
#设置3s内无法同步,也将返回成功信息给客户端
[root@localhost ~]#mkdir /data/ -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
[root@localhost ~]#mysql -uroot -pabc123
#需要安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #永久安装插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1; #临时修改变量,没装插件,会报错
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 3000; #超时长1s,默认值为10s
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
#查看半同步状态
mysql> show global status like '%semi%';
#查看半同步客户端
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to wxy@'192.168.125.%' identified by 'abc123';
#建立复制用户
show master status;
- 从节点1:
192.168.125.150
js
[root@slave1 ~]#vim /etc/my.cnf
[mysqld]
server-id=150
log-bin=/data/mysql-bin
#rpl_semi_sync_slave_enabled=ON #修改此行,需要先安装semisync_slave.so插件后,再重启,否则无法启动
[root@localhost ~]#mkdir /data/ -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安装插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1; #临时修改变量
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql> show global status like '%semi%';
#查看状态 主从状态
CHANGE MASTER TO
MASTER_HOST='192.168.125.130',
MASTER_USER='wxy',
MASTER_PASSWORD='abc123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=448;
注意最后分号
start slave;
show slave status\G;
- 从节点2:
192.168.125.100
js
[root@slave1 ~]#vim /etc/my.cnf
[mysqld]
server-id=100
log-bin=/data/mysql-bin
#rpl_semi_sync_slave_enabled=ON #修改此行,需要先安装semisync_slave.so插件后,再重启,否则无法启动
[root@localhost ~]#mkdir /data/ -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安装插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1; #临时修改变量
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql> show global status like '%semi%';
#查看 主从状态
CHANGE MASTER TO
MASTER_HOST='192.168.125.130',
MASTER_USER='wxy',
MASTER_PASSWORD='abc123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=448;
start slave;
show slave status\G;
- 测试
模拟把从2服务器停掉,主和从1服务器仍能正常同步,实验成功。
js
从2:
mysql> stop slave;
5、复制错误解决方法
主从之间不一致时,如何解决:
- 手动修复:适用于 主从之间数据差距不大 的情况
- 重建从服务器:适用于数据差比较大 的情况
总结: