前言
在企业级应用中,随着业务规模的扩大,单台MySQL服务器往往难以满足高并发、高可用性和数据安全性的需求。
MySQL主从复制与读写分离技术应运而生,通过配置多台数据库服务器,实现数据的分布式处理和负载均衡,有效提升数据库系统的整体性能和可靠性。
本文将深入探讨MySQL主从复制的原理、配置方法,以及如何通过读写分离进一步优化数据库架构。
一、MySQL主从复制原理
1.1 MySQL的复制类型
MySQL支持三种复制类型:
- 基于语句的复制(STATEMENT):MySQL默认的复制类型,记录执行的SQL语句。
- 基于行的复制(ROW):记录每一行数据的变更细节。
- 混合类型的复制(MIXED):结合上述两种方式,根据情况自动选择最优复制方式。
1.2 MySQL主从复制的工作过程
主从复制依赖于“两日志、三线程”机制:
- 二进制日志(Binary Log):主库(Master)在每个事务更新数据前,将更改记录到二进制日志中。写入二进制日志完成后,Master 通知存储引擎提交事务。
- 中继日志(Relay Log):从库(Slave)通过
I/O 线程
与主库(Master)建立连接。主库会为这个连接创建一个 Binlog Dump 线程,dump线程
读取主库二进制日志中的事件,将尚未同步的事件发送给从库的I/O 线程
。若已同步至最新位置,dump 线程
会进入等待状态,直到主库产生新事件后再通知I/O线程
。I/O线程
将这些事件写入到从库的中继日志中。 - 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环境,其他版本可能需调整配置。如有疑问,欢迎在评论区留言讨论!