当前位置: 首页 > news >正文

MySQL的主从复制

目录

一. 主从复制

1.1 什么是主从复制

1.2 工作原理

1.3 主从复制的模式

1.4 主从复制的配置实例

1.5 半同步复制的配置实例

面试题

造成主从不一致的原因

主从不一致修复方法


一. 主从复制

1.1 什么是主从复制

主从复制是一种数据复制技术,主要用于提高数据库的可用性和读取性能。

  • 主服务器:负责处理写操作,并将数据变更记录到二进制日志中。
  • 从服务器:从主服务器获取二进制日志,并在本地重放这些日志,以保持与主服务器的数据同步。

1.2 工作原理

 

  1. 主服务器数据变更:当主服务器发生数据更新时,这些变更会被记录到二进制日志中。

  2. 从服务器探测变更:从服务器(Slave)通过I/O线程实时监测主服务器的二进制日志,一旦发现日志有更新,立即向主服务器请求最新的二进制日志事件。

  3. 主服务器发送日志:主服务器为每个从服务器的I/O线程创建一个dump线程,用于将二进制日志事件发送给从服务器。

  4. 从服务器保存日志:从服务器的I/O线程接收到二进制日志事件后,将其保存到本地的中继日志(Relay Log)中。

  5. 从服务器重放日志:从服务器启动SQL线程,从中继日志中读取二进制日志事件,并将其解析为SQL语句逐一执行,确保从服务器的数据与主服务器保持一致。

  6. 线程休眠:完成数据同步后,I/O线程和SQL线程进入休眠状态,等待下一次数据变更的唤醒。

1.3 主从复制的模式

  1. 异步复制

    • 特点:主服务器(Master)在写入数据后,不会等待从服务器(Slave)确认,直接返回成功。
    • 优点:性能高,主服务器的写入操作不受从服务器的影响。
    • 缺点:数据一致性较弱,可能存在数据延迟或丢失的风险。
  2. 半同步复制

    • 特点:主服务器在写入数据后,会等待至少一个从服务器确认收到数据,然后才返回成功。
    • 优点:数据一致性较强,减少了数据丢失的风险。
    • 缺点:性能略低于异步复制,因为需要等待从服务器的确认。
  3. 全同步复制

    • 特点:主服务器在写入数据后,会等待所有从服务器确认收到数据,然后才返回成功。
    • 优点:数据一致性最强,几乎不存在数据丢失的风险。
    • 缺点:性能较低,因为需要等待所有从服务器的确认。

1.4 主从复制的配置实例

实验准备

Ubuntu(192.168.52.105)为主服务器
Ubuntu1(192.168.52.31)和Ubuntu2(192.168.52.107)为备服务器
#在主服务器和备服务器上,确保安装相同版本的MySQL数据库
apt search mysql
apt-get update
apt install mysql-server-8.0 -y#在主服务器上操作
#下载hellodb,模拟主服务器运行了一段时间, 有一定的数据
mysql -u root < hellodb_innodb.sql#完全备份,并发送到备服务器
mysqldump -uroot -A -F  --single-transaction --source-data  >  /opt/all.sql
scp  /opt/all.sql     192.168.52.31:/opt
scp  /opt/all.sql     192.168.52.107:/opt#备服务器接收
mysql -uroot < /opt/all.sql

Ubuntu1和Ubuntu2同理,这里只展示Ubuntu1接收 

#在主服务器上
vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
server-id=31  
systemctl   restart  mysql#登录mysql,新建用户+授权
mysql  
create  user  test@'192.168.52.%'  identified  by "abc123";
grant replication slave on *.* to test@'192.168.52.%';#更改认证插件
ALTER USER 'test'@'192.168.52.%' IDENTIFIED WITH mysql_native_password BY 'abc123';#看节点
show  master  status;#可以看到mysqldump线程
show  processlist;   

 

#从服务器操作
vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
server-id=32
systemctl   restart  mysql#另一个从服务器
vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
server-id=33
systemctl   restart  mysql#登录msyql
CHANGE MASTER TO 
MASTER_HOST = '192.168.52.105',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT =  3306,
#以下两项由主服务器的show master status而来,不要一味复制
MASTER_LOG_FILE = 'binlog.000005',
MASTER_LOG_POS = 1005;#启动主从复制
start   slave;#查看主从复制的状态
show  slave  status\G;  #如果发送错误
stop  slave;   #关闭线程
reset   slave  all;  #清空配置
#重做“#登录mysql”那一步

 两个备服务器操作完全一样,以下只展示Ubuntu1的操作

#进行实验结果认证
#在主服务器创建一个数据库,看备服务器是否有反映
create database dhf;

 

1.5 半同步复制的配置实例

实验准备

Ubuntu(192.168.52.105)为主服务器
Ubuntu1(192.168.52.31)和Ubuntu2(192.168.52.107)为备服务器
#在主服务器上
vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
server-id=31
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000
systemctl   restart  mysql#登录mysql,安装半同步复制的主服务器插件,新建用户+授权
mysql
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'  
create  user  test@'192.168.52.%'  identified  by "abc123";
grant replication slave on *.* to test@'192.168.52.%';#更改认证插件
ALTER USER 'test'@'192.168.52.%' IDENTIFIED WITH mysql_native_password BY 'abc123';#看节点
show  master  status;#可以看到mysqldump线程
show  processlist;   

 

 

​
#从服务器操作
vim  /etc/mysql/mysql.conf.d/mysqld.cnf
#配置用于在MySQL中启用从服务器的半同步复制功能。
rpl_semi_sync_slave_enabled=ON 
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
server-id=32
systemctl   restart  mysql#另一个从服务器
vim  /etc/mysql/mysql.conf.d/mysqld.cnf
rpl_semi_sync_slave_enabled=ON 
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
server-id=33
systemctl   restart  mysql#登录msyql
#配置用于在MySQL中启用从服务器的半同步复制功能。
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
CHANGE MASTER TO 
MASTER_HOST = '192.168.52.105',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT =  3306,
#以下两项由主服务器的show master status而来
MASTER_LOG_FILE = 'binlog.000004',
MASTER_LOG_POS = 1004;#启动主从复制
start   slave;#查看主从复制的状态
show  slave  status\G;  #如果发送错误
stop  slave;   #关闭线程
reset   slave  all;  #清空配置
#重做“#登录mysql”那一步

#进行实验结果认证
#在主服务器查看半同步状态
SHOW GLOBAL VARIABLES LIKE '%semi%';#在从服务器上
stop slave;#在主服务器创建数据库,查看确认时间
create database dhf;​

面试题

造成主从不一致的原因

  • 主库binlog格式为 Statement ,同步到从库执行后可能造成主从不一致。

  • 主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。

  • 从节点未设置只读,误操作写入数据

  • 主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致

  • 主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数

  • 据库上面可能不支持该功能

  • MySQL自身bug导致

 

主从不一致修复方法

  • 将从库重新实现

虽然这也是一种解决方法,但是这个方案恢复时间比较慢,而且有时候从库也是承担一部分的查询操作的,不能贸然重建。

  • 使用percona-toolkit工具辅助

PT工具包中包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,需要时间去学习,去测试,特别是在生产环境,还是要小心使用关于使用方法,可以参考下面链接:mysql主从一致性校验工具-pt - know_fly - 博客园

  • 手动重建不一致的表

在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致这种方案缺点是在执行导入期间需要暂时停止从库复制,不过也是可以接受的

http://www.xdnf.cn/news/666199.html

相关文章:

  • MYSQL 学习笔记
  • Django ToDoWeb 服务
  • 4.8.5 利用Spark SQL统计网站每月访问量
  • sharding jdbc的使用,如何在Spring中实现数据库的主从分离、分库分表等功能
  • Java· swing 小demo
  • EasyDarwin的配置与使用
  • MMAction2重要的几个配置参数
  • 《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 C: Count Inversions
  • C++面试题:虚函数表(vtable)的底层实现机制与应用解析
  • 守护手部稳定,手抖健康护理全攻略
  • 【关于C++跨平台开发的挑战】
  • 【C++】内存管理,深入解析new、delete
  • 【DAY30】模块和库的导入
  • Docker Volume(存储卷)
  • 动态库版本不配问题排查步骤
  • 牛客round94D
  • java使用https协议访问(自签名证书,运行时指定信任库(不修改系统证书))
  • 城市污水管网流量在线监测方案
  • VPet虚拟桌宠,一款桌宠软件,支持各种互动投喂等. 开源免费并且支持创意工坊
  • 如何搭建perfino监控(分析java服务性能)
  • 从姿势到心态:痉挛性斜颈的多维护理方案
  • old语音识别科大讯飞+deepseek api
  • SOC-ESP32S3部分:13-定时器
  • 删掉省市区的市辖区
  • 推理模型 vs 非推理模型:核心区别及优劣势解析
  • 3.微服务架构编码Base工程模块构建
  • 【stm32开发板】产品设计流程及元件选型
  • 创业团队建设与管理(一)
  • 牛客round94E
  • 「Unity3D」TextMeshPro的TMP_InputField在改变高度时,其中textComponent移动的问题解决