文章目录
- 什么是MySQL主从架构
- 主从架构的组成
- 工作原理
- 主从复制的步骤
- 主从架构的优点
- 主从架构的缺点
- 什么是主从同步延迟
- 为什么会导致主从延迟
- 主从延时的排查和解决
- 如果发现主从数据不一致怎么办?
我们常说的业务量越来越大,I/O访问频率过高,单机无法满足,就会用到读写分离之类的多库方案
所以我们首先要知道什么是MySQL主从架构
什么是MySQL主从架构
通过字面上来看,最起码要有两台数据库,并且他们的关系是主与从。MySQL主从复制就是将数据库群中一台或多台服务器作为主(master)数据库,其他数据库作为从(slave)数据库,然后指向主库,实时同步主库中的数据;当主库数据发生变化时,会将变化的数据实时同步到一个或多个从库。
这是一种数据库复制和分布式存储的解决方案,核心是将数据从一个主服务器(Master)复制到一个或多个从服务器(Slave)。这种架构主要用于数据备份、读写分离、负载均衡和高可用性。当然凡事都有两面性,如数据延迟和写入瓶颈,因此在设计系统时需要根据实际需求进行权衡
主从架构的组成
主服务器(Master):负责处理写操作(INSERT、UPDATE、DELETE 等),并将这些更改记录到二进制日志(binary log)中
从服务器(Slave):通过读取并应用主服务器的二进制日志来复制数据,通常用于处理读操作(SELECT)
工作原理
二进制日志(Binary Log):主服务器上的所有更改都会记录在一个二进制日志中
中继日志(Relay Log):从服务器从主服务器接收二进制日志的内容,并将其存储在自己的中继日志中
I/O线程:从服务器上的I/O线程负责从主服务器读取二进制日志,并写入中继日志
SQL线程:从服务器上的SQL线程负责读取中继日志,并将这些更改应用到从服务器的数据库中
主从复制的步骤
启动复制:在主服务器上启用二进制日志,并创建一个具有复制权限的用户
配置从服务器:配置从服务器,指定主服务器的地址、登录凭证等,并指定复制的起点
数据同步:在开始复制之前,通常需要将主服务器上的数据同步到从服务器
启动复制进程:在从服务器上启动复制进程,开始复制操作
主从架构的优点
数据冗余:提供数据备份,增加数据安全性
读写分离:通过从服务器处理读请求,可以提高系统的读取性能
负载均衡:分散数据库的访问压力,提高系统整体的处理能力
高可用性:当主服务器出现故障时,可以快速切换到从服务器,减少系统停机时间
主从架构的缺点
数据延迟:从服务器复制数据可能会有延迟,导致数据不一致的问题
故障恢复:当主服务器出现故障时,需要手动或通过自动化工具进行故障转移
写入瓶颈:所有的写操作都必须通过主服务器,可能会成为系统的瓶颈
什么是主从同步延迟
那么再说回什么是主从同步延迟,其实只要使用到了主从设计,基本都会有主从延迟的问题,只是说延迟的严重的程度不一样而已
从字面词汇解释:主从延时,通常指的是在数据库的主从复制架构中,从服务器(Slave)在接收并应用主服务器(Master)上的数据变更时所经历的时间延迟。具体来说,当主服务器上的数据发生变化后,这些变更需要通过复制机制同步到从服务器,而从服务器处理这些变更并完成数据同步所需的时间就构成了所谓的延时
一般来说几百毫秒以内可能都是能接受的范围
为什么会导致主从延迟
- 负载过高:这里其实不管主库还是从库的负载比较高,都可能会导致延迟。这里先额外说一个事情,很多人觉得主库负责写,从库只负责读,所以主库的配置需要高一点,从库低一点也无所谓,但其实这是一个误区,你要清楚所有写在主库的数据,在从库都需要写一遍,而且要求时延低的话,从库的压力其实并不比主库低。所以如果主库的并发量压力较高时,可能会导致从库来不及写入
或者本身从库的负载较高了,因为从库都是串行去写入了,为了保证数据一致性,前面也说了其实从库就是把主库执行过的sql也同样的按顺序执行一次,如果中途可能因为执行其他查询或者某一个复杂的事务等,也可能导致无法及时处理同步过来的数据 - 网络延迟:主从服务器之间的网络延迟也会影响同步效率,这个字面也很好理解
- 硬件性能不足:如果从库的硬件性能不足,处理同步数据的速度会受到影响,这个在第一点里面也做过解释
- MySQL配置不合理:如sync_binlog和innodb_flush_log_at_trx_commit等配置不当可能导致延迟
- 锁等待:从库在执行同步操作时可能遇到锁等待,特别是大型查询语句
主从延时的排查和解决
先确认复制是否正常在运行,然后就是分析导致延时的原因
- 使用show slave status命令,了解当前的延时情况
- 查看Seconds_Behind_Master参数 NULL:表示I/O线程或SQL线程发生故障。0:表示主从复制状态正常,无延迟。正值:表示主从已经出现延时,数值越大,延迟越严重
- Slave_IO_Running 和 Slave_SQL_Running:这两个状态都应该是Yes,如果不是,说明复制过程中断了
- Last_IO_Error 和 Last_SQL_Error:如果复制出错,这里会显示错误信息
- 检查主从机器之间的网络延迟,查看是否出现问题,如使用ping或traceroute命令来测试网络连接
- 检查带宽限制,这个虽然一般不会出现,但是高负载时也可能带宽不够导致复制延迟
- 检查主服务器的二进制日志和从服务器的中继日志文件大小,如果日志文件过大,可能会导致处理缓慢
- 检查服务器资源是否有大的波动
解决办法就是先根据问题分析的原因来做不同的处理应对
- 优化主从服务器的硬件配置,提升处理能力
- 调整MySQL的复制配置,如修改sync_binlog和innodb_flush_log_at_trx_commit参数,以平衡数据安全性和性能
- 网络优化,确保主从服务器之间的网络连接稳定且带宽充足
- 业务逻辑优化,避免大事务和长耗时操作
- 调整中继日志的配置,比如日志的大小和刷新策略,减少服务器的I/O压力
如果发现主从数据不一致怎么办?
1、首先是检查主从同步是否还在正常执行
2、检查延时问题,是否是延时导致的
3、检查最新的数据,看是最后的数据没同步到还是中间的数据没同步到
4、确认主从服务器的错误日志,看是否有相关的异常
5、如果数据不一致且无法通过简单的修复来解决,可能需要重新同步数据:
停止复制:在从服务器上执行STOP SLAVE;命令停止复制
数据备份与恢复:使用mysqldump或其他备份工具从主服务器备份数据,并在从服务器上恢复
重置复制:在从服务器上重置复制状态,重新配置复制并启动