У меня есть настройка балансировки нагрузки и переключения при отказе, настроенная на нашем сервере на базе Debian X64. Прямо сейчас у меня есть 2 экземпляра Tomcat, которые находятся в состоянии балансировки нагрузки и аварийного переключения и работают все время. Запросы обслуживаются либо через Tomcat1 (server1), либо через Tomcat2 (server2).
Перед Tomcat находится веб-сервер Apache, который действует как балансировщик нагрузки и аварийное переключение и настраивается с помощью mod_jk. Оба Tomcat подключены к веб-серверу через AJP
.
Теперь я хотел бы вместо двух экземпляров Tomcat запустить только один. Когда этот экземпляр умирает или аварийно завершает работу, активируется второй экземпляр Tomcat, и запросы обрабатываются вместе с ним.
Вот конфигурация:
worker.properties:
worker.list=loadbalancer
worker.list=jk-status
worker.jk-status.type=status
#worker.jk-status.read_only=true
worker.list=jk-manager
worker.jk-manager.type=status
worker.server1.port=8010
worker.server1.host=localhost
worker.server1.lbfactor=1
worker.server1.type=ajp13
worker.server2.port=8011
worker.server2.host=localhost
worker.server2.type=ajp13
worker.server2.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=server1,server2
worker.loadbalancer.sticky_session=true
сайты-включены / 000-по умолчанию:
Listen 443
<VirtualHost _default_:443>
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
ServerName www.domain.com
ServerAlias *.domain.com domain.com
JkMount /* loadbalancer
SSLEngine on
SSLCertificateFile /path/to/.crt
SSLCertificateKeyFile /path/to/.key
SSLCertificateChainFile /path/to/.ca-bundle
</VirtualHost>
добавил это в apache2.conf:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /etc/apache2/mod_jk.log
JkMount /* loadbalancer
JkMount /jkStatus jk-status
<IfModule mod_rewrite>
RewriteEngine On
</IfModule>
Tomcat1:
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" URIEncoding="utf-8"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
<Connector port="8443" enableLookups="true" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="200" compression="off" sslProtocols="TLS" sslEnabledProtocols="TLSv1+TLSv1.1+TLSv1.2"
compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"
keystoreFile="/path/to/keystore" keystorePass="PASS" URIEncoding="utf-8"/>
То же самое, только с измененными номерами портов в Tomcat2.
Надеюсь, информации достаточно для решения этой проблемы. Пожалуйста, дайте мне знать. Спасибо.
Обновленная конфигурация
worker.list=loadbalancer
worker.list=jk-status
worker.jk-status.type=status
worker.list=jk-manager
worker.jk-manager.type=status
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=server1,server2
# Define the first member worker
worker.server1.type=ajp13
worker.server1.host=localhost
worker.server1.port=8010
# Define preferred failover node for worker1
worker.server1.redirect=server2
# Define the second member worker
worker.server2.type=ajp13
worker.server2.host=localhost
worker.server2.port=8011
# Disable worker2 for all requests except failover
worker.server2.activation=disabled
worker.loadbalancer.sticky_session=true
Согласно документация mod_jk, кажется, вы бы использовали distance
для создания горячего резерва, установив большее расстояние:
Целое число, выражающее предпочтения сбалансированных рабочих фунта. Балансировщик нагрузки никогда не выберет сбалансированного воркера, если есть другой рабочий воркер с меньшим расстоянием. Только в случае, если все рабочие, находящиеся ниже заданного расстояния, ошиблись, отключены или остановлены, рабочие, находящиеся на большем расстоянии, имеют право на балансировку.
в LoadBalancer Howto документация однако предлагается другой подход:
Наконец, вы также можете настроить рабочие процессы горячего резервирования, используя отключенную активацию в сочетании с перенаправлением атрибутов, добавленным к другим рабочим:
# The advanced router LB worker
worker.list=router
worker.router.type=lb
worker.router.balance_workers=worker1,worker2
# Define the first member worker
worker.worker1.type=ajp13
worker.worker1.host=myhost1
worker.worker1.port=8009
# Define preferred failover node for worker1
worker.worker1.redirect=worker2
# Define the second member worker
worker.worker2.type=ajp13
worker.worker2.host=myhost2
worker.worker2.port=8009
# Disable worker2 for all requests except failover
worker.worker2.activation=disabled
Флаг перенаправления на worker1 указывает балансировщику нагрузки перенаправить запросы на worker2 в случае, если у worker1 есть проблема. Во всех остальных случаях worker2 не будет получать никаких запросов, действуя как горячий резерв.