【故障公告】发布 .NET Core 版博客站点引起大量 500 错误
非常抱歉,今天上午的博客站点故障给大家带来了很大的麻烦,请大家谅解。这次故障是我们发布 .NET Core 版博客站点引起的,虽然我们进行了充分的准备,但还是低估了高并发下的复杂问题。
以下是故障背景与大致经过:
在这个炎炎夏日,我们正热火朝天地忙着整个 .NET Core 迁移工程的收官 —— 发布 .NET Core 版博客站点与博客后台。我们的其他系统都早已迁移至 .NET Core 并已在线上工作一番时日,只剩下最难啃的硬骨头 —— 博客系统,到这个月这根钢铁般坚硬的硬骨头也被啃得差不多了,它的发布上线将为我们整个 .NET Core 迁移工程画上完美的句号,并顺带以此里程碑迎接 .NET Core 3.0 正式版的发布。
所以,发布 .NET Core 版博客站点与博客后台成为我们8月份最重要的工作。.NET Core 版博客站点7月份就已经完成开发,这段时间一边进行更进一步的内测,一边进行灰度发布,接入一些生产流量以发现我们测试中未能发现的问题并进行修复,在上个周末接入更多生产流量进行测试与修复后,我们已经很有信心,评估后认为已具备正式发布条件,除了我们无法在测试环境中模拟的博客系统所处的复杂高并发场景。
于是一边带着信心,一边带着对高并发问题的担心,我们决定在今天一大早进行发布。
发布时的部署场景是这样的,博客系统基于 .NET Core 3.0 Preview 7 (EF Core 用的还是 3.0 Preview 5),7台阿里云 centos 服务器组建了 docker swarm 集群,6台4核8G服务器作为 worker 节点跑博客站点的应用容器,1台2核4G的服务器作为 manager 节点(不部署任何容器),每个 worker 节点都部署 1 个 nginx 与 .net core 博客应用容器,所有请求都由阿里云均衡转发到 nginx 容器,再由 nginx 容器转发给 .net core 应用容器,nginx 通过端口映射的方式监听 worker 节点服务器的 80 端口。
这样的部署环境也是我们经过长期验证的,唯一没有经过验证的就是博客系统这么高的并发。
顶着2个高并发问题的风险(docker swarm 与 .net core ),我们在今天早上 5:30 左右进行了发布。
开始访问量小,并发低,没出现问题,但到 8:30 左右出现问题了,打开很多博客页面要1秒多(正常情况是几十毫秒),而在容器内用 curl 命令请求都不到10毫秒。
$ docker exec -t $(docker ps -f name=blog_web -q) curl -H 'X-Forwarded-Proto:https' -w %{time_total} -o /dev/null -s localhost
0.002876
怀疑是 nginx 的问题,准备重新创建一个 docker 集群,不用 nginx 直接用 kestrel 监听 80 端口。
后来同事指出,不是 nginx 的问题,是 docker swarm 端口映射在高并发下的性能问题,只有将端口映射改为 host 网络模式才能解决这个问题。
9:30 左右,随着并发越来越高,nginx 容器开始报 500 错误,开始以为是集群中的服务器负载过高,于是向 docker swarm 集群中添加服务器,但于事无补,500 错误越来越多。
出现 500 错误时,有时刷新一次就会好,有时要刷新好几次,怀疑是集群中某些服务器不稳定,于是一台一台登录集群中的服务器进入容器用 curl 命令进行测试,除了1台服务器不稳定,其他服务器 curl 命令测试时响应速度都正常,将那台不太稳定的服务器下线,问题依旧,随着并发量继续增大,500 错误也继续增多。
进一步分析后,怀疑 500 错误是因为高并发下 nginx 容器与 .net core 应用容器之间的网络通信出现问题,于是 10:30 左右决定放弃这次发布,回退至跑在 Windows 上的 .net framework 版本博客站点,恢复了正常。
【故障公告】发布 .NET Core 版博客站点引起大量 500 错误的更多相关文章
- 【网站公告】.NET Core 版博客站点第二次发布尝试
在上次发布失败后,很多朋友建议我们改用 k8s ,但我们还是想再试试 docker swarm ,实在不行再改用 k8s . 在改进了 docker swarm 集群的部署后,我们准备今天 17:30 ...
- 同“窗”的较量:部署在 Windows 上的 .NET Core 版博客站点发布上线
为了验证 docker swarm 在高并发下的性能问题,周一我们发布了使用 docker-compose 部署的 .net core 版博客站点(博文链接),但由于有1行代码请求后端 web api ...
- 暴风雨中的 online :.net core 版博客站点遭遇的高并发问题进展
今天暴风雨袭击了杭州,而昨天暴风雨(高并发问题)席卷了园子,留下一片狼藉. 在前天傍晚,我们进行了 .net core 版博客站点的第二次发布尝试,在发布后通过 kestrel 直接监听取代 ngin ...
- 峰回路转:去掉 DbContextPool 后 Windows 上的 .NET Core 版博客表现出色
今天早上,我们修改了博客程序中的1行代码,将 services.AddDbContextPool 改为 services.AddDbContext ,去掉 DbContextPool . 然后奇迹出现 ...
- k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
非常非常抱歉,新年上班第一天, 在今天阿里云上气候突变情况下,由于我们开船技术差,在今天 10:15~12:00 左右的访问高峰,我们竟然把船给开翻了,造成近2个小时整个博客站点无法访问,由此给您带来 ...
- 【故障公告】博客站点再次出现故障,最终回退 .NET 5.0 恢复正常
自从博客系统升级 .NET 5.0 之后遇到的诡异故障(一.二.三.四),今天它又出现了,就在前天刚刚故障之后, 就在昨天 .NET 5.0 正式版刚刚发布之后,出现了. 今天晚上我们在 19:30 ...
- 【故障公告】redis 服务器宕机引发博客站点故障
非常抱歉,今天下午 17:10~17:40 左右,由于博客系统所使用的 redis 服务器宕机,造成博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 我们会针对这次故障改进 redis 服务器 ...
- 故障公告:IIS应用程序池停止工作造成博客站点无法访问
非常抱歉,今天凌晨博客站点负载均衡中所有3台服务器的IIS应用程序池突然停止工作,造成 1:20-7:45 左右博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 服务器操作系统是 Window ...
- [故障公告]14:39-15:39博客站点部分负载均衡遭遇3次20G以上的流量攻击
非常抱歉,今天下午14:39-15:39左右,博客站点的部分负载均衡遭遇3次20G以上的流量攻击,造成很多用户不能正常访问.由此给您带来麻烦,请您谅解. 攻击的过程是这样的: 14:39,第1次攻 ...
随机推荐
- OpenCV常用数据结构和函数
点的表示:Point类 Point类数据结构表示二维坐标系下的点,即由其图像坐标x,y指定的2D点. 用法如下 Point point; point.x = 10; point.y = 8; 或者 P ...
- chmod命令用法详解-chmod修改目录权限
chmod用法: 用来修改某个目录或文件的访问权限. 语法: chmod [-cfvR] [--help] [--version] [who] [+ | - | =] [mode] 文件名 例子: ...
- 一个简易的css reset
/*css reset*/ /*清除内外边距*/ body, h1, h2, h3, h4, h5, h6, p, hr, /*结构元素*/ ul, ol, li, dl, dt, dd, /*列表元 ...
- SCUT 125 :笔芯回文(DP)
https://scut.online/p/125 125. 笔芯回文 题目描述 bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作. 每次操作可以删掉一个长度为k(1 \leq k \ ...
- JavaWeb知识点
- 深入学习Spring框架(二)- 注解配置
1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...
- Cow Exhibition POJ - 2184
题目地址:https://vjudge.net/problem/POJ-2184 下面的解释是从一个大佬那搬来的,讲的很清楚题意:给定一些奶牛,每个牛有s和f两个属性值,有正有负,要求选出一些牛,使得 ...
- 后端访问sso后,如何返回前端vue页面(后端redirect跳转,vue代理,axios带参)
由于项目要加上公司的sso,出现的一系列问题,找到解决办法,在此记录一下.可能并不适合其他项目,给个参考. 前提: 前端是vue.js,后端springboot sso配置需要增加公司自己的maven ...
- android_sdcard读写(二)
接着上篇,继续研究sdcard的神秘之处.上篇代码不变,本篇新增代码都在下面~~~ 继续上代码~~ // 写文件 File path = new File("/mnt/sdcard/sxp/ ...
- 教你发布vue+.netCore项目到服务器
最近一直在做项目,发布部署的事情都是同事或者老大做的,无奈什么事都要自己尝试经历后才能记住,所以发布的事情轮到我了,由于是第一次发布部署项目到一个新的服务器环境,难免会遇到各种各样的问题,总结下来,希 ...