如何以编程方式调整mod_jk负载均衡器配置中的disable指令?

时间:2009-04-20 04:31:11

标签: java apache tomcat mod-jk

我们有一个设置,我们有一个httpd(apache),mod_jk在负载平衡设置中与三个tomcat服务器通信。我们必须在三个小时内回收每个tomcat实例。因此tomcat1将在1处重新启动,而tomcat2将在2处重新启动......直到tomcat1再次在4处再循环。

我们希望配置脚本或程序类型以禁用正在进行重新计划的工作节点,以最大限度地减少使用我们的应用程序的用户的会话错误。

任何建议。

3 个答案:

答案 0 :(得分:2)

mod_jk在“apachectl graceful”上重新读取workers.properties,所以如果你的workers.properties看起来像这样:

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2, tomcat3

... 

你可以写一个脚本,用你想要的那个替换balanced_workers列表,然后是graceful的apache

更新这里有一个脚本可以做到这一点,我从一些我躺着的位拼凑而成。我不建议在生产中使用它,但它可能会为您自己的版本提供一些想法。

#!/bin/bash

# set some paths
WORKERS_PROPERTIES="./workers.properties"
APACHECTL="/usr/sbin/apache2ctl"

# what does the loadbalancer config line look like?
WORKER_LINE_START="worker.loadbalancer.balanced_workers="
# full list of workers
ALL_WORKERS="tomcat1 tomcat2 tomcat3"

# first command line arg is the worker to remove. 
remove=$1

# build up the new line listing the active workers
worker_line=$WORKER_LINE_START
sep=""
for worker in $ALL_WORKERS
do
  if [ ${remove} != ${worker} ]
  then
     worker_line="${worker_line}$sep $worker"
     sep=","
  fi
done

# sed hackery to replace the current line with the one we just built.
# needs gnu sed (or another one that supports in-place editing)
sed -i.bak "s/^$WORKER_LINE_START.*$/$worker_line/" $WORKERS_PROPERTIES

# restart apache
$APACHECTL graceful

答案 1 :(得分:2)

克里斯谢谢你的回答。我相信它会工作,但我想在运行时触发更改,即使正常重启非常相似。我能够通过以下方式完成我的描述任务。

在你的httpd.conf文件中,你应该添加以下行来启用mod_jk模块的jkmanager。

<Location /jkmanager/>
JkMount jkstatus
order deny,allow
allow from <your ip address>
allow from 127.0.0.1
deny from all
</Location>

<IfModule mod_jk.c>
...
JkMount  /jkmanager/* jkstatus
...
</IfModule>

“workers.properties”文件的更改为:

 worker.list=router,tomcat1,tomcat2,...,tomcatn,jkstatus
 worker.jkstatus.type=status

完成这些更改后,您可以通过键入您的网址,然后输入/ jkmanager /来查看jkmanager。你应该得到类似下图的内容。

jkmanager screenshot

为了在运行时禁用worker,只需针对jkmanger运行以下URL。您甚至可以以xml格式读取状态。

要禁用tomcat1,只需点击:

http://your.web.server/jkmanager/?cmd=update&w=router&opt=256&from=list&att=vwa&val0=1&val1=0&val2=0  

启用tomcat1返回命中:

http://your.web.server/jkmanager/?cmd=update&w=router&opt=256&from=list&att=vwa&val0=0&val1=0&val2=0

我在我的博客中发布了一篇完整的文章,解释了有人需要知道的设置。

Cloud Computing Blog

答案 2 :(得分:2)

gkiragiannis,你回答很有意思,但似乎并不适合我。我想一次只禁用一个我的子工作者。

让我们假设我们正在使用代理商lb&#39;负载均衡器。

使用此网址查看工作人员状态:

server-name/jkmanager/?cmd=list&w=agent-lb

禁用&#39; agent-n1&#39;子工作者使用此网址:

server-name/jkmanager/?cmd=update&w=agent-lb&sw=agent-n1&vwa=1

要确保工作人员处于停用状态,请等待重定向到工作人员状态页面,然后查看&#39;法案&#39;子工作人员的字段,&#39; agent-n1&#39;

启用&#39; agent-n1&#39;子工作者使用此网址:

server-name/jkmanager/?cmd=update&w=agent-lb&sw=agent-n1&vwa=0