公司最近要上负载均衡服务器,所以自己调研了下,以下是调研结果
多个tomcat要一起协同工作有几种办法,可以考虑的方案有以下几个:
(1)使用tomcat自带的cluster方式,多个tomcat自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。
(2)利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但是我们的应用很可能是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
(3)利用memcached把多个tomcat的session集中管理,这是最直接的解决方案,但是操作起来也最为复杂。
这里选择第3种,效率上最高
安装配置
memcached安装
1)先下载libevent-1.4.14b-stable.tar.gz和memcached-1.4.7.tar.gz的源码包,前者是后者的依赖包,就是一个事件驱动的包。
2)安装非常顺利,还是经典的那几个编译安装命令:
tar zxvf libevent-1.4.14b-stable.tar.gz
cd libevent-1.4.14b-stable
./configure --prefix=/usr/local/libevent-1.4.14b
make
make install
tar zxvf memcached-1.4.7.tar.gz
cd memcached-1.4.7
./configure --prefix=/usr/local/memcached-1.4.7 --with-libevent=/usr/local/libevent-1.4.14b/
make
make install
3)启动memcached:
memcached -u root -p 11211 -m 64 -vv
memcached-session-manager配置
1.去google code下载以下jar包kryo-1.03.jar、kryo-serializers-0.8.jar 、memcached-session-manager-1.3.0.jar、
memcached-session-manager-tc7-1.6.2.jar(tomcat7用的,如果是6请下载相关的jar)、minlog-1.2.jar、msm-kryo-serializer-1.6.2.jar、reflectasm-0.9.jar,然后把这些jar拷贝到$CATALINA_HOME/lib
另外提一下,官方给出的4种序列化方案,其中kryo是效率最高的,具体比较看http://code.google.com/p/memcached-session-manager/wiki/SerializationStrategies。
2.接下来是修改tomcat的配置文件$CATALINA_HOME/conf/context.xml,调整成新的session存储方式
lockingMode="auto" memcachedNodes="n1:127.0.0.1:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
Niginx配置
Ubuntu PPA
sudo -snginx=stable # use nginx=development for latest development versionadd-apt-repository ppa:nginx/$nginxapt-get update apt-get install nginx
修改配置文件
我的配置文件在/etc/nginx中,找到nginx.conf,用下面的替换:
user www-data;
worker_processes 2;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
#配置后端服务器信息
upstream 192.168.161.100 {
server 192.168.161.100:8089;
server 124.16.141.152:8089;
#server 127.0.0.1:8090;
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server{
listen 3000;
server_name 192.168.161.100;
location / {
proxy_pass http://192.168.161.100;
}
}
}
自己修改负载的应用服务器地址和nginx的地址,nginx配置和使用参考http://wiki.nginx.org/NginxChs