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。