设为首页 收藏本站
查看: 660|回复: 0

[经验分享] Nginx+Tomcat集群的故障迁移实验

[复制链接]

尚未签到

发表于 2016-12-26 08:15:51 | 显示全部楼层 |阅读模式
  经过前面的集群实施,已经将Nginx+Tomcat的集群环境给配置起来了,接着继续进行集群的故障转移实验.
  这里的故障转移包括节点关闭情况和节点宕机情况的故障转移.
  首先对于节点关闭或加入的情况,比如某一Tomcat节点关闭或重启的情况,在这种情况下,nginx可以快速识别到已停用或新加入的节点,基本上可以做到无延时的故障转移.所以这里主要实验的是tomcat宕机的情况,比如tomcat运行过程中出现内存溢出或长时间不响应的情况.
  为了实验的需要,在tomcat7080的启动参数中增加内存的配置,设置其最大可用内存为64m:

JAVA_OPTS="-Xms32m -Xmx64m"
  并在tomcat7080中,使用一段程序不断地往内存中写入数据,以使它出现内存溢出错误,不再处理新的访问请求.

<body>
<%!
static HashMap<String,String> map = new HashMap<String,String>();
public String generateStr(){
StringBuilder s = new StringBuilder();
while(s.length()<50){
s.append(new Random().nextInt());
}
return s.toString();
}
%>
<%
int c = 500000;
try {
c=Integer.parseInt(request.getParameter("c"));
} catch(Exception e){
c = 500000;
}
for(int i = 0; i < c ;i++){
map.put(String.valueOf(1000000+i),generateStr());
}
%>
</body>
  在tomcat7080启动之后,访问这段程序所在的jsp文件,tomcat很快便出现内存溢出错误,成功宕机.
  此时通过程序来模拟一个单并发,每秒发出一次请求的客户端:

public static void main(String[] args) {
for (int i = 0; i < 90; i++) {//测试90次
try {
doGet();
Thread.sleep(1000);
} catch (Exception e) {
// e.printStackTrace();
}
}
}
public static void doGet() throws Exception {
URL url = new URL("http://localhost/");
HttpURLConnection conn;
BufferedReader reader = null;
conn = (HttpURLConnection) url.openConnection();
String s;
int rc = conn.getResponseCode();
if (rc != 200) {
System.out.println("WARN: response code:" + rc);
}
reader = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "UTF-8"), 512);
String line;
while ((line = reader.readLine()) != null) {
}
if (reader != null)
reader.close();
}

  日志文件中的输出结果为:
  
DSC0000.png
 
  从日志输出中可以看到,nginx仍然会尝试去请求已经宕机的7080端口,但在等待60秒之后将请求转发给了6080,然后在大约13秒左右的时间内都只会请求6080端口,然后再去尝试请求7080端口,依次循环.
  要解释出现这个现象的原因,需要来看一下集群中server的参数以及proxy_connect_timeout, proxy_read_timeout等参数的设置
  在nginx中,upstream中的server语法如下:
  (参考http://nginx.org/en/docs/http/ngx_http_upstream_module.html)

  server address [weight=number] [max_fails=number] [fail_timeout=time] [slow_start=time] [backup] [down];
  其中max_fails和fail_timeout的默认值分别为1和10s,这两个参数配置起来使用.含义是:在fail_timeout的时间内,nignx与upstream中某个server的连接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。所以在默认的情况下,nginx在前一次尝试连接7080端口失败后,在10秒之后才会再次去尝试(这里的实际是大约是13秒,考虑请求转发的原因,基本上可以认为是一个正常值).
  然后是location中的proxy_connect_timeout和proxy_read_timeout设置.这两个参数的含义如下:
  proxy_connect_timeout 
  后端服务器连接的超时时间_发起握手等候响应超时时间(默认为60s,不建议超过75s)
  proxy_read_timeout 
  连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)(默认为60s)
  分析我们前面的实验,tomcat7080在内存溢出的情况下,仍然能够与nginx完成握手,但是却不能处理结果,所以等待的一分钟时间是耗费在proxy_read_timeout了.如果能设置一个合适的值,就可以在可接受的时间范围内,完成集群的故障迁移.
  在测试过程中,最终的故障迁移时间配置如下:

upstream cluster {
server localhost:6080 weight=10 fail_timeout=1m;
server localhost:7080 weight=10 fail_timeout=1m;
  }
  
  
location / {
  proxy_pass http://cluster;
  proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_connect_timeout       2s;
  proxy_read_timeout          5s;
  proxy_send_timeout          5s;
}
  即可承受的请求响应时间为5s,在故障被检测到之后,1m内不再向故障节点发起新请求.(实际生产环境中可按需要适当进行调整)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-319366-1-1.html 上篇帖子: Nginx Rewrite 去掉重定向的参数 下篇帖子: 使用ab对nginx进行压力测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表