Mysql 主从复制、读写分离


前言

在当今数据驱动的时代,数据库的高可用性和性能优化成为系统设计的核心需求。MySQL作为广泛使用的关系型数据库,其主从复制(Master-Slave Replication)读写分离(Read-Write Separation) 架构通过以下机制显著提升系统能力:

  1. 数据冗余:从节点实时同步主节点数据,避免单点故障
  2. 负载均衡:读操作分散到多个从节点,写操作集中于主节点
  3. 弹性扩展:通过横向增加从节点应对读密集型场景

该架构在电商、金融等高并发系统中广泛应用,为后续分库分表等高级优化奠定基础。

目录

前言

一、主从复制原理

[1. 基础架构](#1. 基础架构)

[2. 核心流程](#2. 核心流程)

(1)主节点记录变更

(2)从节点同步日志

(3)从节点重放日志

[3. 关键特性](#3. 关键特性)

(1)异步复制(Asynchronous)

(2)数据一致性

[4. 应用场景](#4. 应用场景)

[5. 注意事项](#5. 注意事项)

二、MySQL主从复制的工作过程

[1. 主库(Master)操作](#1. 主库(Master)操作)

[2. 从库(Slave)操作](#2. 从库(Slave)操作)

[3. 复制流程示意图](#3. 复制流程示意图)

[4. 关键配置参数](#4. 关键配置参数)

[6. 典型应用场景](#6. 典型应用场景)

[5. 数据一致性保障](#5. 数据一致性保障)

四、主从复制实验

实验环境配置

关键配置步骤

[1. Master服务器配置](#1. Master服务器配置)

[2. Slave服务器配置](#2. Slave服务器配置)

[3. 创建复制账户(Master执行)](#3. 创建复制账户(Master执行))

[4. 启动复制链路(Slave执行)](#4. 启动复制链路(Slave执行))

验证命令

注意事项

[五、MySQL 读写分离](#五、MySQL 读写分离)

1.概述

2.实现原理

核心组件与技术

3.配置步骤

4.读写分离实现方式

5.性能优化建议

总结

一、主从复制原理

1. 基础架构

主从复制架构包含两类节点:

  • 主节点(Master) :负责处理写操作(如INSERT/UPDATE)。
  • 从节点(Slave) :复制主节点的数据,通常用于读操作(如SELECT)或故障切换。

2. 核心流程

主从复制的核心流程分为以下步骤:

(1)主节点记录变更

主节点将数据变更操作(如事务)记录到**二进制日志(Binary Log)**中。每条日志包含:

  • 事件类型(如写操作)。
  • 执行的具体数据变更。
  • 时间戳和日志位置(如$position$)。
(2)从节点同步日志

从节点通过I/O线程 连接到主节点,并请求获取二进制日志。主节点将日志流推送给从节点,从节点将其保存到中继日志(Relay Log)

(3)从节点重放日志

从节点的SQL线程读取中继日志,按顺序重放(Replay)日志中的操作,使从节点数据与主节点保持一致。

coq 复制代码
graph LR
    A[Master] -->|1. 写入操作| B[Binary Log]
    B -->|2. 推送日志| C[Slave I/O Thread]
    C -->|3. 保存日志| D[Relay Log]
    D -->|4. 重放操作| E[Slave SQL Thread]
    E --> F[Slave 数据同步完成]
 

3. 关键特性

(1)异步复制(Asynchronous)

默认模式下,主节点提交事务后无需等待从节点确认,可能产生短暂延迟(毫秒级)。

(2)数据一致性
  • 最终一致性:从节点数据最终与主节点一致。
  • 强一致性需求:可通过半同步复制(Semi-Synchronous)或同步复制实现。

4. 应用场景

  1. 读写分离:将读请求分发到从节点,减轻主节点压力。
  2. 数据备份:从节点作为实时备份。
  3. 高可用:主节点故障时,从节点可切换为主节点(需配合哨兵或集群管理工具)。

5. 注意事项

  • 延迟风险:网络波动或从节点负载过高可能导致数据延迟。
  • 版本兼容:主从节点的数据库版本需兼容。
  • 日志格式 :需确保二进制日志格式(如ROW/STATEMENT)一致。

二、MySQL****主从复制的工作过程

1. 主库(Master)操作

  • 二进制日志(Binlog)记录

    主库将所有数据修改操作(如INSERT、UPDATE、DELETE)以事件形式记录到二进制日志文件中。

    日志格式支持:

    • Statement-based:记录SQL语句
    • Row-based:记录每行数据的变化
    • Mixed:混合模式
  • Binlog Dump线程

    当从库连接时,主库启动一个Binlog Dump线程,负责读取并发送Binlog内容到从库。


2. 从库(Slave)操作

  • I/O线程

    从库的I/O线程连接主库:

    1. 请求指定位置的Binlog内容
    2. 接收数据并写入本地Relay Log(中继日志)
  • SQL线程

    从库的SQL线程读取Relay Log

    1. 解析日志中的事件
    2. 按顺序重放(执行)这些事件,实现数据同步

3. 复制流程示意图

plaintext 复制代码
主库
  │ 1. 数据修改写入Binlog
  │ 2. Binlog Dump线程发送日志
  ↓
从库
  │ 3. I/O线程接收日志→写入Relay Log
  │ 4. SQL线程重放Relay Log→更新数据
 

4. 关键配置参数

6. 典型应用场景

  • 主库配置

    ini 复制代码
    server-id=1
    log-bin=mysql-bin
     
  • 从库配置

    ini 复制代码
    server-id=2
    relay-log=mysql-relay
    replicate-do-db=指定数据库
     

    5. 数据一致性保障

  • GTID模式(Global Transaction Identifier)

    通过全局唯一事务ID追踪复制进度,确保事务顺序一致。 $$ \text{GTID} = \text{server_uuid}:\text{transaction_id} $$

  • 半同步复制(Semisynchronous)

    主库需等待至少一个从库确认接收Binlog后才返回成功响应。

  • 读写分离:主库写,从库读

  • 数据备份:从库作为热备节点

  • 故障转移:主库宕机时切换至从库

四、主从复制实验

实验环境配置

系统环境

  • 操作系统:CentOS 7.9
  • 虚拟机平台:VMware/KVM(需确保三台服务器网络互通)
  • MySQL版本:5.7(三台服务器版本必须完全一致

服务器信息

角色 IP地址 主机名(示例)
Master 192.168.100.249 master-node
Slave1 192.168.100.248 slave1-node
Slave2 192.168.100.247 slave2-node

关键配置步骤

1. Master服务器配置
bash 复制代码
# 编辑MySQL配置文件
vi /etc/my.cnf

[mysqld]
server-id = 1                 # 唯一ID(主库设为1)
log-bin = mysql-bin           # 开启二进制日志
binlog_format = ROW            # 推荐使用ROW模式
binlog-do-db = test_db         # 需同步的数据库(可选)
 
2. Slave服务器配置
bash 复制代码
# Slave1配置(Slave2同理修改server-id)
vi /etc/my.cnf

[mysqld]
server-id = 2                 # Slave1设为2,Slave2设为3(不可重复)
relay-log = relay-log         # 开启中继日志
read_only = ON                # 从库只读模式(建议)
 
3. 创建复制账户(Master执行)
sql 复制代码
CREATE USER 'repl'@'192.168.100.%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.%';
FLUSH PRIVILEGES;
 
4. 启动复制链路(Slave执行)
sql 复制代码
CHANGE MASTER TO
MASTER_HOST = '192.168.100.249',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'ReplPass123!',
MASTER_LOG_FILE = 'mysql-bin.000001', -- 通过SHOW MASTER STATUS获取
MASTER_LOG_POS = 154;                 -- 同上
 

验证命令

sql 复制代码
-- 在Master查看状态
SHOW MASTER STATUS;

-- 在Slave启动复制
START SLAVE;
SHOW SLAVE STATUS\G

-- 关键指标检查
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
 

注意事项

  1. 防火墙配置

    bash 复制代码
    firewall-cmd --permanent --add-service=mysql
    firewall-cmd --reload
     
  2. 时间同步
    使用ntpdate确保三台服务器时间一致:

    bash 复制代码
    ntpdate ntp.aliyun.com
     
  3. GTID模式(可选)

    若启用GTID,需在配置文件中添加:

    ini 复制代码
    gtid_mode = ON
    enforce_gtid_consistency = ON
     

    建议操作 :配置完成后,在Master创建测试数据库test_db并插入数据,观察Slave是否实时同步。通过STOP SLAVE/START SLAVE模拟故障切换场景以验证高可用性。

五、MySQL****读写分离

1.概述

MySQL读写分离是一种数据库架构优化策略,通过将读操作和写操作分发到不同的数据库服务器上,以提高系统整体性能和可用性。写操作通常集中在主库(Master),而读操作分散到多个从库(Slave),从而减轻主库负载并提升查询效率。

2.实现原理

主库负责处理所有写操作(INSERT、UPDATE、DELETE等),并通过二进制日志(binlog)记录数据变更。从库通过复制主库的binlog实现数据同步,确保数据一致性。应用程序通过中间件或代码逻辑将读请求路由到从库,写请求路由到主库。

核心组件与技术

  • 主从复制(Replication):MySQL原生支持的主从同步机制,从库通过IO线程拉取主库的binlog,SQL线程重放日志实现数据同步。
  • GTID(全局事务标识):MySQL 5.6引入的机制,为每个事务分配唯一ID,简化主从切换和故障恢复流程。
  • 半同步复制(Semi-Synchronous Replication):确保至少一个从库接收并写入relay log后,主库才提交事务,增强数据安全性。

3.配置步骤

主库配置(my.cnf)

ini 复制代码
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
sync_binlog=1
 

从库配置(my.cnf)

ini 复制代码
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1
 

主库创建复制账号

sql 复制代码
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
 

从库启动复制

sql 复制代码
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
 

4.读写分离实现方式

1. 应用层实现 在代码中直接区分读写数据源,例如Spring框架通过AbstractRoutingDataSource实现动态数据源切换。

2. 中间件方案

  • ProxySQL:高性能代理,支持查询规则路由、连接池管理。
  • MySQL Router:官方轻量级中间件,支持读写分离和故障转移。
  • ShardingSphere-JDBC:国产开源生态,集成读写分离与分库分表。

5.性能优化建议

  • 从库数量根据读负载动态扩展,避免过度复制导致主库压力。
  • 监控复制延迟(Seconds_Behind_Master),确保从库数据及时性。
  • 对一致性要求高的读操作可强制走主库(如SELECT ... FOR UPDATE)。

总结

MySQL主从复制与读写分离实现了:

  1. 性能质变 :通过读写分离策略,系统吞吐量提升可建模为:

    T_{\\text{总}} = T_{\\text{写}} + \\sum_{i=1}\^{n} T_{\\text{读}*i}

    其中n为从节点数量,T*{\\text{写}}由主节点承担
  2. 故障容灾:主节点故障时,从节点可快速切换为新的主节点
  3. 数据一致性:基于binlog的异步复制机制保证最终一致性

实际部署需注意:

  • 主从延迟监控(如Seconds_Behind_Master指标)
  • 写后立即读的场景需路由至主节点
  • 从节点水平扩展的硬件成本平衡

该架构以较低复杂度显著提升了数据库系统的可用性与扩展性。

相关推荐
k***82511 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
潇湘秦1 小时前
ORACLE_PDB_SID和ORACLE_SID的区别
数据库·oracle
0***86331 小时前
SQL Server2019安装步骤+使用+解决部分报错+卸载(超详细 附下载链接)
javascript·数据库·ui
wstcl1 小时前
通过EF Core将Sql server数据表移植到MySql
数据库·mysql·sql server·efcore
聪聪那年222 小时前
Oracle 11g windows 10安装与卸载
数据库·oracle
故渊ZY2 小时前
从入门到精通:MySQL 核心技术与业务落地实践
mysql
计算机毕设匠心工作室2 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
前端之虎陈随易2 小时前
MoonBit内置数据结构详解
数据结构·数据库·redis
qq_12498707532 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计