sdkg 更新:新增 mabatis-plus-generator
新增mabatis-plus-generator,引入mybatis-plus-join 引入lombok,简化代码 jcodemodel升级至3.4.1 *-sdkg和sdkg统一版本号 支持swagger3 示例引入knife4j-4.5.0
[TOC]
MySQL 读写分离在互联网项目中其实还是比较常见的,松哥之前也写过文章和大家介绍具体的搭建方案,还不会搭建的小伙伴可以参考这里:
既然是主从,是读写分离,那就不可避免会产生延迟,因为数据从主机同步到从机,总是需要时间的。
一般来说这个时间不会太久,可能就是 1ms 左右。
不过,如果你的系统数据量比较大,亦或者业务对数据实时性要求比较高,那么我们还是需要想办法去处理这个主从延迟。
一般来说有如下几种思路,松哥来和大家一一说明。
第一种方案就是强制读主库。
这种方案看着有点笨重,但却是我司用的最多的一种方案。
简单来说,就是将查询请求进行分类:一类是对数据实时性要求不高的请求,这种请求直接去读从库;另一类则是对实时性要求比较高的请求,这种就强制读主库。
举个简单例子:读取系统配置、读取用户基本信息等等,都算是对数据实时性要求不高的请求,这种直接读取从库就可以了;但是像用户下单获取订单状态的话,这种就需要读主库了,确保数据的一致性。
强制读主库我们可以在代码里边通过 AOP 的方式实现,也可以通过一些数据库中间如 ShardingJDBC 去配置。
这种方案就是刚刚插入完成之后,此时如果去读取从机的话,先 sleep 一会再读,这样就能尽量保证从机的数据已经同步过来了。
不过这个方案显然不够优雅,发请求先 sleep,怎么想都觉得别扭。
第三种方案就是我们去判断一下主从是否延迟,如果发生延迟了,就等一会,如果数据已经同步了,那就直接查询就行了。
判断是否发生主从延迟,一般来说可以通过两种方式。
seconds_behind_master 参数是一个只读变量,用于表示从服务器(slave)相对于主服务器(master)的复制延迟时间。
这个参数反映了从服务器在复制过程中落后于主服务器的时间长度(以秒为单位)。
这个参数的取值如下:
要查看 seconds_behind_master 的值,我们可以使用以下 SQL 命令:
SHOW SLAVE STATUS\G;
输出中会有一行显示 Seconds_Behind_Master,这就是你要找的信息。
利用 seconds_behind_master 参数,我们可以监控复制延迟,管理员可以据此了解从服务器的复制进度,并确定是否存在复制延迟问题。
> 在 MySQL8.0 之后的版本中,seconds_behind_master 被替换为 replication_lag,但这两个参数的功能是一样的。
GTID 是 MySQL5.6 引入的一个特性,用于跟踪事务在主服务器上的执行情况,并确保这些事务按顺序在从服务器上重现。使用 GTID 进行主从复制可以简化管理和监控,特别是在有多个从服务器或复杂的复制拓扑中。
下面松哥给大家简单演示下如何利用 GTID 判断 MySQL 主从复制是否发生延迟。
确保主服务器和从服务器都配置了 GTID。需要在 MySQL 的配置文件(如 my.cnf 或 my.ini)中设置 server-id 和 gtid_mode。
[mysqld]
server-id = 1 # 主服务器的 server-id
gtid_mode = ON # 启用 GTID
[mysqld]
server-id = 2 # 从服务器的 server-id
gtid_mode = ON # 启用 GTID
可以使用 SHOW MASTER STATUS 和 SHOW SLAVE STATUS 命令来检查主服务器和从服务器的 GTID 状态。
SHOW MASTER STATUS;
> 这里多说一句,从 MySQL8.4 开始,不再使用 SHOW MASTER STATUS;,取而代之的是 SHOW BINARY LOG STATUS。
输出将包括当前的 GTID 执行位置,如下所示:
File: mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 11111111-1111-1111-1111-111111111111:1-100
这里 Executed_Gtid_Set 显示了主服务器已经执行的所有 GTID 的集合。
SHOW SLAVE STATUS\G;
输出将包括从服务器的 GTID 执行位置,如下所示:
...
Master_Host: master.example.com
Master_User: replication
Master_Port: 3306
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Master_Log_File: mysql-bin.000001
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Auto_Position: 1
...
其中 Auto_Position 的值为 1 表示从服务器正在使用 GTID 进行复制。
比较主服务器和从服务器的 Executed_Gtid_Set。如果两者相同,则表示复制没有延迟;如果有差异,则表示存在延迟。
如果发现 GTID 集合之间存在差异,可以通过以下命令查看具体的 GTID:
SELECT @@gtid_executed;
通过比较主从上两个命令执行的结果,就可以知道是否发生了延迟。如果发生了延迟,我们就停一会再去读。
松哥这边的项目第一种方案是使用比较多的,另外两种使用相对比较少。小伙伴们有无遇到类似问题,都是怎么解决的?欢迎留言讨论。
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。
Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。
Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。