`
dinguangx
  • 浏览: 243210 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Nginx+Tomcat集群的故障迁移实验

阅读更多

  经过前面的集群实施,已经将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();
	}

 

  日志文件中的输出结果为:



 

 

  从日志输出中可以看到,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内不再向故障节点发起新请求.(实际生产环境中可按需要适当进行调整)

  

  • 大小: 82 KB
分享到:
评论

相关推荐

    nginx+tomcat7+memcached session会话保持

    在Tomcat中,我们可以使用第三方库如`memcached-session-manager`来实现会话到Memcached的迁移。在Tomcat的`lib`目录下添加该库的jar包,比如`tomee-memcached-session-manager-x.x.x.jar`,并配置`context.xml`: ...

    负载均衡nginx+tomcat+terracatta+nfs+mysql

    多台Tomcat配合Nginx可以形成一个集群,提高服务的可用性和响应速度。 3. **Terracotta(会话共享)**:在分布式系统中,保持用户会话的一致性是关键问题。Terracotta是一个开源的Java集群框架,它允许在多个Tomcat...

    linux下nginx+memecached+tomcat负载均衡故障转移

    每个Tomcat实例应配置相同的session复制策略,确保用户会话在服务器之间透明地迁移,避免因服务器故障导致用户登录状态丢失。 在代码层面,良好的编程习惯和设计模式也会影响系统的可扩展性和可靠性。例如,采用无...

    使用redis解决nginx+tomcat8负载均衡集群session共享问题jar包

    在构建分布式系统时,尤其是采用nginx作为反向代理服务器和tomcat作为应用服务器的架构,一个常见的挑战是如何在集群环境中保持用户的会话(session)一致性。`标题`中提到的"使用redis解决nginx+tomcat8负载均衡...

    Nginx+Tomcat6+Membercached 实现负载均衡

    标题中的“Nginx+Tomcat6+Memcached 实现负载均衡”涉及到的是一个常见的Web服务器和应用服务器的架构组合,用于提高系统性能和可扩展性。在这个架构中,Nginx作为反向代理和负载均衡器,Tomcat6是Java应用服务器,...

    tomcat集群部署方案

    ### Tomcat集群部署方案知识点详解 #### 一、集群概念及特性 **1.1 什么是集群** 集群是由多台独立的计算机通过网络连接组成的集合体,这些计算机共同协作完成任务,对外表现为单一的服务实体。集群的主要目的是...

    关于tomcat集群部署总结

    关于Tomcat集群部署总结 一、Tomcat集群基础概念 在深入探讨Tomcat集群的配置细节之前,我们先来了解一下Tomcat集群的基本概念。Tomcat作为一款广泛使用的Java Web容器,支持多种部署方式,其中集群部署是提高系统...

    Apache Tomcat 集群

    在Tomcat集群中,如果一个节点故障,其他节点应能自动接管其服务。这需要监控和故障检测机制。一旦发现节点故障,负载均衡器会停止向该节点发送新的请求,而集群内的会话复制机制会确保会话状态的无缝迁移。 **六、...

    nginx-tomcat6_session共享Memcached包.zip

    本项目“nginx-1.9.3--tomcat-(6)-memcached-session共享session负载均衡”聚焦于如何在Nginx、Tomcat6以及Memcached之间实现Session共享,以确保用户会话在集群环境中的连续性。 首先,让我们了解核心组件的作用:...

    Tomcat集群配置

    【Tomcat集群配置】 在大型Web应用中,为了提高服务的可用...正确地配置这些元素,可以使Tomcat集群提供高可用、高性能的服务,同时确保用户会话的无缝迁移。在实际操作中,还需要根据具体环境和需求进行调整和优化。

    Tomcat 6 集群配置 session 共享 同一台机器

    首先,了解Tomcat集群的基础知识。集群是通过将多个独立的Tomcat实例连接在一起,形成一个整体,共同处理请求,提高系统性能和可用性。在Tomcat中,可以通过两种方式实现集群:基于网络的广播(JVMRoute)和基于内存...

    很标准的tomcat

    【标题】:“很标准的Tomcat” 在IT领域,Tomcat是一个非常重要的组件,它是一个开源的、基于Java Servlet和JavaServer Pages(JSP)技术的Web应用服务器。标题中的“很标准的Tomcat”可能是指它是一个符合官方规范...

    个人使用大数据开发-计算机专业简历.doc

    - **架构**:Nginx + Tomcat + Hadoop + Flume + Zookeeper + Hive + MySQL + Spark + Sqoop + Azkaban - **开发环境**:Idea + Maven + Git - **项目描述**:通过对公司数据进行统一管理和加工,建立数据仓库,...

    实战Nginx.取代Apache的高性能Web服务器.2010

    - **支持Rewrite重写规则**:Nginx支持URL重写,这在进行网站迁移或者调整URL结构时非常有用。 - **内置健康检查功能**:Nginx具有内置的健康检查机制,可以自动检测后端服务器的状态并作出相应的调整,提高了系统...

    musical.ly微服务化之路 current.pdf

    - 应用架构:Nginx+Tomcat,单体应用架构,依赖于60台机器运行。 - Java运行环境:使用IBM JDK。 - 数据库:MySQL为主,单库主从结构,无高可用性(HA)配置,使用ELB做负载均衡。 - 缓存系统:使用Memcached...

    apache-tomcat-8.5.53.tar.gz

    5. 使用负载均衡和集群技术,如Apache HTTP Server或Nginx反向代理,提高可用性和性能。 **应用部署** 1. 将WAR文件或解压后的应用程序目录放入`webapps`目录下,Tomcat会自动部署。 2. 使用管理控制台进行远程部署...

    Linux企业集群.英文版[The Linux Enterprise Cluster]

    12. **应用集群化**:许多企业级应用,如数据库(MySQL, PostgreSQL)、Web服务器(Apache, Nginx)、中间件(Tomcat, JBoss)等,都可以在集群环境中部署,以提高性能和可用性。 本书《Linux企业集群》可能涵盖了...

    最新 tomcat 服务器

    Tomcat支持集群配置,通过复制应用状态实现高可用性。使用负载均衡器,如Apache HTTP Server或Nginx,可以将请求分发到多个Tomcat实例,提高系统性能。 **7. 监控与管理** Tomcat提供了管理工具,如Manager App和...

Global site tag (gtag.js) - Google Analytics