MySQL数据库笔记——主从复制
大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍 MySQL的主从复制,从原理到配置再到同步过程。
文章目录
- 简介
- 核心组件
- 主从复制的原理
- 作用
- 主从复制的线程模型
- 主从复制的模式
- 形式
- 复制的方式
- 设计复制机制
- 主从复制的配置步骤
- 优化和改进
- 总结
- 历史文章
简介
MySQL 主从复制(Replication)是一种数据分布和同步的技术,通过将主库(Master)的数据和操作复制到一个或多个从库(Slave),实现数据的同步和备份。它常用于读写分离、数据容灾、数据分布等场景。
核心组件
-
主库(Master):
- 负责记录所有数据变更操作到 Binary Log 中。
- 通过网络将 Binary Log 提供给从库。
-
从库(Slave):
- 负责从主库获取 Binary Log,并通过中继日志(Relay Log)将其重放在本地,最终实现与主库的数据同步。
-
二进制日志(Binary Log):
- 主库记录所有数据变更的日志文件。
- 包含数据变更的具体操作(语句或行数据)。
-
中继日志(Relay Log):
- 从库将主库发送的 Binary Log 存储为中继日志。
- 从库 SQL 线程根据中继日志执行对应的操作。
主从复制的原理
-
基于二进制日志(Binary Log):
- MySQL 主从复制依赖主库的二进制日志(Binary Log)。主库将所有数据变更操作(如
INSERT
、UPDATE
、DELETE
)记录到 Binary Log 中。
- MySQL 主从复制依赖主库的二进制日志(Binary Log)。主库将所有数据变更操作(如
-
复制过程:
- 日志同步:从库向主库请求二进制日志,从主库读取日志文件中最近的更新操作。
- 日志重放:从库接收到二进制日志后,存储到自己的中继日志(Relay Log),并重放这些操作以保持与主库数据一致。
-
主从独立运行:
- 主库和从库的操作相互独立,从库的备份操作不会干扰主库,主库可以继续处理写操作。
作用
-
数据冗余,宕机保护:
- 数据冗余:在从库上保存主库的数据副本,防止数据丢失。
- 宕机保护:主库宕机时,可以快速启用从库,保障业务连续性。
-
读写分离,性能提升:
- 支持读写分离:主库处理写操作,从库处理读操作。
- 流量分担:多台从库分担主库的查询压力,提升系统性能。
-
扩展性:
- 易于扩展:通过增加从库节点应对流量增长。
- 平滑升级:可以优先升级从库,验证新版本的稳定性后再升级主库。
-
负载均衡:
- 多从库分担读流量,实现负载均衡,提升并发能力。
主从复制的线程模型
主从复制主要涉及以下线程:
-
主库线程:
- Binlog Dump 线程:主库为每个从库分配一个 Binlog Dump 线程,将 Binary Log 发送到从库。
-
从库线程:
- I/O 线程:从库从主库拉取 Binary Log 并保存为 Relay Log。
- SQL 线程:从库读取 Relay Log,并将日志中的操作在从库中重放。
主从复制的模式
-
异步复制(Asynchronous Replication):
- 主库提交事务后立即返回客户端,从库异步同步数据。延迟低,但存在数据丢失风险。
- 默认复制模式。
- 主库不等待从库的确认即完成事务提交。
- 延迟低,但如果主库崩溃,可能会导致从库数据不一致。
-
半同步复制(Semi-Synchronous Replication):
- 主库在事务提交后会等待至少一个从库确认接收 Binary Log。,才返回客户端。
- 特点:
- 提高数据安全性。
- 延迟较低,但仍比异步复制稍高。
- 从 MySQL 5.5 开始支持(需要插件)。
-
全同步复制(Synchronous Replication):
- 主库必须等待从库同步完成后,才向客户端返回写入成功。延迟较高,但数据一致性强。
- 所有从库都确认接收到 Binary Log 后,主库才提交事务。
- 数据一致性最高,但性能损耗较大。
形式
-
一主一从:
- 简单高效的主从架构,适用于小型系统或简单业务场景。
- 特点:
- 支持基本的高可用性。
- 从库可用于查询、备份等,主库专注写操作。
-
一主多从:
- 主库将数据同步到多个从库,适合读多写少的场景。
- 特点:
- 提升并发能力,实现负载均衡。
- 每个从库可以分配特定任务,如查询或备份。
-
多主一从:
- 多个主库的数据同步到一台从库。
- 特点:
- 用于整合不同业务线的数据到一个中心数据库。
- 对从库的存储性能要求较高。
- 补充:由于主库间没有自动同步,需确保主库之间的写操作不会冲突。
-
双主复制:
- 两台服务器互为主从,支持双机热备。
- 特点:
- 任一主库宕机后,另一主库可继续提供服务。
- 双向同步,数据一致性需谨慎处理,防止循环复制或冲突。
- 适用场景:
- 高可用场景,如业务不允许服务中断。
-
级联复制:
- 一些从库直接从主库同步数据,其他从库通过这些从库同步。
- 特点:
- 缓解主库压力。
- 降低主库对网络带宽的依赖。
- 适用场景:
- 大规模分布式系统。
一主一从和一主多从是我们现在见的最多的主从架构,使用起来简单有效,不仅可以实现高可用,而且还能读写分离,进而提升集群的并发能力。
复制的方式
-
基于语句的逻辑复制(Statement-Based Replication, SBR):
- 特点:
- 二进制日志记录 SQL 语句,操作逻辑在从库重放。
- 日志体积小,传输效率高。
- 缺点:
- 语句重放依赖于上下文环境,可能导致主从数据不一致(如
NOW()
或UUID()
生成的值不同)。基于语句更新依赖于其它因素,比如插入数据时利用了时间戳。因此在开发当中,我们应该尽量将业务逻辑逻辑放在代码层(创建时间,不应该是mysql的创建时间),而不应该放在 MySQL 中,不易拓展。 - 多表操作或复杂查询时,性能可能不理想。
- 语句重放依赖于上下文环境,可能导致主从数据不一致(如
- 适用场景:
- 操作简单且可预测的业务场景。
- 设表里有一百万条数据,一条sql更新了所有表,基于语句的复制仅需要发送一条sql,而基于行的复制需要发送一百万条更新记录
- 特点:
-
基于行的物理复制(Row-Based Replication, RBR):
- 特点:
- 二进制日志记录每一行的数据变更,直接同步数据。
- 精确可靠,不受上下文影响。
- 缺点:
- 日志体积大,占用更多存储和带宽。
- 适用场景:
- 数据更新频繁,且对数据一致性要求较高的场景。
- 例如一条更新用户总积分的语句,需要统计用户的所有积分再写入用户表。如果是基于语句复制的话,从库需要再一次统计用户的积分,而基于行复制就直接更新记录,无需再统计用户积分。
- 特点:
-
混合复制(Mixed Replication, MIXED):
- 特点:
- 默认使用语句复制,当遇到复杂场景(如函数、触发器)时切换为行复制。
- 动态选择复制方式,兼具两种方式的优点。
- 缺点:
- 复杂度较高,需要额外的资源判断何时切换。
- 适用场景:
- 通用场景,特别是既有简单语句,又有复杂操作的业务。
- 特点:
设计复制机制
以下是主从复制的详细执行流程:
-
主库写入 Binary Log:
- 任何修改数据的操作(如
INSERT
、UPDATE
、DELETE
)都会记录到主库的 Binary Log。
- 任何修改数据的操作(如
-
从库 I/O 线程拉取 Binary Log:
- 从库的 I/O 线程向主库请求 Binary Log。
- 主库会生成一个 log dump 线程,将 Binary Log 发送给从库。
-
从库存储中继日志:
- 从库将主库的 Binary Log 存储为中继日志(Relay Log)。
-
从库 SQL 线程执行 Relay Log:
- 从库的 SQL 线程读取 Relay Log,将日志中的操作在从库重放,完成数据同步。
-
后续新数据到达主库:
- 主库执行写操作后,事务提交时会将修改记录写入 Binary Log。主库的 Log Dump 线程实时检测 Binary Log 更新,并通过长连接主动推送到从库。
注意:
-
同步过程是实时推送日志。
-
第一次连接:从库的 I/O 线程主动向主库发起请求,同步历史数据。
-
后续新数据到达主库:主库主动推送新数据实时同步到从库。
-
长连接保持:从库的 I/O 线程与主库的 Log Dump 线程建立长连接。从库无需反复发起请求去检查主库是否有新数据,而是等待主库通过长连接推送新的日志。
- 长连接保持的关键在于:
- TCP 持久连接:从库的 I/O 线程与主库的 Log Dump 线程通过 TCP 连接持续通信。
- 复制心跳机制:即使主库没有新数据生成,也会定期发送心跳包,保持连接活动。
- 自动重连机制:当连接意外中断时,从库的 I/O 线程会自动尝试重新连接主库。
- MySQL 设计了完整的断点续传和自动重连机制,确保长连接断开后可以尽快恢复。
- 从库记录了上次成功同步的日志位置(
MASTER_LOG_FILE
和MASTER_LOG_POS
)。 - 重新连接后,从库会从上次中断的位置继续同步,避免重复同步或数据丢失。
- 从库记录了上次成功同步的日志位置(
- 长连接保持的关键在于:
主从复制的配置步骤
-
配置主库(Master):
- 启用 Binary Log:
[mysqld] log-bin=mysql-bin server-id=1
- 重启 MySQL 服务。
- 启用 Binary Log:
-
配置从库(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;
- 设置从库的
-
验证主从复制状态:
- 在从库执行:
SHOW SLAVE STATUS\G;
- 在从库执行:
优化和改进
-
使用半同步复制:
- 提高数据一致性,降低数据丢失风险。
-
多线程复制:
- MySQL 5.6 开始支持多线程复制(Parallel Replication),从库的 SQL 线程可以并行处理不同表的数据,提升同步效率。
-
监控和告警:
- 定期检查主从同步状态(
SHOW SLAVE STATUS
)。 - 设置告警系统监控复制延迟、复制状态。
- 定期检查主从同步状态(
-
主从自动切换:
- 使用高可用工具(如 MHA、Keepalived、Orchestrator)实现主从自动切换,避免主库故障时人工干预。
总结
MySQL 主从复制是实现高可用性和负载均衡的重要机制。通过合理的复制模式配置(如半同步、并行复制)以及结合监控和自动化工具,可以显著提高数据库系统的性能和可靠性。同时,了解主从复制的缺点(如数据延迟和单点故障)并采取适当的优化措施,可以进一步提升系统的稳定性。
历史文章
- MySQL数据库笔记——数据库三范式
- MySQL数据库笔记——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
- MySQL数据库笔记——常见的几种锁分类
- MySQL数据库笔记——索引介绍
- MySQL数据库笔记——事务介绍
- MySQL数据库笔记——索引结构之B+树
- MySQL数据库笔记——索引潜规则(回表查询、索引覆盖、索引下推)
- MySQL数据库笔记——索引潜规则(最左前缀原则)
- MySQL数据库笔记——常见慢查询优化方式
- MySQL数据库笔记——日志介绍
- MySQL数据库笔记——多版本并发控制MVCC
相关文章:

MySQL数据库笔记——主从复制
大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍 MySQL的主从复制,从原理到配置再到同步过程。 文章目录 简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式复制的方式设计复制机制主从…...

OpenAI发布o3:圣诞前夜的AI惊喜,颠覆性突破还是技术焦虑?
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
欧拉-伯努利梁自由波动的频散关系
梁和杆都是一维结构,但是梁的弯曲波比杆的纵波要复杂多。例如即使最简单的欧拉-伯努利(Euler-Bernoulli)梁的弯曲波也具有频散特征,且当梁的特征尺寸和弯曲波波长满足某个比值时,欧拉-伯努利梁不再适用,需要引入铁摩辛克(Timoshenko)梁模型。 考察某一欧拉-伯努利梁,长度…...
Cursor小试1.生成一个网页的接口请求工具
一般开发过程中,会涉及到接口的调试,往往有时候开发的电脑不是我们自己的,没有安装一些类似postman 的接口调用工具,所以发现问题或者要测试某些接口是否正常的时候会很麻烦,而且现在网上也没有找到很好的免费的网页端接口请求的网址,所以我们使用Cursor来编写这样一个小工具, …...

Xilinx DCI技术
Xilinx DCI技术 DCI技术概述Xilinx DCI技术实际使用某些Bank特殊DCI要求 DCI级联技术DCI端接方式阻抗控制驱动器(源端接)半阻抗控制阻抗驱动器(源端接)分体式DCI(戴维宁等效端接到VCCO/2)DCI和三态DCI&…...
Kubernetes Pod 优雅关闭:如何让容器平稳“退休”?
Kubernetes Pod 优雅关闭:如何让容器平稳“退休”? 在 Kubernetes 中,Pod 是应用的基本单元。你可能会遇到需要停止某个 Pod 或容器的情况,可能是因为要更新、调整或故障恢复。在这种情况下,Pod 的优雅关闭࿰…...

鸿蒙应用开发(1)
可能以为通过 鸿蒙应用开发启航计划(点我去看上一节) 的内容,就足够了,其实还没有。 可是我还是要告诉你,你还需要学习新的语言 -- ArkTS。 ,ArkTS是HUAWEI开发的程序语言。你需要学习这门语言。这会花费你…...

SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)
导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行,以及多域耦合、AI求解加速,目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地,支持10亿阶、100w核心量级的高效求解。其低…...

使用 Adaptive Mesh Refinement 加速 CFD 仿真:最佳实践
CFD 仿真中的网格划分挑战 技术的进步正在增强设计探索,数值仿真在优化工程设计方面发挥着至关重要的作用。通常,计算流体动力学 (CFD) 仿真从定制的手工网格开始,具有精细和粗糙的区域,以平衡分辨率和单元…...

前端-动画库Lottie 3分钟学会使用
目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…...
智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之5
本文要点 前端 问题描述语言 本文继续完善 “描述” ---现在我们应该可以将它称为 “问题problem描述语言 ”。 它 通过对话框的question 引发 表征的issue 的“涌现” 最终 厘清应用程序的“problem”。即它合并了 ISO七层模型中的上面三层,通过将三层 分别形成…...
java web
流程 1.浏览器发送http协议的格式数据和url给服务器软件tomcat 2.浏览器解析http格式数据并创建request和response对象,把数据封装到request对象里。 3.tomcat解析url确定访问路径,如果是静态资源html等,直接将html数据作为http格式响应体返回&#x…...
【嵌入式软件开发】嵌入式软件计时逻辑的两种实现:累加与递减的深入对比
本文主要从四个方面详细阐述了嵌入式软件编程中计时逻辑的两种实现方式:累加和递减。让我为您详细解析各个部分: 1. 基本概念对比 累加方式 从0开始向上计数每个周期增加固定值(通常为1)类似于我们日常生活中的秒表计时方式递减方式 从预设值开始向下计数每个周期减少固定…...

如何将vCenter6.7升级7.0?
vCenter是什么? vCenter是一种虚拟化管理软件,由VMware公司开发和发布。它是VMware vSphere虚拟化平台的核心组件之一,主要用于集中管理和监控虚拟化环境中的虚拟机、虚拟存储和网络资源。vCenter可以实现对多个ESXi主机的集中管理ÿ…...
服务器网卡绑定mode和交换机的对应关系
互联网各领域资料分享专区(不定期更新): Sheet 模式类别 网卡绑定mode共有七种(0~6): bond0、bond1、bond2、bond3、bond4、bond5、bond6 mode详解 mode0 ,即:(balance-rr) Round-robin policy(平衡轮循环策略,需要配置交换机静态聚合) mode…...

Maven (day04)
什么是maven? Maven 是 Apache 旗下的一个开源项目,是一款用于管理和构建 java 项目的工具。 官网:Welcome to Apache Maven – Maven https://maven.apache.org/ Maven的作用 依赖管理(方便快捷的管理项目依赖的资源(jar包)ÿ…...

Echart实现3D饼图示例
在可视化项目中,很多地方会遇见图表;echart是最常见的;这个示例就是用Echart, echart-gl实现3D饼图效果,复制即可用 //需要安装,再引用依赖import * as echarts from "echarts"; import echar…...
UE5 Debug的一些心得
1、BUG粗略可分为两类: 一种是显性的,编译直接就通不过,必须马上解决。 第二种是隐性的,新功能完成后,编译成功顺利运行,洋洋自得,而问题隐藏在幕后,测试之后才逐渐发现有问题&…...
java中多线程的一些常见操作
Java 中的多线程是通过并发编程来提高应用程序的效率和响应速度。Java 提供了多个机制和类来支持多线程编程,包括继承 Thread 类、实现 Runnable 接口、使用线程池等。以下是 Java 中一些常见的多线程操作和应用场景。 1. 创建线程 1.1 通过继承 Thread 类创建线程…...
【gopher的java学习笔记】什么是Spring - IoC和DI
一聊到java,离不开的一个东西就是spring;当我想了解什么是spring的时候,一查,基本上都是围绕着两个词来展开的:IoC和AOP。 对于我自己来说,AOP我觉得比较好理解,因为不管是之前写golang还是pyt…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...