При разработке и эксплуатации систем уровня предприятия возможностей одного, даже очень производительного, сервера зачастую не хватает, поэтому необходимо организовать работу приложения на группе серверов. Такая группа серверов называется кластером. Сервер приложений WebLogic от фирмы Oracle позволяет создавать в рамках одного домена кластер (или даже несколько кластеров) и обеспечивать балансировку нагрузки и репликацию сессий между машинами, в него входящими.
В данной статье мы рассмотрим следующие вопросы:
- Структура домена WebLogic.
- Создание домена и объединение серверов в кластер.
- Балансировка нагрузки с помощью HttpClusterServlet.
- Репликация сессий между серверами кластера.
- Балансировка нагрузки с помощью Apache 2.
- Выводы.
- Ресурсы.
Структура домена WebLogic
Разберемся с терминами:
Домен - группа серверов приложений, администрируемая как единое целое с помощью единственного администрирующего сервера (Admin Server). Сервера, компоненты домена, не являющиеся администрирующим сервером, называются управляемыми серверами (Managed Servers). Управляемые сервера, объединенные в домен, могут быть сгруппированы в несколько кластеров.
Кластер - группа управляемых серверов, между которыми возможна балансировка нагрузки и репликация сессий.
Стоит отметить, что управляемые сервера можно не объединять в кластер, однако между необъединенными в кластер серверами невозможно реплицировать сессии.
Создание домена и объединение серверов в кластер
Для управления доменом предназначена специальная утилита, расположенная по адресу (в Windows, %WL_HOME% обозначает каталог, в который установлен WebLogic) %WL_HOME%\common\bin\config.cmd.
После запуска данная утилита предложит на выбор два варианта: создание нового или модификация существующего домена. Нам необходимо создать новый домен:
Существует три варианта создания домена:
- с нуля;
- по шаблону;
- использование автоматически созданной конфигурации для поддержки определенного продукта.
Балансировка нагрузки с помощью HttpClusterServlet
В качестве балансировщика нагрузки может выступать как аппаратное решение, так и специальный сервлет - weblogic.servlet.proxy.HttpClusterServlet или веб-сервер Apache 2. Последние два варианта мы и рассмотрим в рамках данной статьи. Прежде чем использовать решение на основе weblogic.servlet.proxy.HttpClusterServlet, необходимо создать дополнительный домен, содержащий один - администрирующий - сервер, на котором будет развернут веб-модуль, предоставляющий доступ к HttpClusterServlet'у. Условимся, что данный сервер будет доступен на порту 9001: Сам сервлет HttpClusterServlet поставляется вместе с WebLogic, однако его необходимо настроить, описав в дескрипторе развертывания web.xml. Полный список настроек приведен в официальной документации, ограничимся лишь минимальным набором: указанием серверов, между которыми распределяется нагрузка и констатацией того факта, что защищенное соединение не используется:<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>HttpClusterServlet</servlet-name>
<servlet-class>weblogic.servlet.proxy.HttpClusterServlet</servlet-class>
<init-param>
<param-name>WebLogicCluster</param-name>
<param-value>localhost:8001|localhost:8002|localhost:8003</param-value>
</init-param>
<init-param>
<param-name>SecureProxy</param-name>
<param-value>OFF</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HttpClusterServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Следует обратить внимание, что на конкретный сервер будут перенаправляться все запросы:
<url-pattern>/</url-pattern>
Чтобы балансировка нагрузки работала корректно, необходимо развернуть веб-модуль, предоставляющий доступ к HttpClusterServlet, в корневой веб-контекст, т.е. модуль должен быть доступен по адресу http://localhost:9001/, а не http://localhost:9001/something. Указать путь к веб-контексту необходимо в дополнительном, специфичном для WebLogic, дескрипторе развертывания - weblogic.xml:
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
<wls:weblogic-version>10.3.3</wls:weblogic-version>
<wls:context-root>/</wls:context-root>
</wls:weblogic-web-app>
Созданный веб-модуль, по сути содержащий лишь два дескриптора развертывания, необходимо развернуть (прошу прощения за тавтологию) на единственном, администрирующем, сервере второго из созданых нами доменов.
Теперь можно протестировать балансировку нагрузки в действии. Демонстрационное приложение, развернутое на кластере, содержит в себе сервлет, выводящий наименование сервера, обрабатывающего запрос. Данный сервлет доступен по адресу http://localhost:9001/oracle-cluster-demo/cluster:
Видно, что запрос был обработан на сервере NL1. Обновим страницу:
Теперь - на сервере NL3.
И NL2. По-умолчанию используется алгоритм Round-Robin, т.е. по сути запросы перенаправляются на каждый сервер по кругу.
В состав демонстрационного приложения так же входит страница, написаная на JSF:
Если обновлять данную страницу или нажимать кнопку Update, то ничего происходить не будет - запрос будет по-прежнему перенаправляться на сервер NL2. Дело в том, что в WebLogic реализована балансировка нагрузки с привязкой к сессии. Т.е. если инициирована сессия (а JSF всегда инициирует сессию для хранения состояния страниц), то все последующие запросы будут направляться на сервер, иницировавший эту сессию. В нашем примере - на сервер NL2. Однако, для демонстрации можно открыть новую сессию, например обратившись к странице http://localhost:9001/oracle-cluster-demo/info.jsf из другого браузера.
Посмотрим, что произойдет если имитировать сбой на сервере NL2, например отключив его:
Т.к. обратиться к серверу NL2 нельзя - он выключен - то балансировщик перенаправит запрос на другой сервер, но на другом сервере нет данных сессии, что приводит к 500-й ошибке:
Репликация сессий между серверами кластера
Чтобы избежать подобных ошибок, необходимо настроить репликацию данных о пользовательских сессиях между узлами кластера. Нужно отметить, что WebLogic поддерживает довольно широкий диапазон возможных хранилищ данных сессий:- InMemory - применяется для одиночного сервера, данные хранятся в памяти, не реплицируются.
- InMemory Replication - данные хранятся в памяти, но реплицируются между серверами в кластере.
- File system persistence - данные хранятся в файловой системе сервера. Репликацию можно сделать через общее файловое хранилище.
- JDBC persistence - данные хранятся в базе данных. Поддерживаются Oracle, SQL Server, Sybase, DB2 и другие типы СУБД.
- Cookie-based session persistence - данные хранятся на машине клиента. Метод накладывает ряд ограничений - поддерживается только basic-авторизация, в сессии можно хранить только строки и т.д.
- memory — данные сессии хранятся в памяти сервера и не реплицируются;
- replicated — данные сессии хранятся в памяти сервера и реплицируются между серверами кластера. При попытке развернуть приложение на одиночном сервере будет брошено исключение;
- replicated_if_clustered — если приложение разворачивается в кластере, то данные сессии будут реплицироваться между машинами кластера, иначе - храниться в памяти сервера;
- async-replicated - асинхронная репликация данных между машинами кластера;
- async-replicated-if-clustered - асинхронная репликация данных между машинами, если приложение разворачивается на кластере, иначе - данные будут храниться в памяти сервера;
- file — данные сессии хранятся в файловой системе сервера;
- async-jdbc — асинхронное помещение данных в СУБД;
- jdbc — синхронное помещение данных в СУБД;
- cookie — все данные сессии хранятся в куках пользовательского браузера.
<wls:session-descriptor>
<wls:persistent-store-type>replicated</wls:persistent-store-type>
</wls:session-descriptor>
После чего, повторим эксперимент с выключением сервера. Увидим, что даже после смены сервера данные сессии успешно прочитаны и состояние JSF-страницы восстановлено:
Балансировка нагрузки с помощью Apache 2
Использовать для балансировки нагрузки целый отдельный домен, а тем более отдельный сервер WebLogic довольно накладно. Однако, WebLogic поддерживает целый ряд серверов, таких как Apache 2 и даже IIS, позволяя использовать их в качестве балансировщика. Рассмотрим использование веб-сервера Apache 2 для обработки статического контента и балансировки нагрузки. Прежде всего необходимо скачать веб-сервер с официального сайта и установить. После чего добавить к веб-серверу модуль mod_wl_22.so (или mod_wl128_22.so, если нужно использовать 128-битную криптографию). Для этого нужно скопировать файл (для Windows 32) %WL_HOME%\server\plugin\win\32\mod_wl_22.so в каталог %APACHE_HOME%\modules и отредактировать файл %APACHE_HOME%\conf\httpd.conf, добавив в него строчку:LoadModule weblogic_module modules/mod_wl_22.so
Данную строчку нужно добавить в начало списка подключаемых модулей.
Возможны два варианта анализа запроса - по пути и по MIME-типу запрашиваемого контента. Для диспетчеризации по пути используются элементы конфигурационного файла Apache
<Location /weblogic>
Для диспетчеризации по MIME-типу - элементы файла конфигурации Apache
<IfModule mod_weblogic.c>
Для нашего минимального примера достаточно добавить в конец файла httpd.conf следующие строки:
<IfModule mod_weblogic.c>
WebLogicCluster localhost:8001,localhost:8002,localhost:8003
MatchExpression *.jsf
WLLogFile C:/Windows/Temp/foo_proxy.log
</IfModule>
Здесь:
- WebLogicCluster - список серверов, на которые можно перенаправлять запросы. Следует обратить внимание, что сервера могут и не являться частью кластера, но тогда между ними будет невозможна репликация данных сессии;
- MatchExpression - MIME-тип, подвергающийся диспетчеризации. Если нужно обрабатывать несколько типов - должно быть несколько записей MatchExpression.
- WLLogFile - путь к файлу логу ошибок диспетчеризации.
Выводы
Мы рассмотрели структуру домена WebLogic и разобрались как настроить балансировку нагрузки, восстановление после ошибки и репликацию сессии между узлами кластера. Вне рассмотрения остались проблемы выбора кластерной топологии и балансировка нагрузки не в веб-части приложения, а на уровне бизнес-логики (EJB), инфраструктуры (RMI, JMS) и хранения данных (JDBC). Если будет необходимо, то рассмотрим данные аспекты позднее. Как всегда буду рад ответить на ваши вопросы, задавайте их в комментариях.Ресурсы
- Oracle WebLogic Server Documentation Library;
- Failover and Replication in a Cluster;
- Using Sessions and Session Persistence;
- Installing and Configuring the Apache HTTP Server Plug-In;
- weblogic.xml Deployment Descriptor Elements;
- WebLogic Load Balancing for Oracle ADF Applications;
- High Available Weblogic Cluster.
Спасибо за статью! Я правильно понимаю, что решение проблемы общей файловой системы для элементов домена (управляемых серверов) остаётся вне компетенции кластера WebLogic. Другими словами у нас нет возможности горизонтально масштабировать приложение, работающее с файлами, только по средствам WebLogic?
ОтветитьУдалитьМогу ошибаться, но похоже нет. В сети активно обсуждают решения на основе NFS, Red Hat GFS, drbd.
ОтветитьУдалитьЗ.Ы. добавил еще одну ссылку в Ресурсы.
Павел, а есть ли какие нибудь стандартные средства для сборки и/или развертывания приложений на кластер, балансируемый с помощью веб сервера Apache? Т.е. можно ли получить war без статических ресурсов и еще отдельно что то типа zip архива со статическими ресурсами? Что бы можно было бы war развернуть в кластере и zip в веб сервере. Или как вообще такие задачи решаются?
ОтветитьУдалитьТаких специализированных средств я не знаю, однако все можно решить, например, с помощью старого доброго Ant'а - WebLogic предоставляет антовские команды для развертывания модулей на кластере.
ОтветитьУдалитьВ конце-концов технология J2EE модульная и никто не мешает просто создавать отдельные проекты: проект со статикой, собираемый в ZIP, проект с веб-модулем - в WAR, EJB модули - в ZIP и так далее. Веб-интерфейс службы администрирования WebLogic позволяет разворачивать модули как на кластере, так и на отдельных серверах.
Мой рецепт (через maven):
ОтветитьУдалить1) war собираю спомощью maven-war-plugin, с исключением статических ресурсов;
2) статические ресурсы заворачиваю в zip с помощью maven-assembly-plugin;
3) Полученные на выходе файлы раскладываю куда нужно в ручную (хотя тоже можно было бы автоматизировать).
Спасибо за рецепт.
ОтветитьУдалитьПункт 3 в крайнем случае можно попробовать автоматизировать через maven-ant взаимодействие.
"Стоит отметить, что управляемые сервера можно не объединять в кластер, однако между необъединенными в кластер серверами невозможно распределять нагрузку"
ОтветитьУдалитьВозможно.
Спасибо за ценное замечание. Внес изменения.
ОтветитьУдалитьА работает ли репликация если использовать в качестве балансировщика Oracle HTTP Server?
ОтветитьУдалитьСам не настраивал, поэтому определенно сказать не могу. Если я не путаю и Oracle HTTP Server - компонент Oracle WebTier, то это тот же Apache, но с поддержкой от Oracle.
ОтветитьУдалитьДа, согласен. Просто странно, что примеров с использованием OHS нигде нет, хотя Webtier покрывается лицензией от Weblogic.
ОтветитьУдалитьХотел бы еще уточнить. Например при использовании трех серверов в кластере получается трехкратное резервирование.
Но не понятно, как резервируется сам балансировщик. Ведь он должен находится на одном из серверов кластера, если это софтовое решение. Т.е. никакого резервирования балансировщика нет. А без него не работает кластер. Немного странно.
Я видел такое решение: стояло два балансировщика на двух отдельных узлах (т.е. даже не тех машинах, которые входят в кластер). Балансировка же между балансировщиками осуществлялась на уровне DNS.
ОтветитьУдалитьСпасибо. Может можете порекомендовать какой-то ресурс или книгу, где рассматривались бы вопросы проектирования инфраструктур на weblogic или в общем касательно oracle-инфраструктур? Что-то типа best practice.
ОтветитьУдалитьЕсть книжка Professional Oracle WebLogic Server. Есть блоги и конечно же форумы OTN. Какой-то конкретной статьи не подскажу, т.к. инфраструктуру нужно проектировать под конкретно вашу задачу, а лучше вас ее никто не знает.
ОтветитьУдалитьА можно еще уточнить?
ОтветитьУдалитьМожно ли использовать Apache или OHS как балансировщик для нескольких кластеров?
Т.е. необходимо, чтобы Apache слушал несколько портов. Не знаю, можно ли это сделать с помощью virtual hosts?
По поводу портов - затрудняюсь с ответом. Виртуальные хосты, думаю, следует попробовать.
ОтветитьУдалитьПавел, а можно ли сделать балансировку между серверами кластера не просто через round-robin,
ОтветитьУдалитьа определяя наименее загруженный сервер?
@Alexander, в кластере есть параметр - Default Load Algorithm. По-умолчанию, его значение равно round-robin. Посмотрите, там есть разные варианты, в частности weight-based и random.
ОтветитьУдалитьПавел, а можно еще вопрос.
ОтветитьУдалитьВвиду того, что "mod_wl_ohs (as of 11gR1) only support container level failover and NOT application level failover. mod_wl_ohs continues to route requests to a down application as long as the managed server is up and running." Думаю, это характерно не только для Oracle HTTP Server.
Есть ли механизм, который обеспечит именно защиту приложения?
По-моему, проблема здесь надумана. Странная ситуация, когда на сервере упало только одно приложение, это скорее программная ошибка, а не системная. Т.е. скорее-всего приложение или нужные ему ресурсы (например, JMS) неверно настроены. Все же, на мой взгляд, ситуация, когда падает целый сервер более характерна, чем когда ни с того ни с сего одно приложение падает, а другие - работают.
ОтветитьУдалитьКак решать данную задачу относительно отдельного приложения я не знаю, не интересовался.
Павел, да, согласен. Хотел бы последний вопрос задать. Где можно скачать тестовое приложение, показывающие работу балансировщика, приведенное в статье?
ОтветитьУдалитьК сожалению, у меня не осталось исходников тестового приложения.
ОтветитьУдалитьА зачем для HttpClusterServlet сервлета создавать отдельный домен? ведь его можно установить на отдельный новый managed сервер(не в кластере) в созданном домене.
ОтветитьУдалитьДа, можно и так сделать. Просто отдельный домен был удобнее для демонстрации - когда меняем балансировщик, наш домен с кластером не захламляется ненужным MS.
ОтветитьУдалитьПавел приветствую.
ОтветитьУдалитьПриходилось ли Вам настраивать подобную схему:
Клиент -> OHS -> Weblogic
Клиент через прокси (OHS в моем случае) заходит на Weblogic по SSL сертификату, который OHS должен пробрасывать на Weblogic.
Дело в том, что вход по сертификату напрямую на weblogic настраивается без проблем, через Default Asserter. Однако как только между клиетом и сервером появляется прокси, то на сам OHS клиент попадает, однако на Weblogic его не пробрасывает. Может быть что-то подскажете?
Заранее благодарен.
Здравствуйте Павел такой вопрос есть ли у вас уроки по производительности weblogica к примера у меня 2 сервера на linuxe и на винде конфиги все идентичный но почему то linux очень медленно работает
ОтветитьУдалитьПрошу прощения за то, что отвечаю с задержкой на целый месяц. Если тема еще актуальна, постучитесь на samolisov собака на gmail, разберемся в ситуации.
ОтветитьУдалить