NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

电商网站的宕机案例分析

  • 2012-11-08
  • 本文字数:2035 字

    阅读完需:约 7 分钟

性能调优社区 dynatrace 在其博客中分享了客户案例,电商网站在假日客流峰值期间数次崩溃,经过 SQL 优化和调整负载均衡算法解决了相关问题,值得读者借鉴。

按照博文的描述,该电子商务网站在圣诞节期间崩溃了七次,每次宕机的时间都超过 5 个小时。这种情况让企业损失了大量的收入和名誉。

我们的一个客户就曾经遭遇到这种情况,我们在此分享下他们的经历。宕机的原因有很多,不过我们这里只强调比较突出的一点,即负载均衡器在采用 Round-Robin(轮询)算法时比 Least-Busy (最休闲)算法更容易导致应用服务器因堆内存耗尽而崩溃。

在分析性能问题之前,先看一看该网站的拓扑结构。该电子商务网站部署在 6 个 Tomcat 应用服务器上,前面是 3 个 Apache Web 服务器。

面临的问题是,在负载高峰时刻,每个 Tomcat 实例处理的响应时间开始增长,等待队列中的请求数目增多。一段时间之后,这些 Tomcat 实例由于 OutOfMemory 异常而崩溃,随后其他实例也因为承受不住由此增加的负载而宕机。

即使在采用平均分布负载的算法(Round Robin)下,有些 Tomcat 应用服务器也会出现响应时间的跳跃。一旦服务器开始拒绝客户连接,我们会发现一些连锁反应。数据库层出现大量的异常,同时应用层之间会抛出异常,Web 服务器会返回给浏览器 HTTP 500 的错误。

比如,在实际的分析过程中,我们发现某一个 Tomcat 实例在 30 分钟内对 43000 个页面返回了 HTTP 500 错误。

原因分析:来自数据库层(JDBC)的异常是分析该问题的关键入口。仔细查看这些异常会发现连接池已经耗尽了,从而导致应用的各个部分出现问题。由于连接池的原因,每一个请求都需要平均等待 3.8 秒来从池里获取连接。

不光是连接池大小的设置问题,而且不少低效的数据库语句在执行应用的一些业务逻辑事务时花费了太长时间。这导致应用服务器维护这个连接的时间也较长。如果把负载均衡器设为 Round Robin 算法,应用服务器会继续获得其他的请求。最终,由于客户请求的随机性,某个应用服务器收到了不少执行低效数据库处理的请求。一旦连接池耗尽,应用服务器就开始抛出异常,并最终导致 JVM 崩溃。一旦第一个应用服务器出现问题,用不了多久其他服务器也挂掉了。

解决办法:优化应用程序和负载均衡器

首先要分析执行最慢的数据库语句,并做性能优化,比如增加索引等。同时也优化了连接池大小来满足高峰时刻的需求。然后,企业把负载均衡器的算法从 Round-Robin 改为了 Least-Busy,在生产环境中这个配置经常被人遗忘。自从对应用程序和负载均衡器做了修改之后,网站再也没有崩溃。

该企业之前做过负载测试,但是存在两个问题:

  1. 没有使用预期的峰值负载长时间测试。
  2. 没有完全模拟用户行为,测试脚本太少、太简单,缺少了用户的高交互性访问场景。

由此等到的经验教训:在生产环境的低访问量时段(凌晨 2 点到 6 点)执行负载测试,这样可以虽然有小的交易风险,但是可以避免大的经济损失。高峰时间长为 10 小时,不要测试太短时间。

关于负载均衡的基本算法,主要有以下几种(参考 F5 产品):

  • 随机:负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,然后把连接发送给它。虽然许多均衡产品都支持该算法,但是它的有效性一直受到质疑,除非把服务器的可运行时间看的很重。
  • 轮询:轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。轮询算法在大多数情况下都工作的不错,但是如果负载均衡的设备在处理速度、连接速度和内存等方面不是完全均等,那么效果会更好。
  • 加权轮询:该算法中,每个机器接受的连接数量是按权重比例分配的。这是对普通轮询算法的改进,比如你可以设定:第三台机器的处理能力是第一台机器的两倍,那么负载均衡器会把两倍的连接数量分配给第 3 台机器。
  • 动态轮询:类似于加权轮询,但是,权重值基于对各个服务器的持续监控,并且不断更新。这是一个动态负载均衡算法,基于服务器的实时性能分析分配连接,比如每个节点的当前连接数或者节点的最快响应时间等。
  • 最快算法:最快算法基于所有服务器中的最快响应时间分配连接。该算法在服务器跨不同网络的环境中特别有用。
  • 最少连接:系统把新连接分配给当前连接数目最少的服务器。该算法在各个服务器运算能力基本相似的环境中非常有效。
  • 观察算法:该算法同时利用最小连接算法和最快算法来实施负载均衡。服务器根据当前的连接数和响应时间得到一个分数,分数较高代表性能较好,会得到更多的连接。
  • 预判算法:该算法使用观察算法来计算分数,但是预判算法会分析分数的变化趋势来判断某台服务器的性能正在改善还是降低。具有改善趋势的服务器会得到更多的连接。该算法适用于大多数环境。

有关电商网站在假期峰值解决方案的经验分享,InfoQ 中文站以前曾专门采访过淘宝的几位专家:

国内一年一度的光棍节电商促销又要开始了,开发和运维人员将面临巨大的挑战。有关技术分享,InfoQ 中文站将持续关注。

2012-11-08 20:506140
用户头像

发布了 501 篇内容, 共 248.4 次阅读, 收获喜欢 57 次。

关注

评论

发布
暂无评论
发现更多内容

大数据培训:RDD、DataFrame的区别

@零度

大数据 spark

iuap 助力鹏鹞环保打造智慧水务大数据运营管理平台

用友BIP

用友 用友iuap

3 月亚马逊云科技培训与认证课程,精彩不容错过!

亚马逊云科技 (Amazon Web Services)

架构师 培训

你可以不知道KFC疯狂星期四,但不能不知道InfoQ会员周!七天限时福利冲冲冲!

InfoQ写作社区官方

热门活动 InfoQ会员周

OAuthApp H5 应用开发/云托管平台

unclewang

微服务 前端 .net core H5制作 SaaS平台

“东数西算”超级工程上马,利好云计算但暗藏汹涌

行云管家

云计算 混合云 多云 东数西算

改进DevSecOps框架的 5 大关键技术

禅道项目管理

DevOps 敏捷 自动化

安全大讲堂 | 2022产业趋势洞察:网络安全的下一个十年

腾讯安全云鼎实验室

网络安全 未来发展

MVCC 时光机:在 TiDB 的时空自由穿梭丨渡渡鸟复兴会赛队访谈

PingCAP

功效护肤理念增强,透明质酸继续引领护肤热点

易观分析

护肤 医美 透明质酸

如何编写有效的常见问题解答(内附 5 个最佳示例)

小炮

在线TOML转YAML工具

入门小站

工具

分库分表中间件的高可用实践讲解

Linux服务器开发

高可用 高并发 中间件 Linux服务器开发 Linux后台开发

财富管理2.0时代,券商数字营销突围之路

Speedoooo

数字化转型 解决方案 营销数字化 数字化业务战略 数字营销

【专访蓝景科技】5G+实时云渲染赋能数字孪生,共建元宇宙

3DCAT实时渲染

5G 数字孪生 实时云渲染

方舟开发框架容器类API的介绍与使用

HarmonyOS开发者

方舟 HarmonyOS 开发框架

web前端培训:React 核心调度功能的实现

@零度

前端开发 React

Apache SeaTunnel & Kyuubi 联合 Meetup | 见证中国大数据崛起!

Apache SeaTunnel

大数据 开源 大数据平台 apache 社区 Apache SeaTunnel

CRM系统帮助降低业务成本的方式

低代码小观

企业管理 CRM 企业管理系统 CRM系统 客户关系管理系统

黄东旭: 关于基础软件产品价值的思考

PingCAP

【51单片机】介绍

謓泽

单片机 3月月更 51

ModStartCMS 模块化建站系统 Laravel 9.0 版 v3.3.0

ModStart开源

三步教企业搭建产品帮助中心

小炮

4种常见分支模式解析及优劣对比 | 研发效能提升36计

阿里云云效

阿里云 云原生 研发团队 研发 分支管理

项目启动 | 德荣医疗携手用友iuap共谱数字化转型新篇章

用友BIP

用友 用友iuap

基于小熊派开发板设计的云端绿化管理系统

DS小龙哥

IoT 3月月更

技术平台&应用开发专题月 | 一文搞懂全链路监控系统(上)

用友BIP

用友 用友iuap

FinClip 黑客马拉松正式开赛,码力集结,等你来战!

Speedoooo

小程序生态 hackathon APP开发 黑客马拉松 黑客松

Linux之traceroute命令

入门小站

Linux

天翼云基于 KubeEdge 的大规模 CDN 场景落地实践

华为云原生团队

开源 云原生 边缘计算 边缘技术 边缘云

LigaAI完成A轮融资,加速打造全新的智能研发协作平台

LigaAI

行业资讯 智能 LigaAI A轮融资 研发协作平台

电商网站的宕机案例分析_后端_崔康_InfoQ精选文章