记录一次后端接口抖动的排查过程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 某天下午,测试新功能时发现页面接口偶尔变慢,平均十次调用中有三到四次出现3秒以上的延迟。排查了接口、数据库和服务器资源后未发现问题,最终锁定为K8s节点的负载均衡策略导致。测试环境仅有一个公网IP,SLB轮询四个Pod(其中三个为空),造成周期性延迟。移除空Pod后问题解决。

引子

某天下午,提交了代码的我正在测试环境狠狠地测试刚完成的新功能,把业务流程走了一遍没发现什么问题,美滋滋地准备享受下午茶,但突然发现页面上有的接口打开速度变慢了,要好几秒,刚开始以为是自己的网卡了,刷新后又测试了几下,发现确实有时候接口会变慢,于是开始了漫漫排查之路!

1.png

一、问题

在页面上表现出来的效果是:测试环境下的接口偶尔出现变慢的情况。经过统计发现一定规律:平均调用十次的情况下,差不多每隔三到四次就会出现一次抖动,并且时间基本在3秒多。
2.png

二、开始排查

1.接口

接口变慢首先肯定就要排查接口本身,但是前段时间还好着,今天突然就这样了。再加上出于对自己的自信,我是没觉得是接口的问题,但为了严谨,该有的流程还是得有,于是测试了部分会变慢的接口,经过排查,接口的响应速度很正常,并没有出现抖动现象。
3.png

2.数据库

排除了接口本身,就往更深一层的数据库去考虑了。通过对接口的测试,我们就已经可以排除慢SQL的可能,但我们要排查是否会出现高CPU、高I/O(虽然通常情况下,它们也是由慢SQL引起的),但是还有别的因素可能也会影响,比如数据缓冲池的大小(如果数据不在缓冲池中,那么MySQL就需要从磁盘中读取数据,并将其放入缓冲池中,这就涉及到磁盘I/O操作。对于写操作,如果数据页不在缓冲池中,那么MySQL会先将数据页读入缓冲池,然后在缓冲池中进行修改,最后由后台线程异步地将修改后的数据页写回磁盘。)等。

因此,对于这里的排查就显得有必要了,这里我们会用到一个小工具——iotop,它可以实时监控磁盘I/O情况,它的安装和使用也非常简单:

# 步骤一:安装iotop,根据自己的系统选择对应的安装命令
sudo apt-get install iotop -y
# 步骤二:查找MySQL的进程ID
ps aux | grep mysql
# 步骤三:使用iotop监控MySQL进程
sudo iotop -p <mysql_pid>

4.png
虽然当时在这个环节信心满满地以为找到了问题,但很可惜,MySQL的I/O没有问题,并且通过对服务器的可视化监控,CPU和磁盘也都很正常,没出现过高占用的情况。
5.png

3.k8s

回到最开始的问题,通过统计数据不难看出,接口抖动现象的发生呈现出了周期性和规律性,因此我在想会不会是它们共同依赖的某个基础服务或接口出现了问题,因为它们都依赖了用户相关的接口,于是我对用户相关的接口又进行了一次统一的测试,但很无奈,它们呈现出了和其他接口相同的问题,但也说明:是比用户服务还要更基础的底层服务或接口出了问题。
6.png
那不就是API网关了嘛,突然就想通了问题所在,我们的测试环境并没有装API网关(出于成本考虑),在几天前,测试环境下的节点里每个服务都有一个对外暴露的IP,当外部的API请求发送到这个节点,再由节点里的服务根据域名去匹配服务,再由服务转发到相应的pod。

但也是出于成本考虑,运维同学将公网IP只留了一个,API请求发送过来后,由节点根据SLB(负载均衡)的轮询策略去轮询pod,而我们这个节点有四个pod,真正的后端服务其实只有一个,其他的就当成空的pod吧,那么在轮询策略下,自然而然地就出现了周期性变慢。
7.png
我画了一个草图来进行说明,但这种做法并不被官方推荐,最起码还是配置一下Ingress,我们这里只是为了图方便这么做(毕竟是测试环境),这里我们的做法是在这个节点里去掉了其他的pod,问题解决!
8.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
4月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
387 17
|
4月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
114 18
|
4月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
128 10
|
6月前
|
SQL JSON 关系型数据库
17.6K star!后端接口零代码的神器来了,腾讯开源的ORM库太强了!
"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端定制返回 JSON 的数据和结构"
126 1
|
12月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
Java 程序员 编译器
作为后端开发,感受下接口带来的魅力!🔥🔥
在一场大厂面试中,小南被问及何时选用接口,何时采用抽象类。一位拥有24K粉丝的博主给出解答:选择取决于需求——接口定义多个类需遵守的契约,而抽象类则用于创建共享实现的基类。有时两者结合使用,通过抽象类实现接口以确保契约并提供通用功能。此外,小南还分享了关于抽象类的深入探讨,包括子类如何正确调用父类构造函数、访问父类成员以及父类不可访问的方法等细节。最后,他提出一个关于接口与抽象类差异的小测验,并邀请读者关注他的开源项目《Java学习进阶指南》,旨在帮助Java开发者更好地掌握核心知识和面试要点。
243 3
作为后端开发,感受下接口带来的魅力!🔥🔥
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
313 0
|
运维 前端开发 API
运维,如何快速查找后端的接口
运维,如何快速查找后端的接口