专栏首页程序员升级之路Nginx配置不当险酿S0

Nginx配置不当险酿S0

线上某服务前端负载均衡为Nginx,后端为Java服务,某天突然大量报服务不可用,具体错误如下:

查看后端服务压力,CPU快200了,赶紧扩容,再限流。

扩容后发现Nginx还是报错,报错仍然如上,这时重启NG就好了,但过段时间问题依旧。

查了下后端的日志,没有报错日志,响应也不慢,不过CPU还是有点高;然后分析下Nginx配置,发现Upstream配置比较可疑:

upstream xxx{
server 192.1686.1.114:6280 max_fails=1 fail_timeout=300s;
server 192.168.160.115:6280 max_fails=1 fail_timeout=300s;
server 192.168.160.116:6280 max_fails=1 fail_timeout=300s;
}

为了保证后端upstream的高可用,Nginx有错误检查机制,当后端返回错误时,可以设置达到多少次错误,则认为这个节点有问题,主动将其下线,等过多少时间后再进行尝试。

max_fails:错误多少次将其标识为下线

fail_timeout:检查周期,即多少时间内错误max_fails次,则将节点标记下线,等下一个fail_timemout周期内再检查服务是否可用。

上面的配置的意思是如果300s内只有后端返回错误超过1次,就将其标记为下线,即这300秒内不会将请求转发到这个节点,过300s后再重新发请求试试,如果再有1次以上报错,依然将其标为下线。

而这个系统的流量分布特点是准点访问量比较大:

在准点时,系统负载猛增,后端有少量报错,这时会将其中1台踢下线,然后压力转移到其它机器,然后其它机器压力也增加,也报错,直到所有后端服务全部不可用。

PS:为什么准点流量这么大,和客户端了解,客户端有个功能,每1个小时从服务端取下配置,在实现时客户端没有做分流处理,全部准点向服务器发送请求,瞬间崩溃。。。

原因找到了,就容易解决了,将上述2参数调整如下:

upstream xxx{
server 192.1686.1.114:6280 max_fails=50 fail_timeout=5s;
server 192.168.160.115:6280 max_fails=50 fail_timeout=5s;
server 192.168.160.116:6280 max_fails=50 fail_timeout=5s;
}

问题彻底解决。

本文分享自微信公众号 - 程序员升级之路(gh_1fab42db66cb),作者:刘江华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 不了解Raft算法敢说自己研究过分布式?

    Raft是一种“共识”算法,共识的含义是保证所有的参与者都有相同的认知,简单来说就是如何做到强一致。

    心平气和
  • 接口403问题没这么容易解决

    最近一同事反馈在后台保存某业务数据时一直报403,该数据由运营人员在后台录入,然后向后端发送POST请求保存数据;现象是如果内容过长如几十K则报403,如果只输...

    心平气和
  • Redis稳定性实践

    本文会讲述作者在线上环境使用redis遇到过的一些坑,主要是一些参数配置和选型,目的只有一个:如何让redis不挂,提高可用性;不涉及到集群方案的选型等内容。

    心平气和
  • Wi-Fi究竟是怎么来的?

    当时的无线电报机,采用的是火花隙式发射机(spark-gap transmitter),主要用来传送摩尔斯电码。

    鲜枣课堂
  • MySQL-多表操作

    联合查询是多表查询的一种方式,在保证多个SELETE语句的查询字段数相同的情况下,合并多个查询的结果

    海盗船长
  • 【一文打尽】SQL 数据分析常用语句.....收藏

    • 1 基础查询 • 2 字符串\数字\日期时间 • 3 聚合数据查询 • 4 子查询 • 5 联接\组合查询 • 6 高级查询 • 7 更新数据

    华章科技
  • 一、Linq简介

    郑小超.
  • 如何通过关键词来查询产品在Mercadolibre平台所属目录?

    先看下效果图,通过输入关键词,就可以查找到Mercadolibre平台可能归属的目录。

    逍遥之
  • Django框架学习(四)

    我们如果是想在文件中直接运行,进行数据库的查询操作,可以按上面的步骤进行设置。并且在定义模型类的时候重写str方法(操作如下)。然后就可以进行查询了。

    小闫同学啊
  • 利用EF Core的Join进行多表查询

    背景 话说有这么一家子,老公养了一条狗,老婆养了一只猫。 数据库的设计 人表 ? 宠物表 ? 通过表可以知道,宠物通过Owner指向主人的Id。 问题来了,我要...

    码农阿宇

扫码关注云+社区

领取腾讯云代金券