MySQL数据库(三)—— MySQL主从复制实战指南 与 读写分离原理讲解

前言

在企业级应用中,随着业务规模的扩大,单台MySQL服务器往往难以满足高并发、高可用性和数据安全性的需求。

MySQL主从复制与读写分离技术应运而生,通过配置多台数据库服务器,实现数据的分布式处理和负载均衡,有效提升数据库系统的整体性能和可靠性。

本文将深入探讨MySQL主从复制的原理、配置方法,以及如何通过读写分离进一步优化数据库架构。


一、MySQL主从复制原理

1.1 MySQL的复制类型

MySQL支持三种复制类型:

  • 基于语句的复制(STATEMENT):MySQL默认的复制类型,记录执行的SQL语句。
  • 基于行的复制(ROW):记录每一行数据的变更细节。
  • 混合类型的复制(MIXED):结合上述两种方式,根据情况自动选择最优复制方式。

1.2 MySQL主从复制的工作过程

在这里插入图片描述

主从复制依赖于“两日志、三线程”机制:

  1. 二进制日志(Binary Log):主库(Master)在每个事务更新数据前,将更改记录到二进制日志中。写入二进制日志完成后,Master 通知存储引擎提交事务。
  2. 中继日志(Relay Log):从库(Slave)通过 I/O 线程与主库(Master)建立连接。主库会为这个连接创建一个 Binlog Dump 线程,dump线程读取主库二进制日志中的事件,将尚未同步的事件发送给从库的 I/O 线程。若已同步至最新位置,dump 线程会进入等待状态,直到主库产生新事件后再通知I/O线程I/O线程将这些事件写入到从库的中继日志中。
  3. SQL线程SQL 线程负责复制的最后阶段,它从中继日志中读取事件并重放(Replay),从而更新从库数据,使其与主库保持一致。只要 SQL 线程与 I/O 线程之间的协调正常,中继日志通常可驻留在操作系统缓存中,因此其额外开销较小。

🔍 注意:复制过程在从库上是串行化的,主库的并行更新在从库上无法并行执行。

1.2.1 主从复制延迟问题及解决

延迟可能由以下原因引起:

  • 主库高并发,产生大量事务
  • 网络延迟
  • 主从服务器硬件差异(CPU、内存、硬盘I/O)
  • 主从复制采用异步复制方式,不是同步复制

解决方法

  • 优化从库参数(如增大innodb_buffer_pool_size),让更多操作在Mysql内存中完成,减少磁盘操作。
  • 从库使用高性能主机。包括配备强劲的CPU、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
  • 网络优化(避免跨机房同步)
  • 从库使用SSD磁盘
  • 使用半同步复制(解决数据丢失的问题)或并行复制(解决从库复制延迟的问题)

1.3 MySQL同步方式

1、异步复制(Async Replication):默认方式,主库写入二进制日志后不等待从库响应。
2、同步复制(Sync Replication):主库需等待所有从库执行完成才返回结果,保证数据一致性但性能较低。

3、半同步复制(Semi-Sync Replication):折中方案,主库等待至少一个从库接收日志后返回确认。
4、增强半同步复制(Lossless Semi-Sync Replication):半同步复制增强版,在提交前等待从库​​写入磁盘​​确认,避免数据不一致

1.4 MySQL主从复制的应用场景

主从复制不仅用于数据备份,还演变为读写分离的基础,进一步解决高并发场景下的性能瓶颈。常见的架构演进路径包括:

1、单台mysql有单点故障
2、集群 ——》 主从复制
3、主从复制读和写的压力不均衡
4、读写分离
5、读写分离的基础是主从复制
6、mysql的高可用架构MHA(master HA高可用) MGR MMM


二、主从复制实战配置

2.1 环境准备

  • 操作系统:CentOS 7.9
  • 服务器配置
    • Master:192.168.10.110,MySQL 5.7
    • Slave1:192.168.10.120,MySQL 5.7
    • Slave2:192.168.10.123,MySQL 5.7

2.2 主从服务器时间同步

2.2.1 Master服务器配置

# 安装ntp软件
yum install ntpdate ntp -y
# 编辑配置文件
vim /etc/ntp.conf
# 添加以下内容:
# 设置本机为时间同步源
server 127.127.1.0
# 设置本机的时间层级为10级,0级表示时间层级为0级,是向其他服务器提供时间同步源的意思,不要设置为0级
fudge 127.127.1.0 stratum 10

# 开启NTP服务、关闭防火墙和增强性安全功能
systemctl start ntpd
systemctl stop firewalld
setenforce 0

在这里插入图片描述

2.2.2 两台Slave服务器配置

# 安装ntp、ntpdate服务
yum install ntp ntpdate -y
# 开启ntp服务,关闭防火墙、增强性安全功能
systemctl stop firewalld
setenforce 0
# 时间同步master服务器
ntpdate 192.168.10.110
# 添加定时任务:
crontab -e
*/10 * * * * /usr/sbin/ntpdate 192.168.10.110

在这里插入图片描述

PS:如果是外网环境

# 主/从服务器同步阿里云时间即可
update ntp.aliyun.com

在这里插入图片描述

2.3 MySQL安装(略)

三台服务器均需安装MySQL 5.7,建议使用编译安装方式。
参考文章: MySQL数据库(一)—— 数据库基础与MySQL安装管理指南

2.4 配置主从同步

2.4.1 Master配置

vim /etc/my.cnf
# 添加以下内容:
#在mysqld模块下修改以下内容
#开启二进制日志文件(之后生成的日志名为master-bin)
log_bin=master-bin
#开启从服务器日志同步
log_slave-updates=true
#主服务器id为1(不可重复)
server_id=1

# 重启服务
systemctl restart mysqld

在这里插入图片描述

配置规则&&刷新权限表:

mysql -uroot -p
# 给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.10.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
# 查看master数据库状态
SHOW MASTER STATUS;

在这里插入图片描述

2.4.2 Slave配置

vim /etc/my.cnf
# 添加以下内容:
#开启二进制日志文件
log-bin=master-bin
#设置server id为22,slave2 为23
server_id = 22
# 设置从库中继日志的文件名前缀
relay-log=relay-log-bin
# 指定中继日志索引文件的名称
relay-log-index=slave-relay-bin.index


==============================================================
log_bin=master-bin
server_id = 22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
==============================================================
systemctl restart mysqld

在这里插入图片描述

开启从服务器功能:

mysql -uroot -p
CHANGE MASTER TO 
MASTER_HOST='192.168.10.110',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=603;

START SLAVE;
# 查看从服务器状态
SHOW SLAVE STATUS\G;

在这里插入图片描述

2.5 测试数据同步

在Master上创建数据库:

CREATE DATABASE work;
show databases;

在这里插入图片描述

在两台从服务器上直接查看数据库列表,验证是否同步:

SHOW DATABASES;

在这里插入图片描述


三、MySQL读写分离

3.1 什么是读写分离?

读写分离是一种数据库架构模式,它将写操作(如INSERT、UPDATE、DELETE)集中到主库处理,而读操作(如SELECT)则分散到从库执行。这种设计通过分布式查询负载来提升整体性能。主从数据库之间通过复制机制保持数据同步,确保从库能及时获取主库的事务变更。

3.2 为什么需要读写分离?

  • 写操作耗时较长(写10000条数据可能要3分钟),容易阻塞读操作。
  • 但是数据库的“读”(读10000条数据可能只要5秒钟)速度较快,而且读操作频率通常高于写操作。
  • 通过分离读写请求,提升数据库并发处理能力,提高查询效率。

什么时候要读写分离?

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

3.3 读写分离的实现方式

3.3.1 基于程序代码实现

在代码中根据操作类型路由到主库或从库。优点是性能好,缺点是开发复杂度高。(企业生产中一般采用这种方式)

3.3.2 基于中间件代理实现

这类中间件的核心原理是:​伪装成一个数据库服务器(如MySQL),接收前端应用程序的SQL请求,然后根据既定规则(分片、读写分离等),将请求转发到后端真实的数据库节点,最后将结果聚合返回给应用程序。对应用来说,它就像访问一个单点数据库一样简单。
常见代理工具

  • MySQL-Proxy:需编写Lua脚本,灵活性高但配置复杂。
  • Atlas:基于MySQL-Proxy优化,支持事务和存储过程。
  • Amoeba:易用性强,但不支持事务和存储过程。
  • MyCat:功能全面的数据库中间件,社区活跃、易用性较好、性能高。但配置相对复杂,需要一定学习成本。

四、总结

MySQL主从复制与读写分离是企业级数据库架构中不可或缺的技术手段。通过主从复制,可以实现数据备份、负载均衡和高可用性;通过读写分离,进一步优化数据库性能,提升并发处理能力。

本文从原理到实践,详细介绍了如何搭建MySQL主从复制集群和读写分离的原理,希望对大家在实际工作中构建高性能数据库架构有所帮助。


注意:本文所有操作均基于CentOS 7.9和MySQL 5.7环境,其他版本可能需调整配置。如有疑问,欢迎在评论区留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值