Как программно настроить директиву disable в конфигурации балансировщика нагрузки mod_jk? - PullRequest
3 голосов
/ 20 апреля 2009

У нас есть настройка, в которой у нас есть один httpd (apache) с mod_jk, говорящий в настройке баланса нагрузки с тремя серверами tomcat. Мы должны перерабатывать каждый экземпляр tomcat каждые три часа. Таким образом, tomcat1 будет перезапущен на 1, а tomcat2 на 2 и ... до тех пор, пока tomcat1 снова не перезагрузится на 4.

Мы хотим настроить скрипт или тип программы для отключения рабочего узла, который проходит через цикл, чтобы минимизировать ошибки сеанса у пользователя, использующего наше приложение.

Любые предложения.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2009

Крис спасибо или твой ответ. Я уверен, что это сработает, но я хотел вызвать изменение во время выполнения, хотя изящный перезапуск очень похож. Я смог выполнить задачу по описанию следующим образом.

В вашем файле httpd.conf вы должны добавить следующие строки, чтобы включить модуль jkmanager for mod_jk.

<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>

Изменения в файле «works.properties»:

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

После внесения этих изменений вы можете увидеть jkmanager, напечатав ваш URL, а затем / jkmanager / в конце. Вы должны получить что-то похожее на следующую картинку.

jkmanager screenshot

Чтобы отключить работников во время выполнения, просто запустите следующие URL-адреса для jkmanger. Вы даже можете прочитать статус в формате 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

Я разместил в своем блоге полную статью, объясняющую настройку на случай, если кому-то понадобится об этом знать.

Блог по облачным вычислениям

2 голосов
/ 08 декабря 2011

gkiragiannis, ваш ответ был интересным, но, похоже, не работает для меня. Я хотел отключить только одного из моих подчиненных за один раз.

Предположим, что мы работаем с балансировщиком нагрузки 'agent-lb'.

Чтобы просмотреть статус работника, используя этот URL:

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

Чтобы отключить подчиненного 'agent-n1', используйте этот URL:

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

Чтобы убедиться, что работник отключен, дождитесь переадресации на страницу статуса работника и найдите в поле «Акт» вспомогательного работника «agent-n1»

Чтобы включить подчиненного 'agent-n1', используйте этот URL:

server-name/jkmanager/?cmd=update&w=agent-lb&sw=agent-n1&vwa=0
2 голосов
/ 20 апреля 2009

mod_jk перечитывает работники.свойства на "apachectl graceful", так что если ваши работники.свойства выглядят так:

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

... 

Вы могли бы просто написать скрипт, который заменит список сбалансированных рабочих на те, которые вам нужны, а затем 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
...