【mysql】之主从复制

1、主从复制(附实验)

1.1 主从复制原理

  1. 主节点负责用户的写操作,用户发起写操作后,会修改数据库
  2. 数据库修改后,会更新主节点上的二进制日志
  3. 从服务器会开启io线程,主动请求和主服务器一致
  4. 主服务器会产生一个 dump线程, 一边读取二进制日志一边将二进制日志通过 网络传给从服务器
  5. 从服务器会写入中继日志,这时只是生成了一个文件,并没有同步
  6. 从服务器再开启 sql线程将 中继日志中 操作写入数据库完成更新

主要是:两个日志,三个线程。

1.2 主从复制实验

实验环境:

主节点 192.168.125.130

从节点 192.168.125.150

实验目的:使主节点的数据和从节点的数据保持一致

  1. 主节点设置:
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;
 #查看线程  对面从服务器,连过来之后才能查看
  1. 从节点设置:
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;
 重新配置
  1. 主节点测试
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

实验目的:主节点的数据库已经运行一段时间,产生了一定量的数据,主从复制只能复制开启后数据,主从之间如果要保持完全一致,之前的数据要通过完全备份进行同步

  1. 主节点设置
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.%';         # 授权主从复制用户  
  1. 从节点设置
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、复制错误解决方法

主从之间不一致时,如何解决:

  • 手动修复:适用于 主从之间数据差距不大 的情况
  • 重建从服务器:适用于数据差比较大 的情况

总结:

相关推荐
IT技术分享社区3 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
桀桀桀桀桀桀4 分钟前
数据库中的用户管理和权限管理
数据库·mysql
TeYiToKu39 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws42 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
yeyuningzi1 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
上辈子杀猪这辈子学IT1 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian
minihuabei1 小时前
linux centos 安装redis
linux·redis·centos
lldhsds2 小时前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
wowocpp3 小时前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君3 小时前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别