Горизонтальное масштабирование (кластеризация)

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

Помимо простейших вариантов active/stand-by схем, в Webim реализуемо размещение компонентов на отдельных нодах (хостах или ядрах процессора) с возможностью установки нескольких (>1) экземпляров каждого компонента. Это дает эффект горизонтального масштабирования (кластеризации) системы в целом с распределением нагрузки между нодами (балансировкой).

Масштабирование Webim Chat Backend

В Webim 10.3 появилось масштабирование компонента Webim Chat Backend (бэкенда чата). В отличие от других компонентов, Webim Chat Backend на данный момент может быть масштабирован только на два узла.

Принципиально схема масштабирования бэкенда чата выглядит следующим образом:

Масштабирование (кластеризация) предусматривает запуск избыточного числа экземпляров бэкенда и распределение приходящей нагрузки между ними.
Масштабирование является асимметричным, то есть, нагрузка между серверами распределяется неравномерно. В частности, сложная бизнес-логика на начальном этапе реализуется только на одном из серверов (master); другой сервер выступает в качестве вспомогательного (slave), работает только с данными о работе аккаунта и может самостоятельно отвечать на некоторые запросы.

Для синхронизации и актуализации данных между серверами осуществляется при помощи очередей сообщений Rabbit MQ. Каждый сервер обрабатывает информацию, появившуюся в очереди (например, при добавлении нового сообщения), благодаря чему данные актуализируются.

Настройка масштабирования

Для запуска масштабирования на сервере nginx в конфигурационный файл (/etc/nginx/sites-available/webim.conf) необходимо добавить следующее:

1.

        location ~ \/l\/o\/set-status  {
                proxy_pass https://127.0.0.1:8270;
                include /etc/nginx/webim-common/python_proxy_params;
 
                error_page 413 /webim/error-413.json;
        }

перед


        location ~ \/l\/  {
                proxy_pass https://127.0.0.1:$tornado_port;
                include /etc/nginx/webim-common/python_proxy_params;
 
                error_page 413 /webim/error-413.json;
        }

2.

        location ~ \/ws\/o\/delta  {
                proxy_http_version 1.1;
                include /etc/nginx/webim-common/python_proxy_params;
                   proxy_set_header Upgrade $http_upgrade;
                  proxy_set_header Connection "Upgrade";
                proxy_pass https://127.0.0.1:8270;
        }

перед

location ~ \/ws\/  {
        proxy_http_version 1.1;
        include /etc/nginx/webim-common/python_proxy_params;
           proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "Upgrade";
        proxy_pass https://127.0.0.1:$tornado_port;
}

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

  • mq_host (имя хоста RabbitMQ)
  • mq_port (порт подключения к RabbitMQ)
  • mq_username (имя пользователя RabbitMQ)
  • mq_password (пароль пользователя RabbitMQ)
  • mq_virtual_host (значение name созданного виртуального хоста на стороне RabbitMQ)

У серверов, входящих в один кластер Webim Chat Backend, все конфигурационные файлы должны быть абсолютно одинаковыми. При этом у них должны отличаться значения параметра multinode_mode:
--multinode_mode=master (для master сервера)
--multinode_mode=slave (для slave сервера)

Для удобства администрирования рекомендуется добавить параметр mq_node_id_prefix в дополнительный конфигурационный файл webim_mq.ini, размещающийся в поддиректории /main.ini.d/.