Tomcat7+Nginx1.8+Redis2.6负载均衡简单配置

        为了缓解因为Web服务器的session所占据的内存空间,减轻过多并发用户所占用的系统资源,使用nginx的超高并发性,再结合内存数据库缓存机制,进一步减轻服务器压力,提升系统稳定性、可扩展性。

(一般情况下:每个session占据大概0.5M的空间,如果是超过上万的在线用户,消耗web服务器的内存资源是很大的),利用nginx的超高并发性,10000个在线用户(inactive)情况下,占用的内存2.5M左右,节省了大量的系统资源。

       分布式共享方式也有不少方式,对于简单的session方式,直接使用ip_hash方式,每次用户请求的都是同一台服务器,避免session请求到其他web 服务器上面;

       基于NFS共享文件系统,图片、文档的共享;

       类似本文的memcached 的session内存数据库缓存方式;

       基于tomcat分布式web.xml 的<distributable/> 共享session设置方式;

       基于cookie 进行session共享(安全问题,小心被劫持DNS);

       基于TT/Redis 或 jbosscache 进行 session 共享;

       基于Rdbms数据库的Session共享;

       其他方式apache或者第三方等等。

本文使用高性能内存缓存数据库redis,性能优异,方便简单,有主从备份机制。

基本配置环境:

jdk 64bit

linux centos6 64bbit

apache-tomcat-7.0.42

redis2.6(linux ubuntu)

Nginx1.8.0

这里认为所有环境已经安装配置好,这里仅仅是记录一些参数配置信息。

Tomcat A :(192.168.1.101)

server.xml

1、<Server port="8005" shutdown="SHUTDOWN">

2、    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

3、<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

context.xml

 <Valve classname="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
  <Manager classname="com.radiadesign.catalina.session.RedisSessionManager"
  host="192.168.1.100"
  port="6380"
  password="pass"
  database="1"
  maxInactiveInterval="3600"/>

TomcatB(192.168.1.102)在同一台机器上面需要修改tomcat参数,不同机器,就不用修改。

server.xml

1、<Server port="8006" shutdown="SHUTDOWN">

2、    <Connector port="8082" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />

3、<Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />

context.xml

 <Valve classname="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
  <Manager classname="com.radiadesign.catalina.session.RedisSessionManager"
  host="192.168.1.100"
  port="6380"
  password="pass"
  database="1"
  maxInactiveInterval="3600"/>

nginx配置参数:

    upstream nginx {
     server 192.168.1.101:8081;
     server 192.168.1.102:8082;
   }

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /nginx {
     proxy_pass http://nginx;
            #root   html;
            #index  index.html index.htm;
        }

redis配置参数:

基本是默认配置,

如需要主从备份机制,在从机上面请开放:slaveof <masterip> <masterport>

设置账户访问密码,请开放:requirepass pass

调整默认访问端口,请设置:port 6380

指定允许访问IP地址,请设置:bind 192.168.1.100 192.168.1.101 192.168.1.102

需要提供的jar包,由于在使用过程中有依赖性关系,这里使用pom.xml来配置,

获取到4个jar包,拷贝到tomcat_home下面lib目录下面:

commons-pool-1.6.jar

commons-pool2-2.2.jar

jedis-2.2.1.jar

tomcat-redis-session-manager-1.2-tomcat-7.jar  (tomcat6请换成对应的jar包)

基本配置参数以及对应的jar包已经到位。

应该是修改对象war包项目的session值,检查测试。

一台tomcat对应的session值修改,然后检查对比是否另外一台tomcat响应正确,redis数据库是否存储实际的session值,默认也是指定过期时间30分钟,redis命令:ttl "sesionId",正常情况是完全模拟session原理实现。

jsp测试页面:

tomcatA

    <body>
        TomcatAAAAAAAAA<br/>
  <%
    HttpSession session = request.getSession();
    //将数据存储到session中
    session.setAttribute("data", "dingnigefei");
    //获取session的Id
    String sessionId = session.getId();

    System.out.println(session.getAttribute("data"));
    System.out.println(sessionId);
  %>
    </body>

------------------------------------------------------------

tomcatB

    <body>
        TomcatBBBBBBBB<br/>
  <%
  HttpSession session = request.getSession();
  System.out.println(session.getAttribute("data"));
  %>
    </body>

        访问量很大的互联网架构考虑,必须考虑对于应用无状态性需要良好的设计、管控。


        一个系统的伸缩性的好坏取决于应用的状态如何管理。试想一下,假如我们在 session 中保存了大量与客户端的状态信息的话,那么当保存状态信息的 server 宕机的时候,我们怎么办?通常来说,我们都是通过集群来解决这个问题,而通常所说的集群,不仅有负载均衡,更重要的是要有失效恢复 failover,比如 tomcat 采用的集群节点广播复制,Jboss 采用的配对复制等 session 状态复制策略,但是集群中的状态恢复也有其缺点,那就是严重影响了系统的伸缩性,系统不能通过增加更多的机器来达到良好的水平伸缩,因为集群节点间 session的通信会随着节点的增多而开销增大, 因此要想做到应用本身的伸缩性, 我们需要保证应用的无状态性,这样集群中的各个节点来说都是相同的,从而是的系统更好的水平伸缩。上面说了无状态的重要性,那么具体如何实现无状态呢?此时一个 基于session 框架就会发挥作用了。

       一般通过 cookie 来实现,或者也可以采用集中式 session 管理来完成,说具体点就是多个无状态的应用节点连接一个 session 服务器,session 服务器将 session 保存到缓存中,session 服务器后端再配有底层持久性数据源,比如数据库,文件系统等等,让数据即使在宕机的情况下,将访问的应用状态持久化,保证能够尽可能短的时间内的有效failove。

相关推荐