注意本文不讨论原理,只讲述具体的搭建过程,而且步骤都经过了整理,否则过程可能会出现其他异常,请自行google。apache与tomcat整合的方式除了jk之外,使用apache自带的mod_ajp_proxy模块也可以很方便的完成。
先来看一下架构图:
属于正式环境中原session复制方案的改进。
下载将jrockit二进制安装文件,赋予可执行权限
可不必为整个linux环境设置<code>java_home="/apps/test/java/jrrt-3.1.2-1.6.0"</code>,在tomcat中指定即可。
因为<code>tomcat-native</code>依赖于apr,所以这里先直接从 httpd-2.2.26/srclib 目录下安装apache自带的<code>apr</code>和<code>apr-util</code>。
建议将srclib下的<code>pcre</code>也装上,主要是考虑后面转发请求时可能要使用地址rewrite,需要正则语法的支持。默认centos6.x已经安装了这个库。
安装apache:
解压apache-tomcat-6.0.32.tar.gz拷贝至/app/test/tomcat0,不建议使用root用户管理tomcat.
配置tomcat:
tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。下面是一些配置示例,需要根据实际需要更改。
bin目录下新建的可执行文件<code>setenv.sh</code>会由tomcat自动调用。上面的<code>jmxremote.authenticate</code>在正式环境中请务必设为true并设置用户名/密码,减少安全隐患,或者注释掉<code>catalina_opts</code>。(有时候出于性能调优的目的,才需要设置jmx)。对于具体的连接协议有不同的优化属性,参考如下:
对http:
对ajp:
此时可以看到在<code>/apps/test/apache2/modules</code>下有<code>mod_jk.so</code>文件,用于连接apache与tomcat。
建立配置文件<code>httpd-jk.conf</code>:
建立工作文件<code>workers.properties</code>:
以上是3个tomcat的做负载均衡的情况,负载因子<code>lbfactor</code>都为1,session为sticky模式,apache与tomcat连接的协议采用ajp/1.3,同一台服务器上通过端口来区分tomcat0/tomcat1/tomcat2。
在<code>tomcat0/conf/server.xml</code>中加入<code>jvmroute</code>属性,这个属性与上面的<code>workers.properties</code>的worker相同:
设置测试应用的访问路径,在<code>tomcat0/conf/server.xml</code>的<code><host></code>节点下添加如下:
为了看到负载均衡的效果,在<code>/apps/test/testapp/test</code>目录下建立测试页面test.jsp:
到这里还差一步就可以看到集群的效果,那就是3个tomcat之间session同步的问题。可以通过打开<code><engine></code>节点下的<code><cluster></code>标签的注释来简单的实现session复制:
然后在<code>tomcat0/conf/web.xml</code>的<code><webapp></code>根节点下加入<code><distributable /></code>
复制tomcat0到tomcat1、tomcat2,修改 的端口避免冲突,修改对应的jvmroute
启动apache和3个tomcat,就可以看到效果。但这里我们使用<code>memcached-session-manager</code>来同步session,所以不必打开<code><cluster></code>这一步。
这里memcached搭建在另外一台服务器上(192.168.10.20),也可以安装在本地。
如果开启了防火墙,需要加入11211、11212端口的允许规则。
加入jar包
将<code>asm-3.2.jar</code>, <code>couchbase-client-1.2.2.jar</code>, <code>kryo-1.04.jar</code>, <code>kryo-serializers-0.11.jar</code>, <code>msm-kryo-serializer-1.6.5.jar</code>, <code>memcached-session-manager-1.6.5.jar</code>, <code>memcached-session-manager-tc6-1.6.5.jar</code>, <code>minlog-1.2.jar</code>,<code>reflectasm-1.01.jar</code>, <code>spymemcached-2.10.2.jar</code>这些jar包加入tomcat0/lib/下。可以看到这里选用的session序列化策略采用的是kryo。另外要注意版本之间的兼容性,这里只针对tomcat6.x。
修改<code>conf/server.xml</code>:
将节点修改成:
接着将tomcat0完整的复制2份(tomcat1,tomcat2),也可以放到另外一台服务器上。
修改为<code>workers.properties</code>中定义的ajp等端口:
node tomcat
server port
connector port http
connector port ajp
engine jvmroute
memcached failovernodes
tomcat0
8005
8080
8009
n1
tomcat1
8105
8081
8109
tomcat2
8205
8082
8209
n2
分别启动tomcat0、tomcat1、tomcat2和apache,注意观察tomcat的启动日志和memcached服务器的日志。
在浏览器访问<code>http://192.168.10.100/test.jsp</code>。主要测试负载均衡与session共享。