1.apache memcached tomcat 负载均衡 session共享
安装和配置 memcached
https://code.google.com/p/memcached/wiki/NewInstallFromSource
源码安装:
./configure 步骤时有可能提示 libevent 没有安装,到 http://libevent.org/ 下载装上(步骤和下面是一样的,只是软件包名不一样).再继续 ./configure
wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure
make && make test
sudo make install
vi /etc/init.d/memcached 创建memcached的启动脚本
#chkconfig: 345 60 60
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export LANG=en_US.UTF-8
start()
{
echo -n $"Starting memcached: "
memcached -d -m 512 -l localhost -p 11211 -u root -P /tmp/memcached.pid
echo "[OK]"
}
stop()
{
echo -n $"Shutting down memcached: "
kill -9 $(cat /tmp/memcached.pid)
echo "[OK]"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 3
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
运行 service memcached start 启动.
lsof -i:11211 如果看到有程序监听这个端口,说明启动成功.
添加 tomcat-mencached session管理插件 到tomcat
https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
添加 memcached-session-manager-${version}.jar , memcached-session-manager-tc7-${version}.jar , spymemcached-2.7.3.jar 插件到 tomcat/lib 目录下.
如果使用的是tomcat6, 则 memcached-session-manager-tc7-${version}.jar 需换成 memcached-session-manager-tc6-${version}.jar 的版本.
注意 SetupAndConfiguration 说明里 配置下载 7 的版本地址错误,会转向 6 .将地址的 6 换成 7 就可以了,这个可能以后会修正,这里提醒下.
下载 msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2 , 一样放到 tomcat/lib 内
tomcat/conf/context.xml
<Context> 节点内添加 [non-sticky 模式]
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
WEB-INF - web.xml
根节点 web-app 里添加
<distributable/>
tomcat/conf/server.xml
每个tomcat 下需要不同配置的地方:
<Connector port="8059" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
httpd.conf 配置ajp的负载均衡
<Proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8059 loadfactor=1
BalancerMember ajp://127.0.0.1:8058 loadfactor=1
</Proxy>
<VirtualHost *:80>
#...其他配置
ProxyPass / balancer://cluster/
ProxyPassReverse / balancer://cluster/
</VirtualHost>
重启 tomcat 和 apache 测试session是否同步 以及查看浏览器的 session JSESSIONID
值后面是否带 -n1
以上配置使用了 non-sticky 模式,即用户每次请求会被随机分配给不同的 tomcat
===============================================================================
stickty 模式则相反,用户的请求会一直绑定在同一个 tomcat 上执行
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
copyCollectionsForSerialization="false"
/>
<Proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8059 loadfactor=1 route=web1
BalancerMember ajp://127.0.0.1:8058 loadfactor=1 route=web2
</Proxy>
<VirtualHost *:80>
#...其他配置
ProxyPass / balancer://cluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://cluster/
</VirtualHost>
<Connector port="8059" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="web1"><!--与hppd的route匹配-->
详细了解 sticky 模式的区别 http://coconut-zhang.iteye.com/blog/1567165
2.apache ajp tomcat集群 负载均衡 session 共享
使用 tomcat 的集群功能实现session共享
httpd.conf
<Proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8059 loadfactor=1 route=web1
BalancerMember ajp://127.0.0.1:8058 loadfactor=1 route=web2
</Proxy>
<VirtualHost *:80>
#...其他配置
ProxyPass / balancer://cluster/
ProxyPassReverse / balancer://cluster/
</VirtualHost>
tomcat conf- server.xml
每个tomcat 下需要不同配置的地方:
Connector port
Engine jvmRoute
Receiver port
<Connector port="8059" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="web1"><!--与hppd的route匹配-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="8"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="localhost"
port="5000"
selectorTimeout="100"
maxThreads="6"/><!--每个 tomcat 下的 port 都不同 -->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
WEB-INF - web.xml
根节点 web-app 里添加
<distributable/>
参考
http://zyycaesar.iteye.com/blog/296606
http://blog.youkuaiyun.com/huangbiao86/article/details/6655621
http://my.oschina.net/hunzi/blog/30235