MYSQL:主从复制原理及简单实现

article/2025/6/17 18:54:31

概述

概念

主从复制:指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中

  • 基础是主服务器对数据库修改记录二进制日志从服务器通过主服务器的二进制日志自动执行更新

主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作

主从复制,主要涉及三个线程: binlog 线程、I/O 线程和 SQL 线程

  • binlog 线程 : 负责将主服务器上的数据更改写入二进制日志中。
  • I/O 线程 : 负责从主服务器上读取二进制日志,并写入从服务器的中继日志中。
  • SQL 线程 : 负责读取中继日志并重放其中的 SQL 语句。

主从复制类型

基于语句的复制:主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23版本以后支持

问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户

基于行的复制:把主服务器上面改变后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在MySQL-5.0版本以后引入

问题:如果修改的行数过多,造成的开销比较大。

  • MySQL默认使用基于语句的复制当基于语句的复制会引发问题的时候就会使用基于行的复制,MySQL会自动进行选择
  • MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行

原理

基本原理

主服务器上面的任何修改都会保存在二进制日志Binary log

从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Relay log

  • 从服务器上面开启一个SQL thread定时检查Relay log,如果发现有更改立即把更改的内容在本机上面执行一遍

    如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志,可以做一下调整,将二进制日志只给某一从A,从A再开启二进制日志并将自己的二进制日志再发给其它从或者从不记录只负责将二进制日志转发给其它从
    在这里插入图片描述

操作步骤如下

操作步骤如下:

  1. Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容

  2. Master接收到来自Slave的IO进程的请求后,Master负责复制的IO进程会根据请求信息读取日志指定位置之后的日志信息,返回给Slave的IO进程

    1. 返回信息中除了日志所包含的信息之外,
    2. 还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置
  3. Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master从何处开始读取日志。

  4. Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

注意:

  1. 过程中 binlog 和 relay log 都是 顺序读写
  2. 主从同步的数据内容其实是二进制日志(Binlog),存储的是一个又一个的事件(Event),这些事件分别对应着数据库的相关操作,比如 INSERT、UPDATE、DELETE 等。
  3. 二进制日志,它是一个文件,在进行网络传输的过程中就一定会存在一些延迟,比如200ms,这样就可能造成用户在从库上读取的数据不是最新的数据,也就会造成主从同步中的数据不一致的情况发生
    1. 比如我们对一条记录进行更新,这个操作是在主库上完成的,而在很短的时间内,比如100ms,又对同一个记录进行读取,这时候从库还没有完成数据的同步,
    2. 那么,我们通过从库读取到的数据就是一条旧的数据。

数据复制方式

MySQL 主从复制,默认采用的复制策略就是异步复制

全同步复制

全同步复制:当主库执行完一个事务之后,要求所有的从库也都必须执行完该事务,才可以返回处理结果给客户端

  • 全同步复制数据一致性得到保证了,
  • 但是主库完成一个事务需要等待所有从库也完成,性能会比较低
    在这里插入图片描述

异步复制

异步复制:当主库提交事务后,会通知 binlog dump 线程发送 binlog 日志给从库,一旦 binlog dump 线程将 binlog 日志发送给从库之后,不需要等到从库也同步完成事务,主库就会将处理结果返回给客户端
在这里插入图片描述
注意:

  • 可能导致短暂的主从数据不一致的问题
  • 当主库提交事务后,如果宕机挂掉了,此时可能 binlog 还没来得及同步给从库,这时候如果为了恢复故障切换主从结点的话,就会出现数据丢失的问题
    • 异步复制虽然性能高,但数据一致性上是最弱的

半同步复制

MySQL 5.5版本之后开始支持半同步复制的方式
半同步复制:客户端提交事务之后不直接将结果返回给客户端,而是等待至少有一个从库收到了 Binlog,并且写入到中继日志中,再返回给客户端

  • 相比于异步复制,提高了数据的一致性

    至少多增加了一个网络连接的延迟,降低了主库写的效率。
    在这里插入图片描述

增强半同步复制

增强半同步复制,是 MySQL 5.7.2后的版本对半同步复制做的一个改进

主要是解决幻读的问题

主库配置了参数 rpl_semi_sync_master_wait_point = AFTER_SYNC 后,主库在存储引擎提交事务前,必须先收到从库数据同步完成的确认信息后,才能提交事务,以此来解决幻读问题
在这里插入图片描述

半同步复制优化

半同步复制机制是可靠的。如果半同步复制一直是生效的,那么便可以认为数据是一致的。
但是由于网络波动等一些客观原因,导致半同步复制发生超时而切换为异步复制,那么这时便不能保证数据的一致性。所以尽可能的保证半同步复制,便可提高数据的一致性。

方案同样使用双结点架构,但是在原有半同复制的基础上做了功能上的优化,使半同步复制的机制变得更加可靠
优点:

  1. 双结点,需求资源少,部署简单;
  2. 架构简单,没有选主的问题,直接切换即可;
  3. 相比于原生复制,优化后的半同步复制更能保证数据的一致性。

缺点:

  1. 需要修改内核源码或者使用mysql通信协议。需要对源码有一定的了解,并能做一定程度的二次开发。
  2. 依旧依赖于半同步复制,没有从根本上解决数据一致性问题。
双通道复制

半同步复制由于发生超时后,复制断开当再次建立起复制时,同时建立两条通道

  • 其中一条半同步复制通道从当前位置开始复制保证从机知道当前主机执行的进度
  • 另外一条异步复制通道开始追补从机落后的数据
  • 当异步复制通道追赶到半同步复制的起始位置时,恢复半同步复制
    在这里插入图片描述
binlog文件服务器

搭建两条半同步复制通道,

  • 其中连接文件服务器的半同步通道正常情况下不启用
  • 主从的半同步复制发生网络问题退化后启动与文件服务器的半同步复制通道
  • 主从半同步复制恢复后关闭与文件服务器的半同步复制通道

在这里插入图片描述

读写分离能提高性能的原因

读写分离能提高性能的原因:

  1. 负载分流

    • 写操作集中处理:主节点(Master)专注于处理写操作(INSERT/UPDATE/DELETE),避免读写混合导致的锁竞争。
    • 读操作分散到从节点:从节点(Slave)处理读操作(SELECT),通过增加从节点数量横向扩展读能力。
  2. 硬件资源优化

    • 主库资源释放:主库无需承担读压力,可集中资源处理写操作(如磁盘IO、CPU用于binlog写入和事务提交)。
  3. 锁竞争减少

    • 写锁影响隔离:主库上的写操作(如行锁、表锁)不会阻塞从库的读操作。
  4. 缓存利用率提升

    • 从库独立缓存:每个从库维护独立的缓冲池(Buffer Pool),可缓存不同维度的热点数据。
  5. 容灾与备份

    • 热备节点:从库实时同步数据,故障时可快速切换为主库。
    • 备份隔离:在从库执行mysqldump或物理备份,避免影响主库性能。

代理方式实现读写分离

在这里插入图片描述

mysql实现主从

在这里就不描述mysql的安装内容,直接说比较核心的步骤,其他是已经安装了两台数据库,mstaer和slave

只说明大致逻辑,不详细叙述实现过程

问题注意:数据延迟异步复制下从库可能有秒级延迟,需业务容忍

如果应用对数据不一致的接受程度程度较低,可能的优化措施包括:

  1. 优化主从节点之间的网络环境(如在同机房部署);
  2. 监控主从节点延迟(通过offset)判断,如果从节点延迟过大,通知应用不再通过该从节点读取数据;
  3. 使用集群同时扩展写负载和读负载等。

master配置

  1. 修改my.cof配置文件:配置文件默认在/etc/my.cnf下,开启bin-log 日志
  2. 修改配置后需要重启才能生效:service mysql restart
    # 同一局域网内注意要唯一
    server-id=100  # 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    
  3. 创建复制账号:在主服务器上授权,从服务器保存授权的信息,登录数据库后,直接在命令窗口执行下面的语句
    grant replication slave on *.* to 'root'@'%' identified by '123456';
    --刷新权限
    flush privileges;
    
  4. 查看binlog状态:
    #登录mysql数据库
    mysql -uroot -p
    #查看master的状态
    show master status
    

slave配置

  1. 从my.cnf配置中新增后并重启:

    # 设置server_id,注意要唯一
    server-id=101  
    # 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin   
    # relay_log配置中继日志
    relay_log=edu-mysql-relay-bin 
    
  2. 重启slave并进行相关配置

  3. 连接主服务器的配置

    master_host :Master的地址
    master_port:Master的端口号
    master_user:用于数据同步的用户
    master_password:用于同步的用户的密码
    master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
    master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
    master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

    #重启mysql服务
    service mysqld restart
    #登录mysql
    mysql -uroot -p
    #连接主服务器
    change master to master_host='xxx',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154;
    #开启主从复制
    start slave
    
  4. 查看slave的状态:

    SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启

    show slave status\G
    
  5. 如果需要指定想要主从同步哪个数据库,

    1. 可以在master的my.cnf添加配置
      binlog-do-db:指定mysql的binlog日志记录哪个db
      
    2. 或者在slave的my.cnf添加配置:
      replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
      
  6. 如果想要同步所有库和表,在从mysql执行:

    STOP SLAVE SQL_THREAD; CHANGE REPLICATION FILTER REPLICATE_DO_DB = (); start SLAVE SQL_THREAD;
    

http://www.hkcw.cn/article/qtacTfWYHL.shtml

相关文章

11.4java语言执行浅析4

编译成字节码(.class 文件) 使用 javac 命令将源代码编译为 Java 字节码(bytecode) 它不是机器码,而是 JVM 能理解的中间语言(字节码),具有平台无关性。 编译过程简要&#xff1…

Luminar Neo:摄影室灯光

在专业人像摄影中,打光始终是一门核心技术。但对于多数摄影师而言,搭建真正的摄影棚既耗时又昂贵。Luminar Neo 推出的创新工具“摄影室灯光”(Studio Light,也称“摄影棚光线”),正是为了解决这一难题而生…

机器学习知识图谱——NN全连接神经网络算法

目录 一、图解全连接神经网络(NN)算法知识图谱 二、什么是全连接神经网络(NN)? 三、网络结构 四、神经元计算公式 五、激活函数常用类型 六、前向传播 + 反向传播 七、训练流程图示 八、优点 九、缺点 十、Python 示例代码 (使用 PyTorch) 十一、应用领域 机…

DFS入门刷题

目录 P1683 入门 P1596 [USACO10OCT] Lake Counting S 1114. 棋盘问题 P1025 [NOIP 2001 提高组] 数的划分 P1683 入门 #include <iostream> using namespace std; char a[30][30]; bool vis[30][30]; int res 1; int n, m; int dx[] {-1, 1, 0, 0}; int dy[] {0,…

如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ

单体架构学的差不多了&#xff0c;可以朝着微服务进军了&#xff0c;笔者打算实操一下 RabbitMQ&#xff08;这个和 Redis 一样重要的组件) 笔者这里采用的是本地 wsl2 的 Ubuntu22.04 先按指定的博客进行前置操作 Ubuntu22.04 安装 RabbitMQ 解决 ARM Ubuntu 22.04 缺少 libs…

歼-10CE火出圈,不愧是猛龙!

歼-10CE火出圈,不愧是猛龙!国产战机霸气名称大盘点在近期举行的马来西亚兰卡威航展上各国顶级装备纷纷亮相在中国展台上近期在实战中一鸣惊人的歼-10CE战斗机模型占据C位人气爆棚观众纷纷前来打卡参观硬核出圈的歼-10也被称为“猛龙”国产歼击机有用猛兽命名的传统小编带你盘…

荣昌政府食堂推出六一套餐 亲子家庭专属福利

端午假期期间,全国多地政府机关食堂面向社会公众开放。例如,重庆市荣昌区政府机关食堂在5月31日中午向游客开放,首日吸引了超过3000名游客前来体验。为了庆祝六一儿童节,该食堂特别推出了61元的家庭套餐,包括荣昌卤鹅、黄凉粉等特色菜品,并新增了粽子和薯条、鸡腿、鸡块等…

樊振东加盟德甲联赛 乒坛巨星开启欧洲冒险

6月1日,FC萨尔布吕肯乒乓球俱乐部宣布奥运冠军樊振东将加盟。樊振东,这位曾经的世界第一、国际乒乓球界的巨星,将在新赛季代表该俱乐部征战德国乒乓球甲级联赛(TTBL)。28岁的中国选手樊振东表示非常期待在萨尔布吕肯和TTBL的新挑战,并渴望成为俱乐部的一员,在新的环境中…

樊振东加盟德国乒乓球甲级联赛 乒坛巨星欧洲冒险

6月1日,FC萨尔布吕肯乒乓球俱乐部宣布奥运冠军樊振东将加盟。这位曾经的世界第一、国际乒乓球界的巨星将在新赛季代表该俱乐部征战德国乒乓球甲级联赛(TTBL)。28岁的中国选手樊振东表示非常期待在萨尔布吕肯和TTBL的新挑战,并渴望成为俱乐部的一员,体验新的环境并帮助球队…

IDM下载器 Internet Download Manager v6.42 Build 39

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWCoLNITytLXc_Obt47jr1A1?pwdipt3# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/d7cd16fee51c 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

C++二叉树常见OJ题分析

OJ&#xff08;一&#xff09;&#xff1a;根据二叉树创建字符串 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 1.&#xff08;ps:接下来的解答来自LeetCode的官方解释&#xff1a;这里只是为了让以后复习便利而已。&#xff09; 如果当前节点有两个孩子…

Spring Boot养老院管理系统源码分享

概述 基于Spring Boot开发的养老院管理系统&#xff0c;该系统通过智能化管理模块&#xff0c;为养老机构提供高效运营解决方案。 主要内容 后台管理功能 系统后台功能完善&#xff0c;左侧导航栏涵盖首页、安全巡查管理、设备管理等模块。设备管理界面以表格形式清晰展示设…

数据库-MySQL索引事务

1 索引 针对查询操作引入的优化手段 可以通过索引加快查询的速度 避免针对表遍历 索引缺点&#xff1a; 1.占用更多空间&#xff0c;生成索引需要一系列数据结构 一系列额外数据 2.可能会降低插入修改删除的速度 ps.如果这个表本来就很大&#xff0c;创建索引容易把数据库服务…

leetcode hot100刷题日记——32.杨辉三角

class Solution { public:vector<vector<int>> generate(int numRows) {//感觉是不是就是找规律遍历啊//i层共有i1个数字//i层的0和i位置都是1//i层的其他位置j的数字i-1层j-1位置i-1层j位置//注意二维vector数组的初始化vector<vector<int>>res(numRo…

数据中台(大数据平台)之元数据管理

元数据管理是数据管理的基础&#xff0c;数据中台产品要能够提供各类元数据采集的适配器&#xff0c;自动化采集技术元数据&#xff0c;并在技术元数据的基础上补充管理属性和业务属性&#xff0c;为后续的数据资源目录、数据安全管控、报表开发提供统一的口径。并能够在数据集…

TDenigne 集群可视化管理

可视化管理工具 为方便用户更高效地使用和管理 TDengine&#xff0c;TDengine 3.0 版本推出了一个全新的可视化组件 taosExplorer。这个组件旨在帮助用户在不熟悉 SQL 的情况下&#xff0c;也能轻松管理 TDengine 集群。通过 taosExplorer&#xff0c;用户可以轻松查看 TDengi…

【Linux 学习计划】-- 进程地址空间

目录 进程地址的引入 进程地址空间基础原理 区域划分的本质 如何理解进程地址空间 越界访问的本质 进一步理解写时拷贝 重谈 fork 返回值 结语 进程地址的引入 我们先来看一段代码&#xff1a; 首先我们可以看到&#xff0c;父进程和子进程是可以同时可以看到一个变量…

foundationpose位姿检测环境搭建与数据集制作

foundationpose环境搭建数据集制作 注&#xff1a;本教程为在未知明确方法的探索步骤记录&#xff0c;由于时间原因未做整理&#xff0c;可能有不必要步骤&#xff0c;建议先看完整篇文章理清思路在动手制作 创建数据集 保存RGB和Depth图像: 使用data_collect.py脚本来保存R…

某乎x-zse-96 破解(补环境版本)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、总体概述二、请求分析分析请求流程三、逆向分析总结一、总体概述 本文主要实现某乎x-zse-96 破解(补环境版本),相关的链接: https://www.zhihu.com/search?type=content&q=%25E7%258…

智慧物流园区整体解决方案

该智慧物流园区整体解决方案借助云计算、物联网、ICT 等技术,从咨询规划阶段介入,整合供应链上下游资源,实现物流自动化、信息化与智能化。方案涵盖智慧仓储管理(如自动化立体仓储系统、温湿度监控)、智慧物流(运输管理系统 TMS、GPS 监控)、智慧车辆管理(定位、调度、…