apache+3tomcat+jk+memcached集群环境搭建

注意本文不讨论原理,只讲述具体的搭建过程,而且步骤都经过了整理,否则过程可能会出现其他异常,请自行google。apache与tomcat整合的方式除了jk之外,使用apache自带的mod_ajp_proxy模块也可以很方便的完成。
先来看一下架构图:

属于正式环境中原session复制方案的改进。

1. 所需软件包

jrrt-3.1.2-1.6.0-linux-x64.bin(或jdk1.6.0_33)   jvm
httpd-2.2.26.tar.gz                              web服务器,处理静态资源
apache-tomcat-6.0.32.tar.gz                      应用服务器,Servlet容器处理动态请求
tomcat-connectors-1.2.30-src.tar.gz              apache与tomcat整合插件mod_jk.so
tomcat-native.tar.gz                             APR加速tomcat,提高线程并发能力。使用tomcat自带版本。
memcached-session-manager                        使用msm解决多tomcat集群时session同步问题所需jar包
    asm-3.2.jar, couchbase-client-1.2.2.jar,
    kryo-1.04.jar, kryo-serializers-0.11.jar
    msm-kryo-serializer-1.6.5.jar
    memcached-session-manager-1.6.5.jar
    memcached-session-manager-tc6-1.6.5.jar
    minlog-1.2.jar, reflectasm-1.01.jar
    spymemcached-2.10.2.jar

2. 安装过程

2.1 JDK

下载将JRockit二进制安装文件,赋予可执行权限

# pwd
/apps/test/java
# chmod o+x jrrt*.bin
# ./jrrt-3.1.2-1.6.0-linux-x64.bin

可不必为整个linux环境设置JAVA_HOME="/apps/test/java/jrrt-3.1.2-1.6.0",在tomcat中指定即可。

2.2 编译安装apache

因为tomcat-native依赖于apr,所以这里先直接从 httpd-2.2.26/srclib 目录下安装apache自带的aprapr-util

[root@cachets httpd-2.2.26]# pwd
/apps/test/soft_src/httpd-2.2.26
[root@test httpd-2.2.26]# cd srclib/apr
[root@test apr]# ./configure --prefix=/usr/local/apr
[root@test apr]# make && make install
[root@test apr]# cd ../apr-util/
[root@test apr-util]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@test apr-util]# make && make install

建议将srclib下的pcre也装上,主要是考虑后面转发请求时可能要使用地址rewrite,需要正则语法的支持。默认CentOS6.x已经安装了这个库。

安装apache:

[root@test httpd-2.2.26]# ./configure --prefix=/apps/test/apache2 --enable-mods-shared=all --enable-modules=so --enable-rewrite --enable-deflate --with-mpm=worker --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
[root@test httpd-2.2.26]# make && make install

2.3 安装tomcat

解压apache-tomcat-6.0.32.tar.gz拷贝至/app/test/tomcat0,不建议使用root用户管理tomcat.

[test@cachets soft_src]$ tar -zxvf apache-tomcat-6.0.32.tar.gz
[test@cachets soft_src]$ cp -a apache-tomcat-6.0.32 /app/crm/tomcat0

// 安装tomcat-native(不用单独下载,在tomcat的bin目录中自带)
# yum install -y openssl-devel apr-devel
[root@cachets ~]# cd /app/test/soft_src/apache-tomcat-6.0.32/bin
[root@cachets bin]# tar -zxvf tomcat-native.tar.gz
[root@cachets bin]# cd tomcat-native-1.1.20-src/jni/native/
[root@cachets native]# ./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-ssl --with-java-home=/apps/test/java/jrrt-3.1.2-1.6.0
[root@cachets native]# make && make install

配置tomcat:

tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。下面是一些配置示例,需要根据实际需要更改。

[crm@cachets tomcat0]$ vi bin/setenv.sh
JAVA_OPTS="-XX:PermSize=128M -XX:MaxPermSize=256M -Xms1536M -Xmx2048M -verbosegc "
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.10.100"
JAVA_HOME="/apps/test/java/jrrt-3.1.2-1.6.0"
CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib"
[crm@cachets tomcat0]$ chmod 755 bin/setenv.sh

bin目录下新建的可执行文件setenv.sh会由tomcat自动调用。上面的jmxremote.authenticate在正式环境中请务必设为true并设置用户名/密码,减少安全隐患,或者注释掉CATALINA_OPTS。(有时候出于性能调优的目的,才需要设置JMX)。对于具体的连接协议有不同的优化属性,参考如下:
对HTTP:

<Connector port="8080"
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           URIEncoding="UTF-8"
           enableLookups="false"

           maxThreads="400"
           minSpareTheads="50"
           acceptCount="400"
           acceptorThreadCount="2"
           connectionTimeout="30000"
           disableUploadTimeout="true"

           compression="on"
           compressionMinSize="2048"
           maxHttpHeaderSize="16384"
           redirectPort="8443"
 />

对AJP:

<Connector port="8009" protocol="AJP/1.3"
           maxThreads="300" minSpareThreads="50"
           connectionTimeout="30000"
           keepAliveTimeout="30000"
           acceptCount="200"
           URIEncoding="UTF-8"
           enableLookups="false"
           redirectPort="8443" />

2.4 安装jk

[crm@test soft_src]$ tar -zxvf tomcat-connectors-1.2.30-src.tar.gz
[crm@test soft_src]$ cd tomcat-connectors-1.2.30-src/native
[root@test native]# ./configure --with-apxs=/apps/test/apache2/bin/apxs
[root@test native]# make && make install

此时可以看到在/apps/test/apache2/modules下有mod_jk.so文件,用于连接apache与tomcat。

2.5 配置(集群)负载均衡选项

2.5.1 apache

建立配置文件httpd-jk.conf

[root@cachets ~]# cd /app/test/
[root@cachets crm]# vi apache2/conf/extra/httpd-jk.conf
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# 指定保存了worker相关工作属性定义的配置文件
JkWorkersFile conf/extra/workers.properties
# Specify jk log file
JkLogFile /app/test/apache2/logs/mod_jk.log
# Specify jk log level [debug/error/info]
JkLogLevel info
#指定哪些请求交给tomcat处理,"controller"为在workers.properties里指定的负载分配控制器名

JkMount /servlet/* controller
JkMount /*.jsp controller
JkMount /*.do controller

// 在conf/httpd.conf最后加上
Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-jk.conf

建立工作文件workers.properties

[root@cachets crm]# vi apache2/conf/extra/workers.properties
# servers
worker.list=controller
# ====== tomcat0 =======
worker.tomcat0.port=8009
worker.tomcat0.host=192.168.10.100
worker.tomcat0.type=ajp13
worker.tomcat0.lbfactor=1
# ====== tomcat1 =======
worker.tomcat1.port=8109
worker.tomcat1.host=192.168.10.100
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
# ====== tomcat2 =======
worker.tomcat2.port=8209
worker.tomcat2.host=192.168.10.100
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
# ====== controller ====
worker.controller.type=lb
worker.controller.balance_workers=tomcat0,tomcat1,tomcat2
worker.controller.sticky_session = 1

以上是3个tomcat的做负载均衡的情况,负载因子lbfactor都为1,session为sticky模式,apache与tomcat连接的协议采用AJP/1.3,同一台服务器上通过端口来区分tomcat0/tomcat1/tomcat2。

2.5.2 tomcat

tomcat0/conf/server.xml中加入jvmRoute属性,这个属性与上面的workers.properties的worker相同:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat0">

设置测试应用的访问路径,在tomcat0/conf/server.xml<Host>节点下添加如下:

<Context path="" docBase="/apps/test/testapp/TEST" reloadable="true" />

2.5.3 app-TEST

为了看到负载均衡的效果,在/apps/test/testapp/TEST目录下建立测试页面test.jsp:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
  out.println("<br> ID " + session.getId()+"<br>");
  // 如果有新的 Session 属性设置
  String dataName = request.getParameter("dataName");
  if (dataName != null && dataName.length() > 0) {
     String dataValue = request.getParameter("dataValue");
     session.setAttribute(dataName, dataValue);
  }
  out.println("<b>Session 列表</b><br>");
  System.out.println("============================");
  Enumeration e = session.getAttributeNames();
  while (e.hasMoreElements()) {
     String name = (String)e.nextElement();
     String value = session.getAttribute(name).toString();
     out.println( name + " = " + value+"<br>");
         System.out.println( name + " = " + value);
   }
%>
  <form action="test.jsp" method="POST">
    CRM <br>
    名称:<input type=text size=20 name="dataName">
     <br>
    值:<input type=text size=20 name="dataValue">
     <br>
    <input type=submit>
   </form>
</body>
</html>

到这里还差一步就可以看到集群的效果,那就是3个tomcat之间session同步的问题。可以通过打开<Engine>节点下的<Cluster>标签的注释来简单的实现session复制:

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

然后在tomcat0/conf/web.xml<webapp>根节点下加入<distributable />

复制tomcat0到tomcat1、tomcat2,修改 的端口避免冲突,修改对应的jvmRoute

启动apache和3个tomcat,就可以看到效果。但这里我们使用memcached-session-manager来同步session,所以不必打开<Cluster>这一步。

2.6 memcached-session-manager配置

2.6.1 安装memcached服务器

这里memcached搭建在另外一台服务器上(192.168.10.20),也可以安装在本地。

[root@cachets msm]# yum install libevent libevent-devel
[root@cachets msm]# tar -zxvf memcached-1.4.19.tar.gz
[root@cachets msm]# cd memcached-1.4.19 && ./configure && make && make install

// 启动两个memcached节点,端口分别为11211、11212
[root@cachets ~]#memcached -d -m 64 -p 11211 -u daemon -P /var/run/memcached.pid
[root@cachets ~]#memcached -d -m 64 -p 11212 -u daemon -P /var/run/memcached2.pid

如果开启了防火墙,需要加入11211、11212端口的允许规则。

2.6.2 再次配置tomcat

加入jar包

asm-3.2.jarcouchbase-client-1.2.2.jarkryo-1.04.jarkryo-serializers-0.11.jarmsm-kryo-serializer-1.6.5.jarmemcached-session-manager-1.6.5.jarmemcached-session-manager-tc6-1.6.5.jarminlog-1.2.jar,reflectasm-1.01.jarspymemcached-2.10.2.jar这些jar包加入tomcat0/lib/下。可以看到这里选用的session序列化策略采用的是kryo。另外要注意版本之间的兼容性,这里只针对tomcat6.x。
修改conf/server.xml

将节点修改成:

   <Context path="" docBase="/apps/test/testapp/TEST" reloadable="true" >
      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
         memcachedNodes="n1:192.168.10.20:11211,n2:192.168.10.20:11212"
         failoverNodes="n1"
         sticky="true"
         requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
         sessionBackupAsync="false"
         sessionBackupTimeout="100"
         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
         copyCollectionsForSerialization="false" />
   </Context>

接着将tomcat0完整的复制2份(tomcat1,tomcat2),也可以放到另外一台服务器上。
修改为workers.properties中定义的AJP等端口:

node tomcat Server port Connector port http Connector port ajp Engine jvmRoute memcached failoverNodes
tomcat0 8005 8080 8009 tomcat0 n1
tomcat1 8105 8081 8109 tomcat1 n1
tomcat2 8205 8082 8209 tomcat2 n2

3. 测试

分别启动tomcat0、tomcat1、tomcat2和apache,注意观察tomcat的启动日志和memcached服务器的日志。

[test@cachets ~]$ /apps/test/tomcat0/bin/startup.sh
[test@cachets ~]$ /apps/test/tomcat1/bin/startup.sh
[test@cachets ~]$ /apps/test/tomcat2/bin/startup.sh
[root@cachets ~]# /apps/test/apache2/bin/apachectl start

在浏览器访问http://192.168.10.100/test.jsp。主要测试负载均衡与session共享。

时间: 2024-09-10 02:07:23

apache+3tomcat+jk+memcached集群环境搭建的相关文章

Hadoop学习之HBase的集群环境搭建

HBase的集群环境搭建 该集成环境是在伪分布搭建的基础上搭建 1.   修改原来的伪分布hadoop1上的hbase的配置文件 #cd /usr/local/hbase/conf/ 待修改的文件:hbase-env.sh.hbase-site.xml.regionservers #vim hbase-env.sh 使用搭建的zookeeper集群环境,因此hbase自带的zookeeper设置为false,不启动. #vim hbase-site.xml 将zookeeper集群所在的主机名,

一:Storm集群环境搭建

第一:storm集群环境准备及部署[1]硬件环境准备--->机器数量>=3--->网卡>=1--->内存:尽可能大--->硬盘:无额外需求[2]软件环境准备--->CentOS-6.0-x86_64系统环境--->三台地址--->zookeeper和storm公用物理环境   第二:节点环境查看 第三:节点之间用ip-->别名绑定/etc/hosts,然后用ping 别名 进行测试 第四:zookeeper集群环境搭建第五:Storm集群环境搭建

spark1.6分布式集群环境搭建

1. 概述 本文是对spark1.6.0分布式集群的安装的一个详细说明,旨在帮助相关人员按照本说明能够快速搭建并使用spark集群.   2. 安装环境 本安装说明的示例环境部署如下: IP 外网IP hostname 备注 10.47.110.38 120.27.153.137 iZ237654q6qZ Master.Slaver 10.24.35.51 114.55.56.190 iZ23pd81xqaZ Slaver 10.45.53.136 114.55.11.55 iZ23mr5ukp

hadoop集群环境搭建

1 hadoop集群规划 1.1 共有A.B.C 三台机器; 1.2 A 作为master,B作为slave1,C作为slave2; 1.3 IP &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;A :192.168.1.103;B:192.168.1.104;C:192.168.1.101; 1.4 OS:centos6.2(64bit) 2 hadoop集群搭建步骤 2.1 创建 hadoop用户,并使该用户拥

Hadoop 2.x 集群环境搭建

======================================================基础环境设置,以CentOS7为例: 1.配置/etc/sysconfig/network-scripts/ifcfg-ens33 绑定ip2.配置主机名ip解析,编辑 /etc/hosts3.修改主机名,编辑/etc/sysconfig/network ,添加一行 HOSTNAME=hostname 4.关闭iptables,selinux,firewalld5.安装jdk,配置$JAV

《循序渐进学Spark 》Spark架构与集群环境

Spark架构与集群环境 本章首先介绍Spark大数据处理框架的基本概念,然后介绍Spark生态系统的主要组成部分,包括Spark SQL.Spark Streaming.MLlib和GraphX,接着简要描述了Spark的架构,便于读者认识和把握,最后描述了Spark集群环境搭建及Spark开发环境的构建方法. 1.1 Spark概述与架构 随着互联网规模的爆发式增长,不断增加的数据量要求应用程序能够延伸到更大的集群中去计算.与单台机器计算不同,集群计算引发了几个关键问题,如集群计算资源的共享

Ubuntu 下 Neo4j单机安装和集群环境安装

1. Neo4j简介 Neo4j是一个用Java实现的.高性能的.NoSQL图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,通过图中的节点和节点的关系来建模.Neo4j完全兼容ACID的事务性.Neo4j以"节点空间"来表 达领域数据,相对于传统的关系型数据库的表.行和列来说,节点空间可以更好地存储由节点关系和属性构成的网络,如社交网络,朋友圈等. 2 neo4j版本介绍 neo4j版本种类比较多,有开源的社区版本,也有企业版本.其中社区版本包括了很多neo4j的

Linux服务器下搭建hadoop集群环境 redhat5/Ubuntu 12.04

Ubuntu 12.04 下搭建 hadoop 集群环境步骤 一. 搭建环境前的准备: 我的本机Ubuntu 12.04 32bit作为maser,就是上篇hadoop单机版环境搭建时用的那台机子,http://www.linuxidc.com/Linux/2013-01/78112.htm 还在KVM中虚拟了4台机子,分别起名为: son-1        (ubuntu 12.04 32bit),son-2        (ubuntu 12.04 32bit),son-3        (

hadoop集群环境的搭建

       今天终于把hadoop集群环境给搭建起来了,能够运行单词统计的示例程序了. 集群信息如下: 主机名 Hadoop角色 Hadoop jps命令结果 Hadoop用户 Hadoop安装目录 master Master slaves NameNode DataNode JobTracker TaskTracker SecondaryNameNode 创建相同的用户的组名:hadoop. 安装hadoop-0.20.2时使用hadoop用户,并且hadoop的文件夹归属也是hadoop: