3

我们有一个设置,我们有一个带有 mod_jk 的 httpd (apache),在负载平衡设置中与三个 tomcat 服务器通信。我们必须每三个小时回收每个 tomcat 实例。所以tomcat1会在1点重启,tomcat2会在2点重启……直到tomcat1在4点重启。

我们想要配置一个脚本或一种程序来禁用正在经历循环的工作节点,以最大限度地减少使用我们应用程序的用户的会话错误。

有什么建议么。

4

3 回答 3

2

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

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

... 

你可以写一个脚本,用你想要的替换balanced_workers列表,然后优雅的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
于 2009-04-20T11:50:37.683 回答
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

完成这些更改后,您可以通过在最后输入您的 url 和 /jkmanager/ 来查看 jkmanager。你应该得到类似于下图的东西。

jkmanager 截图

为了在运行时禁用工作人员,只需对 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

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

云计算博客

于 2009-04-20T18:34:38.290 回答
2

gkiragiannis,您的回答很有趣,但似乎对我不起作用。我想一次只禁用我的一个子工作人员。

假设我们正在使用“agent-lb”负载平衡器。

要使用此 url 查看工作人员状态:

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

要禁用“agent-n1”子工作人员,请使用以下网址:

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

为确保工作人员被禁用,请等待重定向到工作人员状态页面,并在“Act”字段中查找子工作人员“agent-n1”

要启用“agent-n1”子工作人员,请使用以下网址:

server-name/jkmanager/?cmd=update&w=agent-lb&sw=agent-n1&vwa=0
于 2011-12-08T05:49:29.757 回答