MySQL数据库笔记——主从复制

大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍 MySQL的主从复制,从原理到配置再到同步过程。

在这里插入图片描述

文章目录

      • 简介
      • 核心组件
      • 主从复制的原理
      • 作用
      • 主从复制的线程模型
      • 主从复制的模式
      • 形式
      • 复制的方式
      • 设计复制机制
      • 主从复制的配置步骤
      • 优化和改进
      • 总结
    • 历史文章

简介

MySQL 主从复制(Replication)是一种数据分布和同步的技术,通过将主库(Master)的数据和操作复制到一个或多个从库(Slave),实现数据的同步和备份。它常用于读写分离、数据容灾、数据分布等场景。

核心组件

  1. 主库(Master)

    • 负责记录所有数据变更操作到 Binary Log 中。
    • 通过网络将 Binary Log 提供给从库。
  2. 从库(Slave)

    • 负责从主库获取 Binary Log,并通过中继日志(Relay Log)将其重放在本地,最终实现与主库的数据同步。
  3. 二进制日志(Binary Log)

    • 主库记录所有数据变更的日志文件。
    • 包含数据变更的具体操作(语句或行数据)。
  4. 中继日志(Relay Log)

    • 从库将主库发送的 Binary Log 存储为中继日志。
    • 从库 SQL 线程根据中继日志执行对应的操作。

主从复制的原理

  1. 基于二进制日志(Binary Log)

    • MySQL 主从复制依赖主库的二进制日志(Binary Log)。主库将所有数据变更操作(如 INSERTUPDATEDELETE)记录到 Binary Log 中。
  2. 复制过程

    • 日志同步:从库向主库请求二进制日志,从主库读取日志文件中最近的更新操作。
    • 日志重放:从库接收到二进制日志后,存储到自己的中继日志(Relay Log),并重放这些操作以保持与主库数据一致。
  3. 主从独立运行

    • 主库和从库的操作相互独立,从库的备份操作不会干扰主库,主库可以继续处理写操作。

作用

  1. 数据冗余,宕机保护

    • 数据冗余:在从库上保存主库的数据副本,防止数据丢失。
    • 宕机保护:主库宕机时,可以快速启用从库,保障业务连续性。
  2. 读写分离,性能提升

    • 支持读写分离:主库处理写操作,从库处理读操作。
    • 流量分担:多台从库分担主库的查询压力,提升系统性能。
  3. 扩展性

    • 易于扩展:通过增加从库节点应对流量增长。
    • 平滑升级:可以优先升级从库,验证新版本的稳定性后再升级主库。
  4. 负载均衡

    • 多从库分担读流量,实现负载均衡,提升并发能力。

主从复制的线程模型

主从复制主要涉及以下线程:

  1. 主库线程

    • Binlog Dump 线程:主库为每个从库分配一个 Binlog Dump 线程,将 Binary Log 发送到从库。
  2. 从库线程

    • I/O 线程:从库从主库拉取 Binary Log 并保存为 Relay Log。
    • SQL 线程:从库读取 Relay Log,并将日志中的操作在从库中重放。

主从复制的模式

  1. 异步复制(Asynchronous Replication)

    • 主库提交事务后立即返回客户端,从库异步同步数据。延迟低,但存在数据丢失风险。
    • 默认复制模式。
    • 主库不等待从库的确认即完成事务提交。
    • 延迟低,但如果主库崩溃,可能会导致从库数据不一致。
  2. 半同步复制(Semi-Synchronous Replication)

    • 主库在事务提交后会等待至少一个从库确认接收 Binary Log。,才返回客户端。
    • 特点:
      • 提高数据安全性。
      • 延迟较低,但仍比异步复制稍高。
      • 从 MySQL 5.5 开始支持(需要插件)。
  3. 全同步复制(Synchronous Replication)

    • 主库必须等待从库同步完成后,才向客户端返回写入成功。延迟较高,但数据一致性强。
    • 所有从库都确认接收到 Binary Log 后,主库才提交事务。
    • 数据一致性最高,但性能损耗较大。

形式

  1. 一主一从

    • 简单高效的主从架构,适用于小型系统或简单业务场景。
    • 特点
      • 支持基本的高可用性。
      • 从库可用于查询、备份等,主库专注写操作。
  2. 一主多从

    • 主库将数据同步到多个从库,适合读多写少的场景。
    • 特点
      • 提升并发能力,实现负载均衡。
      • 每个从库可以分配特定任务,如查询或备份。
  3. 多主一从

    • 多个主库的数据同步到一台从库。
    • 特点
      • 用于整合不同业务线的数据到一个中心数据库。
      • 对从库的存储性能要求较高。
    • 补充:由于主库间没有自动同步,需确保主库之间的写操作不会冲突。
  4. 双主复制

    • 两台服务器互为主从,支持双机热备。
    • 特点
      • 任一主库宕机后,另一主库可继续提供服务。
      • 双向同步,数据一致性需谨慎处理,防止循环复制或冲突。
    • 适用场景
      • 高可用场景,如业务不允许服务中断。
  5. 级联复制

    • 一些从库直接从主库同步数据,其他从库通过这些从库同步。
    • 特点
      • 缓解主库压力。
      • 降低主库对网络带宽的依赖。
    • 适用场景
      • 大规模分布式系统。

一主一从和一主多从是我们现在见的最多的主从架构,使用起来简单有效,不仅可以实现高可用,而且还能读写分离,进而提升集群的并发能力。


复制的方式

  1. 基于语句的逻辑复制(Statement-Based Replication, SBR)

    • 特点
      • 二进制日志记录 SQL 语句,操作逻辑在从库重放。
      • 日志体积小,传输效率高。
    • 缺点
      • 语句重放依赖于上下文环境,可能导致主从数据不一致(如 NOW()UUID() 生成的值不同)。基于语句更新依赖于其它因素,比如插入数据时利用了时间戳。因此在开发当中,我们应该尽量将业务逻辑逻辑放在代码层(创建时间,不应该是mysql的创建时间),而不应该放在 MySQL 中,不易拓展。
      • 多表操作或复杂查询时,性能可能不理想。
    • 适用场景
      • 操作简单且可预测的业务场景。
      • 设表里有一百万条数据,一条sql更新了所有表,基于语句的复制仅需要发送一条sql,而基于行的复制需要发送一百万条更新记录
  2. 基于行的物理复制(Row-Based Replication, RBR)

    • 特点
      • 二进制日志记录每一行的数据变更,直接同步数据。
      • 精确可靠,不受上下文影响。
    • 缺点
      • 日志体积大,占用更多存储和带宽。
    • 适用场景
      • 数据更新频繁,且对数据一致性要求较高的场景。
      • 例如一条更新用户总积分的语句,需要统计用户的所有积分再写入用户表。如果是基于语句复制的话,从库需要再一次统计用户的积分,而基于行复制就直接更新记录,无需再统计用户积分。
  3. 混合复制(Mixed Replication, MIXED)

    • 特点
      • 默认使用语句复制,当遇到复杂场景(如函数、触发器)时切换为行复制。
      • 动态选择复制方式,兼具两种方式的优点。
    • 缺点
      • 复杂度较高,需要额外的资源判断何时切换。
    • 适用场景
      • 通用场景,特别是既有简单语句,又有复杂操作的业务。

设计复制机制

在这里插入图片描述

以下是主从复制的详细执行流程:

  1. 主库写入 Binary Log

    • 任何修改数据的操作(如 INSERTUPDATEDELETE)都会记录到主库的 Binary Log。
  2. 从库 I/O 线程拉取 Binary Log

    • 从库的 I/O 线程向主库请求 Binary Log。
    • 主库会生成一个 log dump 线程,将 Binary Log 发送给从库。
  3. 从库存储中继日志

    • 从库将主库的 Binary Log 存储为中继日志(Relay Log)。
  4. 从库 SQL 线程执行 Relay Log

    • 从库的 SQL 线程读取 Relay Log,将日志中的操作在从库重放,完成数据同步。
  5. 后续新数据到达主库

    • 主库执行写操作后,事务提交时会将修改记录写入 Binary Log。主库的 Log Dump 线程实时检测 Binary Log 更新,并通过长连接主动推送到从库。

注意:

  • 同步过程是实时推送日志

  • 第一次连接:从库的 I/O 线程主动向主库发起请求,同步历史数据。

  • 后续新数据到达主库:主库主动推送新数据实时同步到从库。

  • 长连接保持:从库的 I/O 线程与主库的 Log Dump 线程建立长连接。从库无需反复发起请求去检查主库是否有新数据,而是等待主库通过长连接推送新的日志。

    • 长连接保持的关键在于:
      1. TCP 持久连接:从库的 I/O 线程与主库的 Log Dump 线程通过 TCP 连接持续通信。
      2. 复制心跳机制:即使主库没有新数据生成,也会定期发送心跳包,保持连接活动。
      3. 自动重连机制:当连接意外中断时,从库的 I/O 线程会自动尝试重新连接主库。
    • MySQL 设计了完整的断点续传和自动重连机制,确保长连接断开后可以尽快恢复。
      • 从库记录了上次成功同步的日志位置(MASTER_LOG_FILEMASTER_LOG_POS)。
      • 重新连接后,从库会从上次中断的位置继续同步,避免重复同步或数据丢失。

主从复制的配置步骤

  1. 配置主库(Master)

    • 启用 Binary Log:
      [mysqld]
      log-bin=mysql-bin
      server-id=1
      
    • 重启 MySQL 服务。
  2. 配置从库(Slave)

    • 设置从库的 server-id
      [mysqld]
      server-id=2
      
    • 连接主库:
      CHANGE MASTER TO
      MASTER_HOST='主库IP',
      MASTER_USER='复制用户',
      MASTER_PASSWORD='密码',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=120;
      
    • 启动从库复制:
      START SLAVE;
      
  3. 验证主从复制状态

    • 在从库执行:
      SHOW SLAVE STATUS\G;
      

优化和改进

  1. 使用半同步复制

    • 提高数据一致性,降低数据丢失风险。
  2. 多线程复制

    • MySQL 5.6 开始支持多线程复制(Parallel Replication),从库的 SQL 线程可以并行处理不同表的数据,提升同步效率。
  3. 监控和告警

    • 定期检查主从同步状态(SHOW SLAVE STATUS)。
    • 设置告警系统监控复制延迟、复制状态。
  4. 主从自动切换

    • 使用高可用工具(如 MHA、Keepalived、Orchestrator)实现主从自动切换,避免主库故障时人工干预。

总结

MySQL 主从复制是实现高可用性和负载均衡的重要机制。通过合理的复制模式配置(如半同步、并行复制)以及结合监控和自动化工具,可以显著提高数据库系统的性能和可靠性。同时,了解主从复制的缺点(如数据延迟和单点故障)并采取适当的优化措施,可以进一步提升系统的稳定性。

历史文章

  1. MySQL数据库笔记——数据库三范式
  2. MySQL数据库笔记——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
  3. MySQL数据库笔记——常见的几种锁分类
  4. MySQL数据库笔记——索引介绍
  5. MySQL数据库笔记——事务介绍
  6. MySQL数据库笔记——索引结构之B+树
  7. MySQL数据库笔记——索引潜规则(回表查询、索引覆盖、索引下推)
  8. MySQL数据库笔记——索引潜规则(最左前缀原则)
  9. MySQL数据库笔记——常见慢查询优化方式
  10. MySQL数据库笔记——日志介绍
  11. MySQL数据库笔记——多版本并发控制MVCC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据技术-Hadoop(三)Mapreduce的介绍与使用

目录 一、概念和定义 二、WordCount案例 1、WordCountMapper 2、WordCountReducer 3、WordCountDriver 三、序列化 1、为什么序列化 2、为什么不用Java的序列化 3、Hadoop序列化特点: 4、自定义bean对象实现序列化接口(Writable) 4…

从零开始学TiDB(7)TiDB 的MPP架构概述

MPP架构介绍: 如图,TiDB Server 作为协调者,首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换,让表连接在一个TiFlash上。另外 TiFlash会作为计算节点,每个TiFlash都负责数据交换,表连接…

接雨水-力扣热题100

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,…

AI大模型语音识别转文字

提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字,也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

安卓入门十一 常用网络协议四

MQTT(Message Queuing Telemetry Transport) MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下,实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式:MQTT 使用发布/订…

前端多个项目部署在同一个nginx下,前缀不同,配置编写方式

我们前端是微前端的项目,不同模块是分开的不同项目,用访问前缀区分。开发环境部署为了节约资源,直接使用一个nginx当做静态资源服务器,服务多个微前端,示意图如下: 下面是nginx使用的配置(server部分) ser…

Yolo11 基于DroneVehicle数据集的无人机视角下车辆目标检测

1、关于DroneVehicle数据集介绍 DroneVenicle数据集是由天津大学收集、标注的大型无人机航拍车辆数据集。 DroneVehicle 数据集由无人机采集的共 56,878 幅图像组成,其中一半为 RGB 图像,其余为红外图像。我们对五个类别进行了带有方向性边界框的丰富标…

Requests库01|使用Requests库发送 get/post/put/delete请求

学习目标: 能够使用Requests库发送 get/post/put/delete请求,获取响应状态码、数据能够使用UnitTest管理测试用例。 目录 一、Requests库安装和简介 二、设置http请求语法(重要) 三、应用案例(重要) …

[有用教程]从 Pixel 快速传输到 Android

概括 更换新手机很容易,但数据迁移却不容易。目前,用户喜欢转换品牌,应用市场上的转换工具也越来越多。然而,它们并不都是安全的。因此,选择一款简单、安全的迁移工具至关重要。 今天我们将讨论如何从 Pixel 转移到 …

【蓝桥杯研究生组】第15届Java试题答案整理

D 题 试题 D: 商品库存管理 时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分 【问题描述】 在库存管理系统中,跟踪和调节商品库存量是关键任务之一。小蓝经营的仓库中存有多种商品,这些商品根据类别和规格被有序地分类并编号,…

BUUCTF sqli-labs 1

这里就是单纯的找一下flag在哪,通关整个靶场在sql注入分区,虽然还没有通关。 这里要先看一下数据库都有哪些,用到语句:?id-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3-- 发现这个…

python实现自动登录12306抢票 -- selenium

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码,但是都不是最新的,我也是从网上找别人的帖子,看B站视频&…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

[微服务] - MQ高级

在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。 但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单…

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时,如何考虑时区转换问题? 2. Blob和text有什么区别? 3. mysql里记录货币用什么字段类型比较好? 4. MySQL如何获取当前日期? 5. 你们数据库是否支持emoji表情存储…

aws(学习笔记第二十一课) 开发lambda应用程序

aws(学习笔记第二十一课) 开发lambda应用程序 学习内容: lambda的整体概念开发lambda应用程序 1. lambda的整体概念 借助AWS Lambda,无需预置或管理服务器即可运行代码。只需为使用的计算时间付费。借助 Lambda,可以为几乎任何类型的应用进…

【优选算法】查找总价格为目标值的两个商品

链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;利用单调性&#xff0c;使用双指针算法解决问题 1.先从小到大排序 2. sum > t : right--; sum < t : left; sum t : return class Solution {public…

VUE echarts 教程二 折线堆叠图

VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管&#xff0c;在哔哩哔哩APP内投放和运行&#xff0c;体验流畅&#xff0c;安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…