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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
5月前
|
Java 程序员 编译器
作为后端开发,感受下接口带来的魅力!🔥🔥
在一场大厂面试中,小南被问及何时选用接口,何时采用抽象类。一位拥有24K粉丝的博主给出解答:选择取决于需求——接口定义多个类需遵守的契约,而抽象类则用于创建共享实现的基类。有时两者结合使用,通过抽象类实现接口以确保契约并提供通用功能。此外,小南还分享了关于抽象类的深入探讨,包括子类如何正确调用父类构造函数、访问父类成员以及父类不可访问的方法等细节。最后,他提出一个关于接口与抽象类差异的小测验,并邀请读者关注他的开源项目《Java学习进阶指南》,旨在帮助Java开发者更好地掌握核心知识和面试要点。
194 3
作为后端开发,感受下接口带来的魅力!🔥🔥
|
5月前
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
6月前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
|
5月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
105 0
|
6月前
|
运维 前端开发 API
运维,如何快速查找后端的接口
运维,如何快速查找后端的接口
|
6月前
|
前端开发 应用服务中间件 nginx
网页设计,若依项目修改(It must be done)01----若依打包位置,nginx代理前端静态资源和后端接口,就是怎样设置转载,访问固定端口,让他访问其他资料的配置文件,访问/,给你那些
网页设计,若依项目修改(It must be done)01----若依打包位置,nginx代理前端静态资源和后端接口,就是怎样设置转载,访问固定端口,让他访问其他资料的配置文件,访问/,给你那些
|
7月前
|
JSON 前端开发 Java
一文读Web开发 之接口后端接口、类与前端请求、拦截器编写
一文读Web开发 之接口后端接口、类与前端请求、拦截器编写
247 6
|
5月前
|
开发框架 前端开发 API
使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
|
6月前
|
开发框架 前端开发 关系型数据库
使用egg.js开发后端API接口系统 什么是Egg.js
使用egg.js开发后端API接口系统 什么是Egg.js

热门文章

最新文章