`

Arch-03-15- Nginx+tomcat 配置负载均衡动静分离

 
阅读更多

Nginx+tomcat 配置负载均衡动静分离,再强大一些,多个 Tomcat 之间实现共享 Session。

 

 

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
	include mime.types;
	default_type application/octet-stream;
	sendfile on;
	keepalive_timeout 65;

# for CDN DDNS (static content)
upstream dynamic_node {
	#server dnsserverid:80; # main DNS node
	server 127.0.0.1:8080; # 因没有DDNS,临时
}

# for application server cluster
	upstream clustering { 
	   server 127.0.0.1:8080 srun_id=a; 
	   server 127.0.0.1:8180 srun_id=b; 
	 
	   jvm_route $cookie_JSESSIONID reverse; 
	}

	upstream backend { 
		   server 127.0.0.1:8080 srun_id=a; 
		   server 127.0.0.1:8180 srun_id=b; 
		   jvm_route $cookie_JSESSIONID reverse; 
	}

server {
	listen 80;
	server_name localhost;

	location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css|mp3|swf|ico|flv)$ {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_pass http://dynamic_node;
		proxy_store /D/cache/cdn/root$uri;
		proxy_store_access user:rw group:rw all:r;
	}

	location / {
			index index.shtml;
			access_log   off;
			proxy_next_upstream http_502 http_504 error timeout invalid_header;
			proxy_pass      http://clustering;
			proxy_set_header Host $http_host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}
}

 


=========================================================================

 

在构建能够灵活地进行水平扩展、高可用性的Java Web应用程序时候,对http session的处理策略很大程度决定了应用程序的扩展性、可用性。一般而言对http session有如下的处理方案:

1、在服务器端不保存Session,完全无状态

对于不需要保持用户状态的Web应用,采用Stateless是最为恰当的,因此就不存在Session共享的问题。REST(Representational State Transfer)算是最为典型的例子。

2、基于浏览器Cookie的Session共享

此种方案把用户相关的Session信息存储到浏览器的Cookie中,也称为客户端Session。

采用Flash Cookie、URL重写的方式传递Session信息的方案也可以归为此类。

缺点:只能够存储字符串、数值等基本类型的数据;Cookie大小存在限制;安全性;带宽及数据解压缩、网络传输性能问题。

3、基于数据库的Session共享,实现分布式应用间Session共享

此种方案把Session信息存储到数据库表,这样实现不同应用服务器间Session信息的共享。诸如Websphere Portal、Weblogic Portal都采用了类似的方案。

Tomcat Persistent Manager的JDBC Based Store提供了类似实现机制,表结构如下:

create table tomcat_sessions(session_id varchar(100)not null primary key,valid_session char(1)not null,max_inactive int not null,last_access bigint not null,app_name varchar(255),session_data mediumblob,KEY kapp_name(app_name));

优点:实现简单

缺点:由于数据库服务器相对于应用服务器更难扩展且资源更为宝贵,在高并发的Web应用中,最大的性能瓶颈通常在于数据库服务器。因此如果将Session存储到数据库表,频繁的增加、删除、查询操作很容易造成数据库表争用及加锁,最终影响业务。

4、基于应用服务器/Servlet容器的Clustering机制

一些常用的应用服务器及Servlet容器的Clustering机制可以实现Session Replication的功能,例如Tomcat Clustering/Session Replication、Jboss buddy replication。

缺点:基于Clustering的Session复制性能很差,扩展性也很不行。

5、基于NFS的Session共享

通过NFS方式来实现各台服务器间的Session共享,各台服务器只需要mount共享服务器的存储Session的磁盘即可,实现较为简单。但NFS对高并发读写的性能并不高,在硬盘I/O性能和网络带宽上存在较大瓶颈,尤其是对于Session这样的小文件的频繁读写操作。

基于磁盘阵列/SAN/NAS等共享存储的方案道理也类似。

6、基于Terracotta、Ehcache、JBossCache等Java Caching方案实现Session共享

如果系统架构是Java体系,可以考虑采用Terracotta、Ehcache、JbossCache、Oscache等Java Caching方案来实现Session共享。

缺点:架构用于非java体系很不方便;对于是诸如静态页面之类的缓存,采用Memcached的方案比Java更为高效

7、基于Memcached/Tokyo Tyrant等Key-Value DB的Session共享

整体说来此种方案扩展性最好,推荐使用。

原理:Tomcat服务器提供了org.apache.catalina.session.StandardManager和org.apache.catalina.session.PersistentManager用于Session对象的管理,可以自定义PersistentManager的

Store类来实现自己Memcached、Tokyo Tyrant、Redis等Key-Value DB的客户端。

 

========================================================================

 

 

重新编辑,多个 tomcat 共享 session,tomcat 强壮了许多。

 

方案: Tomcat +memcached + msm

 

(1)Tomcat 7.0.22 +msm1.5

(2)下载和复制 5 个文件到 tomcat/lib

 

  • javolution-5.4.3.1.jar
  • memcached-2.5.jar
  • memcached-session-manager-1.5.1.jar
  • memcached-session-manager-tc7-1.5.1.jar
  • msm-javolution-serializer-1.5.1.jar
(3)修改 tomcat/context.xml
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
	    sticky="true"
	    memcachedNodes="n1:localhost:11211 n2:localhost:11212"
	    failoverNodes="n1"
	    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico)$"
	    sessionBackupAsync="false"
	    sessionBackupTimeout="100"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      customConverter="de.javakaffee.web.msm.serializer.kryo.JodaDateTimeRegistration,de.javakaffee.web.msm.serializer.kryo.WicketSerializerFactory"
    />
 

(4)下载 msm 的样本文件,替换掉 lib/msm-kryo-serializer-1.4.1.jar 为 msm-kryo-serializer-1.5.1.jar。

(5)启动两个 tomcat ,成功

(6)注意:如果使用没有 msm 样本文件的webapp 可能会报启动错误。在 conf/Catalina/localhost/msm.xml 下配置独立的应用 context 可以避免该错误。

 

 

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/msm" docBase="../temp/msm" antiResourceLocking="false" privileged="true" >
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
	    sticky="true"
	    memcachedNodes="n1:localhost:11211 n2:localhost:11212"
	    failoverNodes="n1"
	    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico)$"
	    sessionBackupAsync="false"
	    sessionBackupTimeout="100"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      customConverter="de.javakaffee.web.msm.serializer.kryo.JodaDateTimeRegistration,de.javakaffee.web.msm.serializer.kryo.WicketSerializerFactory"
    />
	
</Context>

  (7)移植到其他的 webapp ,需要将 msm 样本程序 lib 中的 jar 包复制到目标 webapp,然后在配置 app context 文件,同上。


 

参考:

 

http://code.google.com/p/memcached-session-manager/

http://blog.sina.com.cn/s/blog_4d6c7dea0100uqqd.html

 

优点:在 tomcat 级自动复制,对应用程序隔离,相当于 tomcat 高效集群

 

=====================================================================

 

使用 terracotta +ehcache 复制 tomcat 和 jetty 的 session,实现 tomcat 和  jetty 的集群 。

http://www.terracotta.org

 

=====================================================================

Voldemort 实现 jetty session 复制

 

https://github.com/jaysoo/jetty-session-voldemort

 

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

相关推荐

    nginx1.23.2-麒麟-aarch64

    - 反向代理可以实现负载均衡,通过智能调度策略分散服务器压力,保证整体系统的高可用性。 5. **Nginx 配置与管理** - 配置文件通常位于`/etc/nginx/nginx.conf`,用户可以通过修改配置来定制服务器行为,如设置...

    在_Arch_Linux_下使用_PKGBUILD_安装_nginx-http-flv-module_nginx-mod-

    在Arch Linux系统环境下,用户可以通过多种方式进行软件的安装与管理,而使用PKGBUILD脚本安装第三方模块是其中一种高级的自定义安装方式。PKGBUILD是一种用于定义如何构建和安装软件包的脚本文件。它包含了所有编译...

    cacti-plugin-arch-2.0.tar.gz

    "cacti-plugin-arch-2.0.tar.gz" 是一个针对Cacti的插件包,用于扩展Cacti的功能,提供更丰富的监控选项。此插件名为“Arch”,可能是对系统架构或性能分析相关的增强。 该压缩包文件的名称表明它是版本2.0,通常这...

    Comcast-SP-NGOD-ASSET-ARCH-I03-100731-FINAL-Coship.pdf

    Next Generation On Demand (NGOD) Asset Architecture Comcast-SP-NGOD-ASSET-ARCH-I03-100731 Issued July 31, 2010

    Arch-Linux-Install-ScriptArch_Linux_安装脚本_Arch-Linux-Insta

    正文中,我们首先需要明确的是,Arch_Linux_安装脚本或Arch-Linux-Install-Script,实际上是关于Linux操作系统中一种名为Arch Linux的发行版的安装脚本。Arch Linux是一个轻量级、灵活和面向社区的Linux发行版,它以...

    变系数ARCH-M模型的ARCH效应检验

    变系数ARCH-M模型是时间序列分析领域的重要研究对象,其核心在于通过截面似然估计来检验模型是否具有条件异方差性(ARCH效应)。首先,我们来探讨一下条件异方差性的概念,它是指在时间序列分析中,随机变量的条件...

    Arch_Linux_盒装安装媒介的小盒子_arch-media-box-typst.zip

    Arch_Linux_盒装安装媒介的小盒子_arch-media-box-typst.zip是一个针对Arch Linux操作系统的安装媒介工具。Arch Linux是一个基于x86-64架构的轻量级Linux发行版,它以其简洁性、高效性以及高度可定制性而闻名。这个...

    nginx--aarch64.rar

    - Nginx可以作为负载均衡器,通过`upstream`模块将请求分散到多个后端服务器,实现高可用性和负载分布。 - 负载均衡策略包括轮询、权重轮询、最少连接数、IP哈希等,可根据实际需求选择合适的方式。 7. **缓存...

    apptoolkit-arch-core-common.jar

    基于android8.1源码平台中生成的jar,亲测可用!!!!

    安装 Arch-Manjaro + KDE Plasma + Windows 11 双系统的指南.zip

    安装 Arch-Manjaro + KDE Plasma + Windows 11 双系统的指南.zip

    UPnP-arch-DeviceArchitecture-v1.1.pdf

    文档《UPnP™ Device Architecture 1.1》是由UPnP论坛的贡献成员编写的,发布日期为2008年10月15日。该文档详细描述了UPnP设备架构的技术细节,包括网络发现、地址分配、设备广告和搜索等。文档中提到的UPnP设备架构...

    kube-on-air:在Arch-on-Air上通过libvirtKVM创建kubernetes集群!

    +----------+ +-----------+ +------------+ +------------+ | head10 | | work11 | | work12 | | work13 | | (master) | | (worker) | | (worker) | | (worker) | +----+-----+ +-----+-----+ +-----+------+ +---...

    保存我曾经安装arch时使用的一些配置和笔记_arch-linux.zip

    首先,从标题“保存我曾经安装arch时使用的一些配置和笔记_arch-linux.zip”和描述“保存我曾经安装arch时使用的一些配置和笔记_arch-linux”可以得知,这份压缩文件内容涉及的是与Arch Linux操作系统安装相关的配置...

    Python库 | arch-4.11-cp35-cp35m-win32.whl

    标题中的"Python库 | arch-4.11-cp35-cp35m-win32.whl"指的是一个特定版本的Python库,名为“arch”,版本为4.11,适用于Python 3.5解释器(由"cp35"标识),且是针对32位Windows操作系统("win32")的。"cp35m"表示...

    Comcast-SP-NGOD-GEN-ARCH-103-100731.pdf

    Next Generation On Demand (NGOD) Overall Architecture Comcast-SP-NGOD-GEN-ARCH-I03-100731 Issued July 31, 2010

    arch-snds100驱动程序

    arch-snds100驱动程序是专为s3c44b0x处理器设计的一款核心驱动,用于管理和优化硬件资源的使用。s3c44b0x是一款由Samsung生产的微处理器,常用于嵌入式系统,如工业控制、移动设备和消费电子产品等。驱动程序在操作...

    Python库 | arch-4.8.0-cp27-cp27m-win32.whl

    python库。 资源全名:arch-4.8.0-cp27-cp27m-win32.whl

    Arch-03-24- Spring Security 应用

    NULL 博文链接:https://cnmqw.iteye.com/blog/1243596

    搭建jdk+tomcat+mysql的web服务器环境

    本文档将详细介绍如何在Ubuntu 16.04系统上搭建一个完整的web服务器环境,包括JDK(Java Development Kit)、Tomcat以及MySQL数据库的安装与配置。通过本教程,您可以在百度云服务器或其他支持Ubuntu系统的云服务...

Global site tag (gtag.js) - Google Analytics