apache负载均衡+tomcat集群+Memcached-session-manager共享session

转载请注明出处:

http://luckymjl2.iteye.com/blog/1932060

1Linux64位系统下安装apache

安装apache需要先安装aprapr-util支持

1.1下载apache

地址:http://httpd.apache.org/download.cgi

版本:2.2.25

环境:Unix

 

1.2安装aprapr-util

安装apr

 

tar -xvfz httpd-2.2.25.tar.gz
# cd httpd-2.2.25
1.编译和安装 apr
cd srclib/apr
./configure  --libdir=/usr/lib64   --prefix=/usr/local/apr  
make
make install

 

安装apr-util

cd ../apr-util
./configure --libdir=/usr/lib64 --prefix=/usr/local/apr-util --with-apr=/usr/local/apr  
make  (如果这一步报错,就先执行下面的再执行本步)
make install
# vi  Makefile

APRUTIL_LIBS = -lsqlite3 /usr/lib/libexpat.la /root/tar/httpd-2.2.25/srclib/apr/libapr-1.la -luuid -lrt -lcrypt -lpthread -ldl
改为
APRUTIL_LIBS = -lsqlite3 /usr/lib64/libexpat.la /root/tar/httpd-2.2.25/srclib/apr/libapr-1.la -luuid -lrt -lcrypt -lpthread -ldl

1.3安装apache2.2.25

./configure LDFLAGS="-L/usr/lib64 -L/lib64"--prefix=/usr/local/httpd-2.2.25 --enable-mods-shared=all --with-mpm=worker --enable-deflate --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache --enable-proxy --enable-proxy-ajp --enable-proxy-balancer -enable-proxy-http --enable-rewrite --enable-charset-lite --disable-ipv6 -disable-dav -with-apr=/usr/local/apr -with-apr-util=/usr/local/apr-util

 

make
make install

2、安装Tomcat

21下载Tomcat

地址:http://tomcat.apache.org/download-70.cgi

版本:7.0.42

环境:Unix

 

22解压tomcat

tar -xvfz httpd-2.2.25.tar.gz

3、安装memcache

安装mencached之前需要先安装libevent支持

3、1下载libevent

官方:http://libevent.org/

地址:http://www.monkey.org/~provos/libevent-1.4.9-stable.tar.gz

版本:1.4.9

环境:Unix

3.1.1安装依赖包libevent

tar -xvzf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable
./configure -prefix=/usr
make & make install

 

 

32下载memcache

地址:http://code.google.com/p/memcached/downloads/list

版本:1.4.15

环境:Unix

3.2.1安装memcache

tar xvzf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure -with-libevent=/usr

make & make install

 

3.2.2启动memcache

/usr/local/bin/memcached -d -m 64 -u root

 

memcached命令参数

-p <num>      监听的TCP端口(默认: 11211)

-U <num>      监听的UDP端口(默认: 11211, 0表示不监听)

-s <file>     用于监听的UNIX套接字路径(禁用网络支持)

-a <mask>     UNIX套接字访问掩码,八进制数字(默认:0700

-l <ip_addr>  监听的IP地址。(默认:INADDR_ANY,所有地址)

-d            作为守护进程来运行。

-r            最大核心文件限制。

-u <username> 设定进程所属用户。(只有root用户可以使用这个参数)

-m <num>      单个数据项的最大可用内存,以MB为单位。(默认:64MB

-M            内存用光时报错。(不会删除数据)

-c <num>      最大并发连接数。(默认:1024

-k            锁定所有内存页。注意你可以锁定的内存上限。

              试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。

              (不是前面的 -u <username> 参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)

-v            提示信息(在事件循环中打印错误/警告信息。)

-vv           详细信息(还打印客户端命令/响应)

-vvv          超详细信息(还打印内部状态的变化)

-h            打印这个帮助信息并退出。

-i            打印memcachedlibevent的许可。

-P <file>     保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。

-f <factor>   块大小增长因子。(默认:1.25

-n <bytes>    分配给key+value+flags的最小空间(默认:48

-L            尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲TLB"丢失次数,提高运行效率。

              为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。

-D <char>     使用 <char> 作为前缀和ID的分隔符。

              这个用于按前缀获得状态报告。默认是":"(冒号)。

              如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命"stats detail on"来开启。

-t <num>      使用的线程数(默认:4

-R            每个连接可处理的最大请求数。

-C            禁用CAS

-b            设置后台日志队列的长度(默认:1024

-B            绑定协议 可能值:ascii,binary,auto(默认)

-I            重写每个数据页尺寸。调整数据项最大尺寸。

 

 

==================漂亮的分隔线,到此程序安装完毕================

转载请注明出处:

 

http://luckymjl2.iteye.com/blog/1932060

4Tomcat集群部署

Tomcat集群采用session共享方式,将session写入memcached-session-manger统一管理。提高性能。

4.1 jar包下载

4.1.1 memcached-session-manager

memcached-session-manager-${version}.jar

地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.6.5/

版本:1.6.5

4.1.2 tomcat7下支持包

memcached-session-manager-tc7-${version}.jar 

地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.6.5/版本:1.6.5

4.1.3  spymemcached

spymemcached-${version}.jar

地址:http://code.google.com/p/spymemcached/downloads/list

版本:2.9.1

 

4.1.4 Couchbase-Java-Client客户端

 

地址:http://packages.couchbase.com/clients/java/1.1.9/Couchbase-Java-Client-1.1.9.zip

版本:1.1.9

说明:这个本来是Couchbase的客户端程序,我不知道为什么一定需要,但是报错提示就是缺少客户端jar包,放进去就好了。

 

以上jar包全部放入$CATALINA_HOME/lib/目录,也就是tomcatlib目录

4.2 tomcatsession写入memcache

vi /opt/tomcat-7.0.42-jvm1/conf/context.xml

<Context></Context>中加入

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

    memcachedNodes="n1:192.168.10.110:11211"

    sticky="false"

    sessionBackupAsync="false"

    lockingMode="none"

    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

    transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"/>

 

参数说明:

className (required)

类名:de.javakaffee.web.msm.MemcachedBackupSessionManager

 

memcachedNodes (required)

memcached节点:此属性应该包含所有运行的memcached节点或者membase bucketuri地址,每一个memcached节点的属性定义格式为<id>:<host>:<port>,多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>即可,形如:memcachedNodes="localhost:11211"

如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/poolsBucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。

 

failoverNodes (optional, must not be used for non-sticky sessions)

故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。

 

username (since 1.6.0, optional)

1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证。

 

password (since 1.6.0, optional)

1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。

 

memcachedProtocol (since 1.3, optional, default text)

定义memcached协议,默认使用text文本

 

sticky (since 1.4.0, optional, default true)

定义session方式为黏性或非黏性,默认为true

 

lockingMode (since 1.4.0, optional, for non-sticky sessions only, default none)

只有非黏性session才使用,默认值为none

none: 从不对session进行锁定

all: session将一直被锁定,知道请求结束

auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定

uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。

 

requestUriIgnorePattern (optional)

 

sessionBackupAsync (optional, default true)

 

backupThreadCount (since 1.3, optional, default number-of-cpu-cores)

 

sessionBackupTimeout (optional, default 100)

 

operationTimeout (since 1.6.0, optional, default 1000)

 

sessionAttributeFilter (since 1.5.0, optional)

 

transcoderFactoryClass(since1.1,optional,

default de.javakaffee.web.msm.JavaSerializationTranscoderFactory)

序列化接口实现:

Java serialization: de.javakaffee.web.msm.JavaSerializationTranscoderFactory

Kryo based serialization: de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory

Javolution based

 serialization: de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory

XStream based serialization: 

de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory

 

copyCollectionsForSerialization (since 1.1, optional, default false)

 

customConverter (since 1.2, optional)

 

enableStatistics (since 1.2, optional, default true)

 

enabled (since 1.4.0, optional, default true)

4.3 Tomcat集群配置

vi /opt/tomcat-7.0.42-jvm1/conf/service.xml

 

声明在集群中的名称jvmRoute

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat107-1">

 

非粘性session配置,该配置好处在于如果一台tomcat挂掉,集群中的别的节点可以接管该机器session

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"/>

<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="auto"

port="4000"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

 

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

</Channel>

 

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"

                 filter=""/>

          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

 

          <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.JvmRouteSessionIDBinderListener"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

 

 

复制一份tomcat到本地,改名tomcat-7.0.42-jvm2修改service.xml 以下信息

 

<Server port="8005" shutdown="SHUTDOWN">

改为:

<Server port="8006" shutdown="SHUTDOWN">

 

 

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443"

               enableLookups="false"

               acceptCount="500" />

改为: 

<Connector port="8081" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

enableLookups="false"

acceptCount="500" />

 

 

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4000"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

改为:

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4001"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

 

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat107-1">

改为:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat107-1">

 

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

改为:

<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

4.3.1集群配置测试

Tomcatwebapp下创建test文件夹,文件夹下创建test.jspjsp中写入以下信息:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

response.setHeader("Cache-Control","no-store");

response.setHeader("Pragrma","no-cache");

response.setDateHeader("Expires",0);

%>

<html>

<head><title></title></head>

<body>

<%

String s = session.getId();

%>

</br>

<%=s%>

</body>

</html>

 

打开浏览器输入:

http://192.168.10.107:8080/test/test.jsp

获得一个session格式为B7BDC67CA8EC738771BE20D162CCA9B8-n1.tomcat107-1

改变地址为http://192.168.10.107:8081/test/test.jsp

Session不变,当前两个tonmcat共享相同session,说明配置成功。

 

5apache负载均衡配置

vi /usr/local/apache2/conf/httpd.conf 

 

5.1. Apache在启动时自动加载代理(proxy)模块。 

去掉以下文本前的注释符(#)

LoadModule proxy_module modules/mod_proxy.so    

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so    

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so    

LoadModule proxy_connect_module modules/mod_proxy_connect.so    

LoadModule proxy_ftp_module modules/mod_proxy_ftp.so    

LoadModule proxy_http_module modules/mod_proxy_http.so 

5.2 代理负载配置

<IfModule ssl_module>

SSLRandomSeed startup builtin

SSLRandomSeed connect builtin

</IfModule>

 

ProxyRequests Off

#lbmethod=bytraffic(byrequests) stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3

ProxyPass / balancer://cluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3

ProxyPassReverse / balancer://cluster/ 

 

<proxy balancer://cluster>

 

BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=tomcat107-1

 

BalancerMember ajp://127.0.0.1:8010 loadfactor=1 route=tomcat107-2

 

</proxy>

猜你喜欢

转载自luckymjl2.iteye.com/blog/1932060