jboss集群session复制原理:
jboss session复制是jboss session同步的一种实现。原理是在各Jboss节点间建立横向联系,每个节点都将本节点的session变化同步到其他所有节点上。
jboss的session复制与HTTP集群是相互配合、相互独立的两个系统。session复制是节点间的横向联系,HTTP集群是负载均衡器与节点的纵向联系。
10.0.2.203 �C 安装JDK 1.6,JBoss 7,JBoss节点名称为jboss1
10.0.2.202 �C 安装JDK 1.6,JBoss 7,JBoss节点名称为jboss2
10.0.2.90 �C 源码安装nginx,再次不再详述,参考:
http://smartest.blog.51cto.com/blog/3585938/995199
不过在编译nginx的时候给nginx打上nginx_upstream_check_module补丁,在网上下载这个模块,解压和nginx放于/usr/local/src/目录下,进入这个目录下的nginx解压后的目录,编辑 auto/cc/gcc文件,(关闭debug)
最后打补丁:
patch -p1 < /usr/local/src/nginx_upstream_check_module-master/check_1.2.6+.patch,
然后 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --add-module=/usr/local/src/nginx_upstream_check_module-master --add-module=/usr/local/src/nginx-sticky-module-1.0/
#使用nginx_upstream_check_module 模块对后端server进行检测
再make && make install
以下实验注意iptables 和 selinux 的影响。
安装jdk和jboss 此处就不多说了,jboss不需要修改
/usr/local/jboss-4.2.2.GA/server/all/deploy/jboss-web.deployer 目录下的
server.xml文件的 <Connector port="8080" address="${jboss.bind.address}"默认地址
a:下面是nginx的配置:
user nginx nginx;
worker_processes 2;
events {
use epoll;
worker_connections 1024;
}
http {
upstream jboss {
sticky; #添加此项实现session的sticky,即一个客户端的访问会被nginx转发到同一台jboss实例进行处理
server 10.0.2.203:8080 weight=1 max_fails=3 fail_timeout=60s;
server 10.0.2.202:8080 weight=1 max_fails=3 fail_timeout=60s;
check interval=3000 rise=2 fall=5 timeout=1000;
}
#interval检测间隔时间,单位为毫秒。
#rsie请求2次正常的话,标记此realserver的状态为up。
#fall表示请求5次都失败的情况下,标记此realserver的状态为down。
#timeout为超时时间,单位为毫秒。
include mime.types;
default_type application/octet-stream;
location /status {
stub_status on;
access_log off;
}
location ~ \.jsp$ {
# root html;
index index.jsp;
proxy_pass http://jboss;
}
b:jboss的配置同 上篇的 “使用apache的mod_jk实现jboss负载均衡”
参考此篇http://smartest.blog.51cto.com/3585938/1340219
c:启动10.0.2.203和10.0.2.202主机的jboss实例,然后启动10.0.2.90的nginx server
客户端 浏览器访问 10.0.2.90/status
如果使用nginx_upstream_check_module 模块,则需要修改nginx配置文件
location /status {
#stub_status on; #关闭nginx自身的status状态统计
check_status;
access_log off;
}
然后浏览器访问 10.0.2.90/status
可以看到默认使用tcp进行check,可以修改成http,
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
jboss 的配置参考 上篇“使用apache的mod_jk实现jboss负载均衡”
http://smartest.blog.51cto.com/blog/3585938/1340219
客户端访问 后端jboss 10.0.2.90/index.jsp
nginx默认采用简单的轮询调度算法将请求转发到后端的jboss实例。
这个类似于apache的mod_proxy模式,每次都将当前所有的session复制到要访问的jboss实例(没有sticky的情况),jboss默认采用UDP方式,这对于带宽有影响。
注意:当session复制时,只能10.0.2.202(jboss2)到10.0.2.203,不能10.0.2.203到10.0.2.202,待后续解决。
问题:
取消nginx的sticky配置,每一次请求都会复制session,当一台jboss实例停掉后,不影响session,当这台jboss实例恢复后,恢复的jboss提示“ERROR [JBossCacheManager] Cannot add session with id=wxYgIkmw3KnEBn4xjSD1cA**.jboss1 because it is invalid”,原正常jboss提示“Possible concurrency problem: Replicated version id 1 matches in-memory version for session wxYgIkmw3KnEBn4xjSD1cA**”。(在用mod_jk时也用这个问题)