MySQL 主从复制与一主多从架构实战详解

文章目录

一、MySQL 主从复制的本质原理

  数据同步流程:

主从复制三大线程:

二、主从复制的三种模式

三、一主多从架构设计与应用

    应用场景:

  优势:

四、单机模拟主从复制(实战配置)

    环境准备:

示例配置片段(my.cnf):

 设置主从关系:

五、主主复制(双主复制)配置

  原理:

 关键注意事项:

示例配置(主 A):

   使用场景:

六、项目中常见主从实践方案

七、故障应对与运维建议

结语 


主从原理 + 多种复制场景 + 实战配置,一次讲清!


一、MySQL 主从复制的本质原理

MySQL 主从复制是通过 二进制日志(binlog)+ 中继日志(relay log) 机制实现的。

  数据同步流程:

1. 主库开启 binlog,记录所有写操作
2. 从库的 I/O 线程向主库请求 binlog
3. 主库的 dump 线程将 binlog 发送给从库
4. 从库的 I/O 线程写入 relay log
5. 从库的 SQL 线程读取 relay log 并执行

主从复制三大线程:

名称角色功能
Dump 线程主库向从库推送 binlog 内容
I/O 线程从库拉取 binlog 并写入中继日志
SQL 线程从库读取中继日志并执行 SQL

二、主从复制的三种模式

模式特点延迟一致性
异步复制(默认)主库执行完即返回可能丢数据
半同步复制至少一个从库确认才返回提高可靠性
GTID复制(基于事务ID)支持 failover 自动切换更强一致性更好容灾支持

三、一主多从架构设计与应用

一主多从是 MySQL 构建读写分离的常见架构:

           +-----------+|           ||  Master   ||           |+-----------+/    |    \/     |     \+--------+ +--------+ +--------+| Slave1 | | Slave2 | | Slave3 |+--------+ +--------+ +--------+

    应用场景:

  • 主库处理写操作(INSERT/UPDATE/DELETE)

  • 从库处理读请求(SELECT)

  • 配合中间件(如 MyCAT、ShardingSphere、ProxySQL)实现自动读写分离

  优势:

  • 提升系统并发能力(读写分离)

  • 降低主库压力

  • 增加容灾能力,主挂后可快速切换为从


四、单机模拟主从复制(实战配置)

    环境准备:

  • 同一台主机运行多个 MySQL 实例(如 3306、3307)

  • 修改配置文件以区分实例

示例配置片段(my.cnf):

[mysqld]
server-id=1              # 主从必须唯一
log-bin=mysql-bin        # 主库需开启binlog
port=3306[mysqld2]
server-id=2
relay-log=mysql-relay
port=3307

 设置主从关系:

-- 从库配置
CHANGE MASTER TOMASTER_HOST='127.0.0.1',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl_pass',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=  154;START SLAVE;
SHOW SLAVE STATUS\G;

五、主主复制(双主复制)配置

  原理:

两台 MySQL 互为主从,都开启 binlog 与 relay log。

        +-----------+         +-----------+|  Master A | <-----> |  Master B |+-----------+         +-----------+

 关键注意事项:

  • 两边写入不能写相同主键或数据 → 否则数据冲突

  • 通常搭配 auto_increment_offsetauto_increment_increment 避免主键冲突

示例配置(主 A):

server-id=1
log-bin=mysql-bin
auto_increment_offset=1
auto_increment_increment=2

主 B:

server-id=2
log-bin=mysql-bin
auto_increment_offset=2
auto_increment_increment=2

   使用场景:

  • 多活读写(慎用,建议仅读活)

  • 高可用自动切换(结合 MHA、Orchestrator 使用)


六、项目中常见主从实践方案

项目场景推荐方案说明
中小型系统一主两从读写分离 + 冗余
高并发大读量一主多从(>3)配合 ProxySQL 或 LVS 负载
容灾架构主主复制 + keepalived主库故障时自动切换
单机模拟开发3306 + 3307 模拟主从便于学习测试复制流程

七、故障应对与运维建议

  • 定期监控 Slave_IO_Running/Slave_SQL_Running

  • 配置 slave_skip_errors 时慎重使用

  • 使用 pt-table-checksum 保证主从一致

  • 设置从库只读:read_only=ON


结语 

MySQL 的主从复制为分布式架构提供了坚实的基础。不论是一主多从、主主复制,还是读写分离,在不同规模和业务需求下都能灵活组合构建高可用、高性能的数据库架构。


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

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

相关文章

分布式光纤测温及红外测温系统的区别?

在现代工业监控系统中&#xff0c;温度监测是保障设备安全运行的关键环节。分布式光纤测温&#xff08;DTS&#xff09;和红外测温&#xff08;IR&#xff09;是两种常见的温度监测技术。 本文将介绍这两种技术的原理、优势以及应用场景的区别。 光纤测温技术的原理是利用光纤…

sql优化:使用 exists 优化 in () 或 = ()

1、使用 exists 优化 in () 优化前&#xff1a; select id, order_no, apply_time, apply_dept, apply_operator, purpose, stage, remark from BranchWarehouseApplyMaster where stage 0 and warehouse_id 1 and apply_dept in ( select emp_DeptID from Employee where …

HTTP 响应状态码

HTTP 响应状态码&#xff08;Response Status Codes&#xff09; HTTP 响应状态码用于表示服务器对客户端请求的处理结果&#xff0c;由3位数字 组成&#xff0c;分为5类&#xff1a; 状态码 类别 常见状态码 说明 1xx 信息响应 100&#xff08;Continue&#xff09; …

如何通过插件系统打造个性化效率工作流

在现代工作流中&#xff0c;快速调用工具与自动化操作已成为提升生产力的核心环节。一款真正出色的效率工具&#xff0c;不仅要在响应速度和跨平台兼容性上表现出色&#xff0c;更需要具备高度的可扩展性&#xff0c;以满足多样化的使用场景。 它不仅轻量高效&#xff0c;还支…

Spring上下文模块设计

经过此前我们设计的如&#xff1a;IoC、Web、数据访问、AOP等模块的设计&#xff0c;我们从设计上已经搭建好了Spring的基础骨架了&#xff0c;但聪明的码友会思考想到&#xff1a;作为一个基础框架而言&#xff0c;目前应该是已经够用了的&#xff0c;但是上进的码友怎么会就此…

keil5怎么关闭工程

在project里面有一个close project&#xff0c;点击后就关掉了&#xff0c;之前还按照其他软件的操作习惯&#xff0c;右键工程选项&#xff0c;但是始终没有发现关闭选项。

腾讯云:6月30日起,自动禁用,及时排查

大家好&#xff0c;我是小悟。 腾讯云发布公告&#xff0c;宣布从2025年6月30日开始&#xff0c;对长期未使用的AccessKey&#xff08;API访问密钥&#xff09;进行自动禁用。 简单来说&#xff0c;如果你的密钥在90天内没动静&#xff0c;系统就会把它关掉&#xff0c;不管是…

【C++】多重继承与虚继承

多重继承与虚继承 1.单继承和多重继承的区别2.语法规则示例代码&#xff1a;多重继承子类指定父类的构造示例代码&#xff1a;多重继承子类隐藏父类的同名方法 3.虚继承解决多重继承遇到的bug示例代码&#xff1a;环状继承引发的问题 3.1 虚基类&#xff1a;3.2 语法规则&#…

GCC编译/连接/优化等选项

1. GCC编译/连接/优化等选项 1. GCC编译/连接/优化等选项 1.1. 简介1.2. 常用选项 1.2.1. -c -E -S -o1.2.2. -L<path> -l<library>1.2.3. -D<macro>1.2.4. -I<path> 1.3. 代码生成和优化 1.3.1. -std<standard>1.3.2. -shared1.3.3. -fPIC1.3.…

FFmpeg 压缩视频文件

文章目录 FFmpeg 压缩视频文件基本压缩命令&#xff08;保持 MP4 格式&#xff09;转换为其他格式示例&#xff1a;关键参数说明&#xff1a;额外优化选项&#xff1a; 在FFmpeg中使用多线程加速1. 帧级多线程 (frame-level multithreading)2. 切片级多线程 (slice-level multi…

Ubuntu 系统通过防火墙管控 Docker 容器

Ubuntu 系统通过防火墙管控 Docker 容器指南 一、基础防火墙配置 # 启用防火墙 sudo ufw enable# 允许 SSH 连接&#xff08;防止配置过程中断联&#xff09; sudo ufw allow 22/tcp二、Docker 配置调整 # 编辑 Docker 配置文件 sudo vim /etc/docker/daemon.json配置文件内…

虚拟机新增硬盘,与数据挂载

我有个虚拟机&#xff0c;当时选择了独立文件&#xff0c;现在遇到个问题&#xff0c;硬盘不够了&#xff0c;索性加了一个新硬盘&#xff0c;现在想把数据库的数据映射到这个新的硬盘处理。 罗列硬盘 lsblk我得是sdb是新硬盘 2. 分区 sudo fdisk /dev/sdb交互操作&#xff…

go语言学习 第10章:面向对象编程

第10章&#xff1a;面向对象编程 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来表示数据和方法&#xff0c;并通过类来定义对象的结构和行为。Go语言虽然不是传统的面向对象语言&#xff0c;但它通过结构体&#xff08;struct&#xff…

android计算器代码

本次作业要求实现一个计算器应用的基础框架。以下是布局文件的核心代码&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"andr…

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…

我们来学mysql -- 8.4版本记录慢查询

记录慢查询 开启慢查询的配置查看慢查询状态动态开启慢查询日志永久开启配置log_throttle_queries_not_using_indexes 记录慢查询对性能的影响实际案例说明第一条记录第二条记录第三条记录第四条记录 开启慢查询的配置 查看慢查询状态 - 执行 show variables like slow_quer…

2025 年中国大学生程序设计竞赛全国邀请赛(郑州)暨第七届CCPC河南省大学生程序设计竞赛(补题)

文章目录 前言F、幻形之路G、直径与最大独立集H&#xff0c;树论函数M&#xff0c; 川陀航空学院总结 前言 本次比赛&#xff0c;只能说太多没接触的知识了&#xff0c;还有太容易被题面吓住。 F、幻形之路 题目链接&#xff1a;幻形之路 解题思路&#xff1a; 对于这一题只…

如何使用k8s安装redis呢

在Kubernetes (k8s) 上安装Redis 在Kubernetes上安装Redis有几种方法&#xff0c;下面我将介绍两种常见的方式&#xff1a;使用StatefulSet直接部署和使用Helm chart部署。 一、安装redis 1.1 拉去ARM镜像&#xff08;7.4.2&#xff09; docker pull registry.cn-hangzhou.ali…

SpringBoot的5种日志输出规范策略

在企业级应用开发中&#xff0c;合理规范的日志记录是系统稳定运行、问题排查和性能优化的关键保障。 SpringBoot作为流行的Java开发框架&#xff0c;提供了强大而灵活的日志支持&#xff0c;但如何建立统一、高效的日志输出规范却是许多团队面临的挑战。 本文将介绍SpringBo…

Python Cookbook-7.11 在 PostgreSQL 中储存 BLOB

任务 需要将 BLOB 存入一个 PostgreSQL 数据库。 解决方案 PostgreSQL7.2 以及更新的版本支持大对象,而psycopg 模块提供了二进制转义函数: import psycopg,cPickle #连接到数据库,用你的本机来测试数据库,并获得游标 connection = psycopg.connect("dbname = test…