构建集群的基本结构
这里采用的是nginx作为前端负载均衡。Apache同nginx原理是一样的。
整个集群机器情况如下:
主机ip | 安装软件 | 说明 |
192.168.179.130 | Nginx | 前端负载 |
192.168.179.131 | Tomcat1 | Web服务 |
Memcache1 | 缓存 | |
192.168.179.132 | Tomcat2 | Web服务 |
Memcache2 | 缓存 |
Nginx配置负载均衡
Nginx主要作用是负载均衡,编辑nginx/conf/nginx.conf文件。
在修改如下内容
http{
……….
upstream192.168.179.130{
ip_hash;
server 192.168.179.131:8030;
server 192.168.179.132:8030;
}
Server{
………….
location/ {
root html;
index index.html index.htm;
proxy_pass http://192.168.179.130;
}
…………..
}
………….
}
这里的upstream 主要是配置了后端的tomcat集群。所以,upstream就可以理解成一个tomcat集群。
如果是采用了sticky session的方式,应该加上ip_hash。是否ip_hash应该去掉。
什么是sitcky session??
简单来说就是同一个客户端发过来的请求总是定向到同一个tomcat服务器上。有多重实现方式。这里简单说一下ip_hash原理,他是对客户端的请求解析获得客户端ip地址,对于同一个ip地址来说,ip的hash值总是一样的,对于ip进行hash计算之后相同的值总是定向到同一个tomcat上。Apache 上也由sticky session的配置项。
Proxy_pass是将请求转发到名为“192.168.179.130” 的upstream上。
Tomcat的配置
这里主要配置的是tomcat/conf/context.xml文件
<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"
sticky="false"
memcachedNodes="n1:192.168.179.131:11211n2:192.168.179.132:11211"
failoverNodes=""
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
其实对于tomcat jvmRoute其实没有必要进行配置了。
按照这个步骤配置完成之后,按理说应该是好用的,但是测试的时候出现了问题。
需要debug信息打印出来进行调试。配置如下
- Add the following to $CATALINA_HOME/bin/catalina.sh:
CATALINA_OPTS="-Dnet.spy.log.LoggerImpl=net.spy.memcached.compat.log.SunLogger"
- Add this to $CATALINA_HOME/conf/logging.properties:
# A handler'slog level threshold can be set using SEVERE, WARNING, INFO, CONFIG, FINE,FINER, FINEST or ALL
net.spy.memcached.level = WARNING
# To makeonly the MemcachedConnection less verbose:
#net.spy.memcached.MemcachedConnection.level= WARNING
查看打印信息之后,发现session存储到了memcache中,但是很快过期。一看系统时间比当前时间早大约9个小时。调整系统时间之后集群成功。
PS:这里也有一点疑惑,客户端发送请求到服务器端的时候,是没有带时间的,即便是他们之间有时间差距,也不会影响到客户端会话cookie。Session在服务器端应该不会产生session过期失效的问题。但是http响应头有过期信息Expires: Thu, 21 Mar 2013 06:47:56 GMT 这个过期信息可能会导致会话cookie的失效么?正常的会话cookie应该是浏览器不关闭就不会失效啊。关于这个问题,还希望有牛人给解释下。