云计算之路-黎明前的黑暗:20130424网站故障经过

一、背景

4月18日的访问高峰扛过去之后,我们和阿里云一直在努力寻找问题的真正原因。是问题,躲不去的,不找到根源,随时会突然袭击。

压力测试未能重现问题,只能进行大海捞针般的猜测:SLB(均衡均衡)、Web服务器(虚拟机)、应用程序、缓存服务器(虚拟机)、SLB与Web服务器之间的网络通信,Web服务器与缓存服务器之间的网络通信、Web服务器与RDS(关系型数据库服务)之间的网络通信?

我们怀疑的对象是:SLB(请求分配有问题)、SLB与Web服务器之间的网络通信(TCP连接)、VM与RDS之间的网络通信(TCP连接)。

阿里云怀疑的对象是:我们的应用程序、缓存服务器。

对于我们怀疑的对象,我们没有任何侦测手段,只能将我们的怀疑抛给阿里云。

对于阿里云怀疑的对象,我们一万个不认同应用程序会引起这个问题(应用程序的问题不会引起SLB中的所有Web服务器同时出问题)。对于缓存服务器,存在可能,但我们没有特别重视。因为在之前出问题期间,缓存的命中率在正常范围,即使缓存服务器down掉,也会直接走RDS,访问速度也不会有大的影响。我们有两种类型的缓存服务器memcached与NoSQL,都用的是couchbase。阿里云建议我们memcached与NoSQL都进行负载均衡,昨天我们只对NoSQL进行了负载均衡(负载比较高)。并将memcached与NoSQL客户端的连接超时设置修改为1秒,也就是说只要缓存服务器有问题,1秒钟连接超时后就会直接走RDS从数据库中获取数据。具体设置如下:

<couchbase><servers bucket="default"><add uri="http://ip1:8091/pools" /><add uri="http://ip2:8091/pools" />            </servers><socketPool minPoolSize="20" maxPoolSize="200" connectionTimeout="00:00:01" deadTimeout="00:00:02" />
</couchbase>
<enyim.com><memcached protocol="Binary"><servers><add address="ip1" port="11211" />        </servers><socketPool minPoolSize="20" maxPoolSize="200" connectionTimeout="00:00:01" deadTimeout="00:00:02" /></memcached>
</enyim.com>

今天出故障之前,服务器的部署情况是:SLB+4台Web服务器+1台Memcached服务器+2台NoSQL服务器+RDS。

二、故障经过

上午出现了波动情况,见下图(负载均衡中波动最严重的一台)

(红色曲线是博客IIS站点的Current Connections,绿色曲线是ASP.NET的Reqeust Execution Time)

下午2点开始,故障开始全面爆发,Windows性能监视器中的表现是Current Connections急剧增加、Reqeust Execution Time严重变慢、Requests/s大大减小。

当时采取的解决方法是向负载均衡中增加云服务器,如果加云服务器能解决问题,那就说明是云服务器的负载能力问题。但是加了后发现,刚加之后有些缓解,但很快就故障如初。

后来采取限制每台云服务器的IIS的并发连接数缓解故障的影响面。如果不限制,大家都无法正常访问;限制之后,未被拒绝的请求的访问速度会好些,但被拒绝的请求会出现503错误。在正常期间,来自SLB的并发连接在100以内,但故障期间并发连接在1000之上(因为很多请求得不到正常响应,连接越积越多),我们将IIS的最大连接限制在500才缓解了故障。

但后来即使Current Connections在200多,访问速度也很慢。我们继续加云服务器,有1台云服务器一上去,500的连接限制立即跑满。我们当时还以为是SLB分配请求有问题,实际是SLB给云服务器的请求得不到响应,像堵车一样堵在那,越堵越多。

期间,阿里云技术人员发现memcached那台云服务器磁盘IO高(这也是奇怪情况,memcached只在内存中进行缓存),问题可能与memcached服务器有关,但从couchbase控制台看memcached的缓存命中率正常。我们在一台Web服务器上试了不走memcached,但从测试情况看,那台服务器的响应速度还是慢(可能当时是因为很多请求继续在那堵着)。

后来,阿里云技术人员发现memcached那台云服务器内网接口流量波动很大(这个监视数据我们看不到)。

于是,我们想到重启memcached服务器(操作系统是CentOS 6.2 64位)试试。结果reboot命令发出不久(17:00左右),故障竟然消失了,Current Connections立即下降,打开网站速度飞快(在memcached服务器重启阶段,memcached客户端连接超时,程序会直接从数据库取数据)。等memcached服务器启动好之后,故障又立即出现。

于是,我们关闭那台memcached服务器,故障又立即消失。然后重新购买了一台云服务器,操作系统是CentOS 6.3 64位,安装同样版本的couchbase,切换上去,故障没有出现。网站就这么恢复了正常。晚上我们又加了一台memcached服务器,用2台组建了负载均衡。

忙完之后,就写了这篇博客。

我们已经无颜向大家道歉了,我们只有一个选择:全力以赴彻底解决这个问题,战胜困难,度过难关!

故障原因分析见:云计算之路-柳暗花明:为什么memcached会堵车

转载于:https://www.cnblogs.com/cmt/archive/2013/04/24/3041368.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sting练习

package com.book.lite;import java.util.Locale; import java.util.Scanner;/*1. 字符串的两种定义方式的区别:String a1 ""; 只有一个对象:String a2 new String(); 有两个对象2. String类的特点是什么底层代码的不变性&#xff0c;将字符串拆分成字符数组char[]…

枚举生成MVC3: Bind Enum To DropDownList ?-java教程

发一下牢骚和主题无关&#xff1a; 0. 预备测试数据 0.1 : 枚举 using System; using System.Collections.Generic; using System.Linq; using System.Web;namespace MvcApplication.Models {public enum YesOrNo{否 0,是 1} } 0.2 : 对应实体类及表sql using System; using…

(JAVA)StringBuffer类

可变数组&#xff1a;StringBuffer类(静态缓冲区) 提高字符串的操作效率 StringBuffer 底层实现原理是字符数组&#xff0c;没有final StringBuffer,含有数组char[] value 默认长度是16 在JAVA中&#xff0c;数组是固定长度&#xff0c;一旦创建不能改变 StringBuffer 通过数组…

40个超酷的jQuery动画教程

原文地址&#xff1a;http://www.goodfav.com/40-cool-jquery-animation-tutorials-1189.html 由于它的到来&#xff0c;已经引起了jQuery的网络风暴&#xff0c;现在是创建漂亮的网页上的动画的首选解决方案之一。 jQuery提供了很大的跨浏览器支持&#xff0c;它是轻量级且易于…

好东西,资料!!

架构&#xff1a; http://www.cnblogs.com/lovecindywang/archive/2012/12/23/2829828.html http://www.cnblogs.com/angben/archive/2012/12/23/2829795.html http://blog.csdn.net/longxibendi/article/details/6628480 企业应用集成可以在不同层面上进行&#xff1a;例如在数…

(JAVA)StringBuffer类(练习)

package com.book.lite;import java.util.Scanner;/* 1.将数组拼接成字符串 2.自定义方法&#xff0c;将缓冲区翻转*/ public class StringBufferDemo2 {public static void main(String[] args){System.out.println(getString_1());System.out.println(getString_2());}public…

hdu2955 Robberies (动态规划之背包)

http://acm.hdu.edu.cn/showproblem.php?pid2955 题意&#xff1a;Roy想要抢劫银行&#xff0c;每家银行多有一定的金额和被抓到的概率&#xff0c;知道Roy被抓的最大概率P&#xff0c;求Roy在被抓的情况下&#xff0c;抢劫最多。 分析&#xff1a;被抓概率可以转换成安全概率…

数组排序之冒泡排序

package com.book.lite;/*** author zhangyu* date 2021年08月11日 10:51 下午* 实现整数数组的排序&#xff0c;顺序排序&#xff0c;冒泡排序*/ public class arrDome {public static void main(String[] a){int[] arr {2,0,9,8,67,-45,-199}; // smallNumber(arr); …

黑马Java学习笔记之-----集合框架

---------------------- android培训、java培训、期待与您交流&#xff01; ---------------------- 一&#xff0e;概述&#xff1a; Java的集合类是一种特别有用的工具类&#xff0c;它可以用于存储数量不等的多个对象&#xff08;实际上是对象的引用&#xff09;&#xff0c…

(JAVA)二分法

package com.book.lite;/*** author zhangyu* date 2021年08月12日 11:15 下午* 使用二分法&#xff0c;查找有序数组的某一个值*/ public class binarySeach {public static void main(String[] args){int[] arr {2,4,5,9,45,65,74,83,100};int index arrNumber(arr,0);Syst…

35岁前成功原则

第一章:一个目标 一艘没有航行目标的船&#xff0c;任何方向的风都是逆风 1、你为什么是穷人&#xff0c;第一点就是你没有立下成为富人的目标 2、你的人生核心目标是什么&#xff1f; 杰出人士与平庸之辈的根本差别并不是天赋、机遇&#xff0c;而在于有无目标。 3、起跑领先一…

(JAVA)Arrays数组工具类

package com.book.lite; /*** author zhangyu* date 2021年08月14日 10:52 下午* 数组的工具类&#xff0c;方法是静态的* sort() 排序* binarySearch() 二分查找* toString() 将数组变成字符串&#xff0c;是数组工具类独有的方法*/ import java.util.Arrays; public class Ar…

2013-05

Tom Cubie &#xff0c;CubieBoard&#xff08;类树莓派&#xff09;的设计者 http://www.fendou.info/tag/cubieboard/ LevelDB关键实现图解 http://www.wzxue.com/leveldb%E5%9B%BE%E8%A7%A3/ 电子商务系统的设计、开发、部署、运维及其解决方案 http://www.entlib.com/ 迷你…

(JAVA)基本数据类型 对象包装类

package com.book.lite;/*** author zhangyu* date 2021年08月15日 4:51 下午* 基本数据类型 对象包装类* 对八个基本数据类型&#xff0c;提供8个类&#xff0c;&#xff0c;将基本数据类型&#xff0c;封装成8个对象* byte Byte* short Short* int I…

作业自动提示功能设计思路

1、利用现在FLEX项目中的心跳包机制&#xff0c;使用SOCKET心跳包技术获取最新的作业情况。 2、在现在FLEX项目中有一个&#xff1a; 核心代码&#xff1a; 这样我们可以利用这个通道&#xff0c;获取相应的信息。 具体修改步骤如下&#xff1a; 1、准备工作 创建一张表&#x…

(JAVA)Integer类之基本数据类型之间的转换

package com.book.lite;/*** author zhangyu* date 2021年08月15日 8:01 下午* Integer类&#xff0c;其他常用方法&#xff1a;* 1.parseInt(String i) 将数字格式字符串&#xff0c;转换成基本数据类型* 2.parseInt(String i, int radix) 将数字类型字符串转换成进制数* 3.t…

java文件读写操作大全

转自http://blog.sina.com.cn/s/blog_4a9f789a0100ik3p.html 一.获得控制台用户输入的信息 1 public String getInputMessage() throws IOException...{2 System.out.println("请输入您的命令∶");3 byte buffer[]new byte[1024];4 …

(Java)Integer类的其他常用方法

package com.book.lite;/*** author zhangyu* date 2021年08月15日 8:01 下午* Integer类&#xff0c;其他常用方法&#xff1a;* 1.parseInt(String i) 将数字格式字符串&#xff0c;转换成基本数据类型* 2.parseInt(String i, int radix) 将数字类型字符串转换成进制数* 3.t…

libev源码分析--常用的watcher

在上一篇文章里&#xff0c;我们分析了libev整体设计思想和主循环的工作原理&#xff0c;也提到了watcher是衔接开发者代码的主要入口。watcher与开发者最接近&#xff0c;也与具体事件处理逻辑最接近。所以&#xff0c;watcher的具体实现&#xff0c;与性能的关系也相当密切。…