apache -tomcat 负载均衡 --只为学习

本文介绍如何通过Memcached实现Tomcat集群间的负载均衡及Session共享,包括配置步骤、粘滞模式与非粘滞模式的区别,以及使用Tomcat集群功能实现Session共享的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
<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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值