一.目的

  利用apache的mod_jk模块,实现tomcat集群服务器的负载均衡以及会话复制,这里用到了<Cluster>.

二.环境

  1.基础:3台主机,系统Centos6.5,4G内存,50G硬盘. yum源已更换为阿里源(如何更换可参考博客的另外一篇文章CDN

  2.软件:development tools,jdk-7u9-linux-x64.rpm;源码编译软件apr-util-1.5.4.tar.gz,apr-1.5.2.tar.gz,tomcat-connectors-1.2.40-src.tar.gz,httpd-2.4.16.tar.gz

  3.源码包下载地址:可以去官网下载,或者在此网盘内下载:点击链接

  4.拓扑图

    5.现在就可以安装部署了。

三.部署安装

Apache环节:

  1.编译安装apr

 [root@apache down]# tar xf apr-1.5..tar.gz
[root@apache down]# cd apr-1.5.
[root@apache apr-1.5.]# ./configure --prefix=/usr/local/apr --disable-ipv6
[root@apache apr-1.5.]# make && make install

  2.编译安装apr-util

 [root@apache down]# tar xf apr-util-1.5..tar.gz
[root@apache down]# cd apr-util-1.5.
[root@apache apr-util-1.5.]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@apache apr-util-1.5.]# make && make install

  3.编译安装httpd

 [root@apache ~]# yum -y install pcre-devel openssl-devel        (编译安装前,先安装这两个软件,解决编译httpd时的依赖问题)

  解压httpd,并编译安装。(如果在编译出错情况,请仔细排查错误,记得重新编译时,需要make clean 清除一下)

 [root@apache down]# tar xf httpd-2.4..tar.gz
[root@apache down]# cd httpd-2.4.
[root@apache httpd-2.4.]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-lbmethod-heartbeat --enable-heartbeat --enable-slotmem-shm --enable-slotmem-plain --enable-watchdog
[root@apache httpd-2.4.]# make && make install

  为apache 提供httpd脚本,并加入系统服务,设为开机启动,方便以后的服务管理,文件路径 /etc/rc.d/init.d/httpd

[root@apache httpd-2.4.]# vim /etc/rc.d/init.d/httpd

#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: -
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d $httpd
RETVAL=$?
echo
[ $RETVAL = ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
;;
condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit
esac
exit $RETVAL

  脚本编辑完成后,添加为系统服务

 [root@apache httpd-2.4.]# chkconfig --add httpd
[root@apache httpd-2.4.]# chkconfig httpd on 

  现在,去修改一下httpd.conf文件,开启两个模块的支持,修改之前,我们先来备份一下httpd.conf

[root@apache ~]# cd /etc/httpd/          (因为在编译httpd时,将配置文件的目录即conf下的文件放在了/etc/httpd/下面,所以配置需要去这里。)
[root@apache httpd]# cp httpd.conf httpd.conf--.bak
[root@apache httpd]# ls
extra httpd.conf httpd.conf--.bak magic mime.types original
 [root@apache httpd]# vim httpd.conf
#找到以下两行,取消注释,如果找不到,手动添加进去亦可
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule slotmem_plain_module modules/mod_slotmem_plain.so

  配置完成后,现在检查下配置文件,并启动httpd

[root@apache httpd]# service httpd configtest
Syntax OK [root@apache httpd]# service httpd start

  访问网站,http://192.168.40.184,出现It Works!字样,即表示成功。下面是安装两台tomcat的记录。

Tomcat环节:

  1.tomcatA软件的安装。先来安装下jdk。

 [root@tomcat1 download]# rpm -ivh jdk-7u79-linux-x64.rpm

  添加环境变量的文件,新建java.sh文件,内容如下

[root@tomcat1 download]# vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1..0_79
export PATH=$PATH:$JAVA_HOME/bin

  测试一下

 [root@tomcat1 download]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) -Bit Server VM (build 24.79-b02, mixed mode)

  2.安装tomcat,解压到/usr/local下

 [root@tomcat1 download]# tar xf apache-tomcat-7.0..tar.gz -C /usr/local/ && cd /usr/local
[root@tomcat1 local]# ln -sv apache-tomcat-8.0. tomcat
[root@tomcat1 local]# ll
lrwxrwxrwx root root Oct : tomcat -> apache-tomcat-8.0./

  现在配置tomcat的环境变量/etc/profile.d/tomcat.sh

 [root@tomcat1 local]# vim /etc/profile.d/tomcat.sh

 export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin

  Ctrl + d 键注销一下,再次登陆,试一下命令

[root@tomcat1 local]# catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1..0_79
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.
Server built: Aug :: UTC
Server number: 8.0.26.0
OS Name: Linux
OS Version: 2.6.-.el6.x86_64
Architecture: amd64
JVM Version: 1.7.0_79-b15
JVM Vendor: Oracle Corporation

  方便tomcat服务的管理,我们添加一个脚本,并加入系统服务

 [root@tomcat1 local]# vim /etc/init.d/tomcat 

 #!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig:
# description: The Apache Tomcat servlet/JSP container.
CATALINA_HOME=/usr/local/tomcat #注意你的脚本路径
export CATALINA_HOME
# export CATALINA_OPTS="-Xms128m -Xmx256m"
exec $CATALINA_HOME/bin/catalina.sh $* [root@tomcat1 local]# chmod +x /etc/init.d/tomcat
[root@tomcat1 local]# chkconfig --add tomcat
[root@tomcat1 local]# chkconfig tomcat on
#之后启动一下,测试脚本是否正常 [root@tomcat1 local]# service tomcat start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

  检查一下启动的端口号,正常应该会有以下几个监听的端口:8080,8005,然后可以打开浏览器,访问一下http://192.168.40.178.可以看到小猫咪。安装tomcat完成,现在就去修改配置文件,添加一个虚拟主机。

  3.虚拟主机配置,文件路径/usr/local/tomcat/conf/server.xml,修改之前先备份此文件。将默认的8080端口修改成80端口,在Engine中,将默认主机localhost修改成www.test.com,并在后面追加一句 jvmRoute = “TomcatA”,最后在文件倒数第三行前(即</Engine>上方)添加一个虚拟主机,如下标红字体。

[root@tomcat1 local]# vim /usr/local/tomcat/conf/server.xml
<Connector port="" protocol="HTTP/1.1"
connectionTimeout=""
redirectPort="" />
<Engine name="Catalina" defaultHost="www.test.com" jvmRoute="TomcatA"> <Host name="www.test.com" appBase="/web"
unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="webapp" reloadable="true"/>
</Host>
</Engine>

  现在检查一下tomcat的配置文件,检查之前需要先停止tomcat,不然会报错。

[root@tomcat1 local]# service tomcat stop
[root@tomcat1 local]# service tomcat configtest
....
Oct , :: PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in ms

  创建虚拟主机文件文档目录并创建测试网页

[root@tomcat1 local]# mkdir -p /web/webapp/
[root@tomcat1 local]# cd /web/webapp/
[root@tomcat1 webapp]# vim index.jsp     
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA </h1>
<table align="centre" border="">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html> [root@tomcat1 webapp]# service tomcat start

  启动服务后,可以打开网站,http://192.168.40.178,出现以下说明配置成功了。

  另外一台服务器TomcatB也要按照上述的操作部署。一模一样的去部署。仔细,每个环节都不能少了。(注意,唯一不同的是tomcatB服务器的server.xml中的jvmRoute填写的是TomcatB)

四.利用mod_jk实现负载均衡

  mod_jk 是一个工作在apache端基于AJP协议与Tomcat通信的连接器,是apache的一个模块,是AJP协议的客户端。(服务端是Tomcat的AJP连接器)

  1.下面安装tomcat-connectors

 [root@apache down]# tar xf tomcat-connectors-1.2.-src.tar.gz
[root@apache down]# cd tomcat-connectors-1.2.-src/native/
[root@apache native]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@apache native]# make && make install

  2.模块安装完成后,我们可以查看一下。ls /usr/local/apache/modules/ | grep mod_jk .为了便于管理与mod_jk模块相关的配置,在此使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关配置,内容如下(需要新建):

[root@apache native]# vim /etc/httpd/extra/httpd-jk.conf

#Load the mod_jk
LoadModule jk_module modules/mod_jk.so                  #加载mod_jk模块
JkWorkersFile /etc/httpd/extra/workers.properties            #配置文件位置
JkLogFile logs/mod_jk.log                          #日志
JkLogLevel debug                               #日志级别
JkMount /* lbcluster                             # 负载均衡器名称
JkMount /jkstatus/ stat1      #(最后单词是个数字1)       #状态信息

  然后去编辑/etc/httpd/extra/workers.properties文件,内容如下所示:

[root@apache native]# vim /etc/httpd/extra/workers.properties

worker.list=lbcluster,stat1                    #列表信息
worker.TomcatA.port=8009                      #TomcatA实例端口
worker.TomcatA.host=192.168.40.178                #TomcatA主机
worker.TomcatA.type=ajp13                     #支持协议 
worker.TomcatA.lbfactor=1 #负载均衡权重为1 worker.TomcatB.host=192.168.40.180
worker.TomcatB.port=
worker.TomcatB.type=ajp13
worker.TomcatB.lbfactor= worker.lbcluster.type = lb                      #负载均衡work,lb内置类
worker.lbcluster.sticky_session = 0                  #会话是否绑定
worker.lbcluster.balance_workers = TomcatA,TomcatB          #集群中实例
worker.stat1.type = status                        #状态信息

  现在去修改apache的配置文件,引用上一步我们写入的mod_jk的配置文件,并注释一条信息,如下所示。

[root@apache native]# vim /etc/httpd/httpd.conf
#DocumentRoot "/usr/local/apache/htdocs"
#在文件的末尾添加下面这行内容
Include /etc/httpd/extra/httpd-jk.conf

  下面重启一下httpd服务器,并先停止后端的TomcatA和TomcatB服务器,在启动服务(没有重启功能)。然后打开浏览器,进入测试,访问http://192.168.40.184,这里是apache的网址。刷新网页,则会来回跳转到TomcatA 和TomcatB后端服务器上。如下所示:

  通过mod_jk提供的接口,可以查看群集的状态信息。浏览器访问http://192.168.40.184/jkstatus,如下图所示

五.DeltaManager实现session保持

Tomcat 配置

  1.修改TomcatA的server.xml配置文件,放在倒数第三行</Engine>上,此处放置的位置定义在Engine容器中,则是对所有主机均启用集群功能,如果定义在某Host主机中,则表示近对此主机启用集群功能。

  注意事项:有的文章里配置文件里有这句话:<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> ,此选项在tomcat8中被移除了。所以如果你的版本是tomcat8的话,需要注意一下

[root@tomcat1 conf]# vim server.xml

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="">
<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="" frequency="" dropTime=""/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.40.178" port="" autoBind="" selectorTimeout="" maxThreads=""/>
<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.ClusterSessionListener"/>
</Cluster>

  2.修改TomcatB的server.xml文件,同样在倒数第三行的</Engine>上方添加以下内容。

[root@tomcat2 conf]# vim server.xml
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="">
<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="" frequency="" dropTime=""/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.40.180" port="" autoBind="" selectorTimeout="" maxThreads=""/>
<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.ClusterSessionListener"/>
</Cluster>

  分别在tomcatA和tomcatB上 执行以下命令测试,检测配置文件。

[root@tomcat2 conf]# service tomcat configtest
.....
Oct , :: PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in ms

  此外,所有启用集群功能的web应用程序,其web.xml中都必须添加<distributable/>才能实现集群功能。如果某web应用程序没有自己的web.xml,也可以通过复制默认的web.xml到其WEB-INF目录中实现。

  3.修改web.xml

  TomcatA:

 [root@tomcat1 ~]# vim /usr/local/tomcat/conf/web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <distributable/>          (只需要添加这一句话即可) [root@tomcat1 ~]# mkdir -p /web/webapp/WEB-INF && cp /usr/local/tomcat/conf/web.xml /web/webapp/WEB-INF/

  TomcatB:

[root@tomcat2 ~]# vim /usr/local/tomcat/conf/web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <distributable/> [root@tomcat2 ~]# mkdir -p /web/webapp/WEB-INF && cp /usr/local/tomcat/conf/web.xml /web/webapp/WEB-INF/

  4.启动tomcat服务器

  TomcatB:

 [root@tomcat1 ~]# service tomcat start
[root@tomcat1 ~]# netstat -aultnp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /master
tcp 192.168.40.178: 192.168.30.192: ESTABLISHED /sshd
tcp ::: :::* LISTEN /java
tcp ::: :::* LISTEN /sshd
tcp ::: :::* LISTEN /master
tcp ::ffff:192.168.40.178: :::* LISTEN /java
tcp ::ffff:127.0.0.1: :::* LISTEN /java
tcp ::: :::* LISTEN /java
tcp ::ffff:192.168.40.178: ::ffff:192.168.40.180: TIME_WAIT -
tcp ::ffff:192.168.40.178: ::ffff:192.168.40.180: ESTABLISHED /java
tcp ::ffff:192.168.40.178: ::ffff:192.168.40.180: ESTABLISHED /java
udp ::: :::* /java

  TomcatB:

[root@tomcat2 ~]# service tomcat start
[root@tomcat2 ~]# netstat -altpnu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /master
tcp 192.168.40.180: 192.168.30.192: ESTABLISHED /sshd
tcp ::: :::* LISTEN /java
tcp ::: :::* LISTEN /sshd
tcp ::: :::* LISTEN /master
tcp ::ffff:192.168.40.180: :::* LISTEN /java
tcp ::ffff:127.0.0.1: :::* LISTEN /java
tcp ::: :::* LISTEN /java
tcp ::ffff:192.168.40.180: ::ffff:192.168.40.178: ESTABLISHED /java
tcp ::ffff:192.168.40.180: ::ffff:192.168.40.178: ESTABLISHED /java
udp ::: :::* /java       

  5.现在打开浏览器,访问http://192.168.40.184,进行验证。

  无论如何刷新,图中的SessionID都是不变的。

  通过以上的观察,我们tomcat集群负载功能已经实现,并且配置了DeltaManager得到session的复制。

六.总结

  通过以上的安装配置,以及过程中遇到的故障的解决,对apache的以及tomcat得到一些了解和认识。编译安装虽说很麻烦,确实很容易出错。。。。

本文大多数参考freeloda的博客,在原文基础上加入了一点点自己的修改,以及最新版软件使用时的不兼容。原文: “Share your knowledge …” 博客,请务必保留此出处http://freeloda.blog.51cto.com/2033581/1301382

  参考资料:关于tomcat8的权威指南:http://wiki.jikexueyuan.com/project/tomcat/

Centos下Apache+Tomcat集群--搭建记录的更多相关文章

  1. linux环境下Apache+Tomcat集群配置

    写在前面 apache配置多个tomcat,实现请求分流,多个tomcat服务均衡负载,增加服务的可靠性.最近研究了一下,遇到许多问题,记录一下,方便以后查阅,不喜欢apache,nginx也是可以做 ...

  2. Linux下搭建tomcat集群全记录

    (转) Linux下搭建tomcat集群全记录 2011-10-12 10:23 6133人阅读 评论(1) 收藏 举报 tomcatlinuxapacheinterceptorsession集群 1 ...

  3. Apache + Tomcat集群配置详解 (1)

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  4. (转)Apache+Tomcat集群配置

    本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是ht ...

  5. Tomcat集群搭建

    关于如何搭建Tomcat集群网上还是能搜到很多相关的教程,这里结合我自己在实际应用中的操作做下备忘. 案例说明: 这里以在本机部署的2个tomcat来做集群.当然,tomcat集群可以是分布式的,而差 ...

  6. linux下配置tomcat集群的负载均衡

    linux下配置tomcat集群的负载均衡 一.首先了解下与集群相关的几个概念集群:集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台.在客户端看来,一个集群就象是一个服 ...

  7. 实战Apache+Tomcat集群和负载均衡

    实战Apache+Tomcat集群和负载均衡 目录 1.    什么是J2EE集群... 3 1.1.     序言... 3 1.2.     基本术语... 3 伸缩性(Scalability): ...

  8. haproxy+tomcat集群搭建

    web1和web2的部署可参考我之前的文章<Tomcat集群搭建>,这里就省去该过程了. #安装haproxy- .tar.gz cd haproxy-/ make TARGET=linu ...

  9. Linux下搭建tomcat集群全记录(转)

    本文将讲述如何在Linux下搭建tomcat集群,以及搭建过程中可能的遇到的问题和解决方法.为简单起见,本文演示搭建的集群只有两个tomact节点外加一个apache组成,三者将安装在同一机器上:ap ...

随机推荐

  1. 【中文同义词近义词】词向量 vs 同义词近义词库

    方案一:利用预训练好的词向量模型 优点: (1)能把词进行语义上的向量化(2)能得到词与词的相似度 缺点: (1)词向量的效果和语料库的大小和质量有较大的关系(2)用most_similar() 得到 ...

  2. python3.4 使用BeautifulSoup问题

    事情 记得昨儿还是什么时候,反正是以前,肯定安装过BeautifulSoup,只不过当初可能用的是python setup.py install,这是Python2的安装.然而用Python3运行Be ...

  3. 【集成学习】 lightgbm原理

    # lightgbm和xgboost对比: 模型精度:lightgbm≈xgboost 收敛速度:lightgbm>xgboost #

  4. java 输入输出流 关于InputStream 和 OutputSteam 实现文本一行一行读入和 文本一行一行输出

    对  byte 有了新的认知:byte表示一个字节 因此他可以表示成 一个 数字: 一个数字可以映射成一个字符:InputStream 中的 read() 函数  的意思是读入一个整数,读入一个整数的 ...

  5. WEB服务器都在做哪些工作?

    作为WEB开发人员,我们肯定应该要知道WEB服务器都在做哪些工作,这里简单列举一下,有时间然后详细说明. (1)建立连接——接受一个客户端连接. (2)接收请求——从网络中读取一条 HTTP 请求报文 ...

  6. Java并发--lock锁详解

    在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...

  7. Codeforces 9D How many trees? 【计数类DP】

    Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...

  8. BZOJ4689 Find the Outlier 【高斯消元】*

    BZOJ4689 Find the Outlier Description Abacus教授刚刚完成了一个制作数表的计算引擎的设计.它被设计用于同时计算一个多项式在许多点的取值.例如对于多项式 f(x ...

  9. iOS设备是否越狱的判断代码

    苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制.这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所.总体来说,越狱可以让我们随意安装.共享应用,但 ...

  10. XML专题:使用NSXMLParser解析xml文件

    使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data ...