【MySQL】第11节|MySQL 8.0 主从复制原理分析与实战(一)

一、MySQL主从复制基础

1. 核心概念
  • 定义

MySQL主从复制是将主库(Source/Master)的数据变更同步到一个或多个从库(Replica/Slave)的机制,默认采用异步复制,支持全库、指定库或表的同步。

  • 角色
    • 主库:负责处理写请求,记录二进制日志(Binlog)。
    • 从库:通过读取主库Binlog并回放(Relay Log)实现数据同步,支持读请求分担。
2. 核心优势
  1. 高可用性:通过多从库部署提升容灾能力,主库故障时可手动/自动切换至从库。
  2. 读写分离:从库承担读请求,缓解主库压力,提升整体吞吐量。
  3. 异地灾备:从库部署至异地机房,降低地域级故障风险。
3. 复制类型
  • 异步复制:主库提交事务后立即返回客户端,无需等待从库确认,可能存在延迟和数据丢失风险。
  • 半同步复制:主库等待至少一个从库确认接收Binlog后再提交事务,提升数据可靠性,但增加响应延迟。
  • 延迟复制:从库故意落后主库指定时间,用于数据误操作恢复(如误删表)。

二、异步复制原理与配置

1. 核心流程(基于Binlog位点)
  1. 主库生成Binlog

主库执行写操作时,将变更记录到Binlog文件(如mysql-bin.000001)。

  1. 从库拉取Binlog

从库的I/O线程通过CHANGE MASTER TO指定主库地址、Binlog文件名(如mysql-bin.000001)和起始位置(Position),请求同步数据。

  1. 主库推送Binlog

主库的Dump线程根据从库请求的位点推送Binlog数据。

  1. 从库写入中继日志(Relay Log)

从库接收Binlog并写入本地Relay Log,由SQL线程解析并回放,更新本地数据。

2. 关键配置步骤(示例)

主库配置

# custom.cnf
[mysqld]
server-id=10          # 唯一标识主库
log-bin=mysql-bin     # 启用Binlog
binlog-format=ROW     # 推荐使用ROW格式,记录行级变更

从库配置

[mysqld]
server-id=11          # 唯一标识从库
relay-log=relay-bin   # 中继日志路径
read-only=ON          # 从库设置为只读(避免误写)

主从连接配置(从库执行)

-- MySQL 8.0.23前使用CHANGE MASTER TO
CHANGE MASTER TO MASTER_HOST='主库IP',MASTER_PORT=3306,MASTER_USER='复制用户',MASTER_PASSWORD='密码',MASTER_LOG_FILE='mysql-bin.000001',  -- 主库当前Binlog文件MASTER_LOG_POS=1234;                 -- 主库当前Binlog位置-- MySQL 8.0.23+使用CHANGE REPLICATION SOURCE TO
CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP',SOURCE_PORT=3306,SOURCE_USER='复制用户',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='mysql-bin.000001',SOURCE_LOG_POS=1234;START REPLICA;  -- 启动从库复制线程
3. 状态验证
-- 主库查看Binlog状态
SHOW MASTER STATUS;-- 从库查看复制状态(关键字段)
SHOW REPLICA STATUS \G
# 重点关注:
# Replica_IO_Running: Yes       -- I/O线程运行正常
# Replica_SQL_Running: Yes      -- SQL线程运行正常
# Seconds_Behind_Master: 0      -- 复制延迟(0表示无延迟)

三、半同步复制:提升数据可靠性

1. 核心原理
  • 主库在提交事务前,等待至少一个从库确认已接收并写入Relay Log。
  • 若从库超时未响应,主库退化为异步复制;从库恢复后自动切回半同步。
2. 关键配置

主库启用半同步插件

INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET GLOBAL rpl_semi_sync_source_enabled=ON;

从库启用半同步插件

INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET GLOBAL rpl_semi_sync_replica_enabled=ON;

核心参数

  • rpl_semi_sync_source_wait_for_replica_count:主库等待至少N个从库确认(默认1)。
  • rpl_semi_sync_source_timeout:等待超时时间(毫秒,默认10000)。

四、基于GTID的复制:自动化位点管理

1. GTID核心优势
  • 全局唯一事务ID:每个事务在主库生成唯一GTID(格式:server_uuid:transaction_id),避免Binlog位点手动管理。
  • 自动定位同步起点:从库通过MASTER_AUTO_POSITION=1自动获取主库最新事务,无需指定Binlog文件名和位置。
  • 一致性保障:确保每个事务在主从库仅执行一次,避免重复或遗漏。
2. 配置要点

主从库启用GTID

[mysqld]
gtid_mode=ON               # 启用GTID模式
enforce_gtid_consistency=ON # 强制GTID一致性(避免非事务语句破坏一致性)

从库配置(自动定位)

CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP',SOURCE_PORT=3306,SOURCE_USER='复制用户',SOURCE_PASSWORD='密码',SOURCE_AUTO_POSITION=1;  # 关键:启用自动位点管理START REPLICA;
3. 主从切换实战
  1. 模拟主库宕机:停止主库服务。
  2. 提升从库为新主库
-- 在目标从库执行(如replica1)
STOP REPLICA;
RESET MASTER;  -- 清除原有复制配置,成为主库
  1. 其他从库指向新主库
CHANGE REPLICATION SOURCE TO SOURCE_HOST='新主库IP',SOURCE_AUTO_POSITION=1;
START REPLICA;

五、主从复制痛点与解决方案

1. 传统Binlog位点复制的痛点
  • 手动管理复杂:首次配置或故障恢复时需手动指定Binlog文件名和位置,易出错。
  • 单点故障风险:主库宕机后,从库需人工选择新主库并配置位点,耗时且可能丢失数据。
2. GTID的解决方案
  • 自动化位点管理:通过SOURCE_AUTO_POSITION自动同步最新事务,无需人工干预。
  • 快速故障切换:从库基于GTID集合差集自动追赶数据,减少切换时间。

六、总结:复制模式对比

维度

异步复制(Binlog位点)

半同步复制

GTID复制

数据可靠性

低(可能丢数据)

中(至少1从库确认)

高(事务唯一且有序)

配置复杂度

高(手动管理位点)

中(需配置插件和参数)

低(自动位点管理)

故障恢复

慢(人工配置位点)

中(需手动切换主库)

快(自动同步差集事务)

适用场景

非核心业务、低延迟要求

金融类中等可靠性场景

高可用集群、频繁主从切换场景

建议:生产环境优先使用GTID+半同步复制组合,平衡可靠性与性能;传统Binlog位点复制仅用于 legacy 系统或简单测试场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RabbitMQ】记录 InvalidDefinitionException: Java 8 date/time type

目录 1. 添加必要依赖 2. 配置全局序列化方案&#xff08;推荐&#xff09; 3. 配置RabbitMQ消息转换器 关键点说明 1. 添加必要依赖 首先确保项目中包含JSR-310支持模块&#xff1a; <dependency><groupId>com.fasterxml.jackson.datatype</groupId>&l…

【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)

机器学习入门核心算法&#xff1a;K-近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09; 一、算法逻辑1.1 基本概念1.2 关键要素距离度量K值选择 二、算法原理与数学推导2.1 分类任务2.2 回归任务2.3 时间复杂度分析 三、模型评估3.1 评估指标3.2 交叉验证调参 四、应用…

在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core

本文将通过一个实际的 Vue3 组件示例&#xff0c;带你一步步实现“按住录音&#xff0c;松开发送&#xff0c;上滑取消”的语音录制功能。 我们将使用强大且小巧的开源库 recorder-core&#xff0c;支持 MP3、WAV、AAC 等编码格式&#xff0c;兼容性较好。 &#x1f527; 项目…

深入掌握Node.js HTTP模块:从开始到放弃

文章目录 一、HTTP模块入门&#xff1a;从零搭建第一个服务器1.1 基础概念解析1.2 手把手创建服务器 二、核心功能深入解析2.1 处理不同请求类型2.2 实现文件下载功能 三、常见问题解决方案3.1 跨域问题处理3.2 防止服务崩溃3.3 调试技巧 四、安全最佳实践4.1 请求头安全设置4.…

SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南

前言 在Java企业级开发领域&#xff0c;SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架组合一直占据着重要地位。这三个轻量级框架各司其职又相互配合&#xff0c;为开发者提供了高效、灵活的开发体验。本文将深入探讨SSM框架的整合过程&#xff0c;揭示整合背后的原…

[AI]大模型MCP快速入门及智能体执行模式介绍

[AI]大模型MCP快速入门及智能体执行模式介绍 一、MCP入门 介绍 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是一种由Anthropic公司于2024年提出的开放标准协议&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;提供统一接口&am…

Mac M1 安装 ffmpeg

1.前言 官网那货没有准备m系列的静态包&#xff0c;然后我呢&#xff0c;不知道怎么想的就从maven项目中的 javacv-platform&#xff0c;且版本为1.5.11依赖里面将这个静态包把了出来&#xff0c;亲测能用&#xff0c;感觉比那些网上说的用什么wget编译安装、brew安装快多了。…

unity控制相机围绕物体旋转移动

记录一下控制相机围绕物体旋转与移动的脚本&#xff0c;相机操作思路分为两块&#xff0c;一部分为旋转&#xff0c;一部分为移动&#xff0c;旋转是根据当前center中心点的坐标&#xff0c;根据距离设置与默认的旋转进行位置移动&#xff0c;移动是根据相机的左右和前后进行计…

python打卡day38@浙大疏锦行

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 一、首先加载CIFAR数据集 import torch import torchvi…

用户配置文件(Profile)

2.4.5 用户配置文件&#xff08;Profile&#xff09; 用户配置文件由以下组件构成&#xff1a; 一个运营商安全域&#xff08;MNO-SD&#xff09; 辅助安全域&#xff08;SSD&#xff09;和CASD Applets 应用程序&#xff08;如NFC应用&#xff09; 网络接入应用&#xff…

如何给自研MCP加上安全验证

前言 刚过去两个月,市面的 MCP 服务,如雨后春笋一般不断涌现出来,包括;百度、高德、网盘、支付宝。这些 MCP 服务,可以让我们基于 Spring AI 框架构建的 Agent 具备非常丰富的使用功能。同时这也说明,程序员👨🏻‍💻,应该具备开发 MCP 服务的能力,Spring AI 让 J…

Unity网络开发实践项目

摘要&#xff1a;该网络通信系统基于Unity实现&#xff0c;包含以下几个核心模块&#xff1a; 协议配置&#xff1a;通过XML定义枚举&#xff08;如玩家/英雄类型&#xff09;、数据结构&#xff08;如PlayerData&#xff09;及消息协议&#xff08;如PlayerMsg&#xff09;&a…

OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于创建一个 Sobel 滤波器&#xff0c;用于在 GPU 上进行边缘检测。它基于图像的梯度计算&#xff1a; dx 表示对 x 方向求导的阶数&…

【JavaSE】枚举和注解学习笔记

枚举和注解 -枚举 规定多选一数据类型的解决方案-枚举 枚举对应英文(enumeration,简写 enum) 2)枚举是一组常量的集合。 3)可以这里理解:枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象。 枚举的两种实现方式 自定义实现枚举 使用enum关键字实现枚举 自…

Spark SQL进阶:解锁大数据处理的新姿势

目录 一、Spark SQL&#xff0c;为何进阶&#xff1f; 二、进阶特性深剖析 2.1 窗口函数&#xff1a;数据洞察的新视角 2.2 高级聚合&#xff1a;挖掘数据深度价值 2.3 自定义函数&#xff08;UDF 和 UDTF&#xff09;&#xff1a;拓展功能边界 三、性能优化实战 3.1 数…

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 &#xff1f; 总共分为六步走&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;验证conda 环境是否安装好&#xff1f; 1) conda -V2) conda --version&#xff08;2&#xff09;第二步&#xff1a;查看现有环境 conda env list…

什么是HTTP

HTTP&#xff08;HyperText Transfer Protocol&#xff09;是万维网数据通信的基础协议&#xff0c;作为应用层协议具有以下关键特性&#xff1a; 客户端-服务器模型&#xff1a;基于请求/响应模式 无状态协议&#xff1a;默认不保留通信状态 可扩展性&#xff1a;通过首部字…

2025-05-27 学习记录--Python-模块

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、模块 ⭐️ &#xff08;一&#xff09;模块的导入与使用 &#x1f36d; 模块的导入&#xff1a;&#x1f41d; 模块 就好比…

leetcode 131. Palindrome Partitioning

目录 一、题目描述 二、方法1、回溯法每次暴力判断回文子串 三、方法2、动态规划回溯法 一、题目描述 分割回文子串 131. Palindrome Partitioning 二、方法1、回溯法每次暴力判断回文子串 class Solution {vector<vector<string>> res;vector<string>…

重构开发范式!飞算JavaAI革新Spring Cloud分布式系统开发

分布式系统凭借高可用性、可扩展性等核心优势&#xff0c;成为大型软件项目的标配架构。Spring Cloud作为Java生态最主流的分布式开发框架&#xff0c;虽被广泛应用于微服务架构搭建&#xff0c;但其传统开发模式却面临效率瓶颈——从服务注册中心配置到网关路由规则编写&#…