精华帖 (0) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-08
最后修改:2010-01-10
Apache+JK+Tomcat 负载平衡配置网 上关于 Apache + JK + Tomcat 的集群配置例子很多,按着例子配置下来,基本都能运行,不过,在一些重要的地方却没有进一步的说明。这次公司一个产品就是采用 Apache+JK+Tomcat 集群,在整个配置、测试过程中,遇到了许多的问题,经过不断测试、摸索,最后总算是搞定了,性能也达到了预期的目标。针 对网上的例子,感觉有必要再详细的介绍一下我的配置过程,对一些要特别注意的地方进行补充。 集群有别于分布式的解决方案,它采用的是每台服务器运行相同应用的策略,由负责平衡的服务器进行分流,这对提高整个系统的并发量及吞吐量是更有效的 办法。而集群对请求的处理又有两种不同的方式:负载平衡、状态复制 ( 即集群 ) ,状态复制需要在各服务器间复制应用状态,而负载平衡则不用,每台服务器都是 独立的。实践证明,在各应用服务器之间不需要状态复制的情况下,负载平衡可以达到性能的线性增长及更高的并发需求。 对于集群的其它基础知识,在此就不再做累赘。以下就这次 Apache + JK + Tomcat 的负载平衡配置进行总结,重点关注整个配置及注意事项。 准备软件
节点
1
节点
2
节点
3
节点
4
而集群方式也是使用这种方法进行平衡。 Tomcat 中的集群原理是通过组播的方式进行节点的查找并使用 TCP 连接进行会话的复制。 集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资源占用率是非常高的,如果在并发量大的应用中,复制的会话大小会变得相当大,而使用的总内存更是会迅速升高。 但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的 Session 信息,如果服务器群中某台当机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。 具体采用负载平衡还是集群,这要看应用的需求了。 安装配置
Apache 2 、安装完毕后,将下载的 mod_jk-1.2.14-apache-2.0.54.so 复制到 Apache 安装目录下的 modules 子目录中。 3 、然后进入 Apache 安装目录下的 conf 子目录中,打开 httpd.conf 配置文件,在最后插入以下一行: Include conf/mod_jk.conf # Load mod_jk module. Specify the filename # of the mod_jk lib you’ve downloaded and # installed in the previous section # 加载 mod_jk 模块 LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so
JkWorkersFile conf/workers2.properties # Where to put jk logs JkLogFile logs/mod_jk.log # Set the jk log level [debug/error/info] JkLogLevel info # Select the log format JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " # JkOptions indicate to send SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat "%w %V %T" # 请求分发配置,可以配置多项 JkMount /* loadbalancer 注:蓝色加粗的两行是重点,第一句是
Apache
加载
JK
模块用的;第二句为配置哪些
URL
请求将由负载平衡器来处理。
worker.list=loadbalancer worker.server99.port=8009 worker.server99.host=192.168.11.99 worker.server99.type=ajp13 worker.server99.lbfactor=1 worker.server99.cachesize=1000 worker.server99.cache_timeout=600 worker.server99.socket_keepalive=1 worker.server99.socket_timeout=0 worker.server99.reclycle_timeout=300 worker.server99.retries=3 # Define the second node... worker.server202.port=8009 worker.server202.host=192.168.11.202 worker.server202.type=ajp13 worker.server202.lbfactor=1 worker.server202.cachesize=1000 worker.server202.cache_timeout=600 worker.server202.socket_keepalive=1 worker.server202.socket_timeout=0 worker.server202.reclycle_timeout=300 worker.server202.retries=3 # Now we define the load-balancing behaviour worker.loadbalancer.type=lb worker.retries=3 worker.loadbalancer.balance_workers=server99 ,server202
设定工作的负载平衡器,各 Tomcat 节点不能加入此列表。 B 、 worker.server99.lbfactor 负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为 1:1 ,则为平均分配。 C 、 worker.loadbalancer.balance_workers=server99,server202 指定此负载平衡器负责的 Tomcat 应用节点。 D 、 worker.loadbalancer.sticky_session=true 此处指定集群是否需要会话复制,如果设为 true ,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台 Tomcat 后,后继的请求会一直分发到此 Tomcat 服务器上处理;如果设为 false ,则表明需求会话复制。 E 、 worker.loadbalancer.sticky_session_force=true 如果上面的 sticky_session 设为 true 时,建议此处也设为 true ,此参数表明如果集群中某台 Tomcat 服务器在多次请求没有响应后,是 否将当前的请求,转发到其它 Tomcat 服务器上处理;此参数在 sticky_session=true 时,影响比较大,会导致转发到其它 Tomcat 服 务器上的请求,找不到原来的 session ,所以如果此时请求中有读取 session 中某些信息的话,就会导致应用的 null 异常。
6 、 Apache 服务器的配置文件 httpd.conf 中,默认有三个参数对性能的影响比较大,但根据不同的性能要求,参数的表现又不一样,太小并发提不上去,太大性能反而不好,建议根据项目的需要,实际做个测试,如并发要求 800 的话,可以设定为: # 一个连接的最大请求数量 MaxKeepAliveRequests 1000 (值为 0 ,则不限制数量) # 每个进程的线程数,最大 1920 。 NT 只启动父子两个进程,不能设置启动多个进程 ThreadsPerChild 1000 (最大为 1920 ) # 每个子进程能够处理的最大请求数 MaxRequestsPerChild 1000 (值为 0 ,则不限制数量) 这三个参数要根据不同的需求,不同的服务器进行调整。
安装配置
Tomcat
或
JBoss
2 、对于 JBoss 的配置,很简单,只需要改两个地方就可以了: 第一个地方:进入 jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar ,打开 server.xml ,大约在第 32 行左右,有,在其中加入一个参数,变为:
true
这里有一个需要特别注意的地方, JBoss 的 Tomcat 中,关于 AJP 连接协议的默认配置,对于大并发量是不够用的,要做一些修改,进入 jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar ,打开 server.xml ,找到的 地方,这里是定义 AJP 连接器的地方,它的配置中没有 maxThreads 项,默认为 200 ,我们可以做修
protocol="AJP/1.3" maxThreads="3000"/> maxThreads 的值要看你的并发量多大,设置太大也不好。
运行
如果在运行过程中,群中的某个 JBoss 节点 shutdown ,则已登录到此服务器上的用户的请求将出错,此服务器负责的 session 将丢失,但 Apache 会自动侦测到此服务器已 shutdown ,后继的新请求将不会再引导到此节点。
对于负责请求分发的 Apache 服务器,需要消耗大量的 CPU 资源,因此如果在测试过程中出现一些 Service Temporarily Unavailable 或 Server has shut down the connection prematurely 这样的错误,这一般都是服务器配置不够好引起的,或者是 Apache 、 Tomcat 、及应用中的某些配置不够使用,这时候就要考虑 换更好的机器或优化应用中的配置。
常见问题
如操作系统采用更高版本,如 windows 2003 server , 优化 tomcat 配置: maxThreads="500" minSpareThreads="400" maxSpareThreads="450" 但是 tomcat 最多支持 500 个并发访问 优化 apache 配置: ThreadsPerChild 1900 MaxRequestsPerChild 10000
二、 Action.c(10): Error -27791: Server has shut down the connection prematurely HTTP Status-Code=503 (Service Temporarily Unavailable)
三、无法处理请求: 当我们输入 ***.do 命令后, apache 却返回错误信息,而连接 tomcat 却没有问题。原因是没有把 .do 命令转发给 tomcat 处理。解决方法如下: 在 apache 配置文件中配置如下内容: JkMount /*.jsp loadbalancer JkMount /*.do loadbalancer
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-10
你可以实在太过时了,mod_jk早就被淘汰了,现在都是用mod_proxy_balancer
|
|
返回顶楼 | |
发表时间:2010-01-11
楼主有一些重要的内容,或者一些代码性的东西,可以用不同颜色显示。
这样提高阅读性,看着也舒服多了。 好好排版下吧,谢谢你分享了。 |
|
返回顶楼 | |
发表时间:2010-01-11
theone 写道 你可以实在太过时了,mod_jk早就被淘汰了,现在都是用mod_proxy_balancer
不会吧,举个例子如何?那个大网站或系统用mod_proxy_balancer?或什么xx评测也行 |
|
返回顶楼 | |
发表时间:2010-01-11
nginx横行的时代~呵呵。
|
|
返回顶楼 | |
发表时间:2010-01-11
关键的几个配置未配置,时间长了会造成性能上的影响:
如:tomcat中的ajp connector的connctionTimeout; |
|
返回顶楼 | |
发表时间:2010-01-11
不会吧,举个例子如何?
|
|
返回顶楼 | |
发表时间:2010-01-11
lz人品不错 大家说话要婉转 一定要支持开源事业吗
|
|
返回顶楼 | |
发表时间:2010-01-11
DoubleEO 写道 nginx横行的时代~呵呵。
是...... |
|
返回顶楼 | |
发表时间:2010-01-12
nigix现在用的人多
|
|
返回顶楼 | |
浏览 18766 次