Масштабирование v2
В данной статье описываются принцип работы и настройка масштабирования на Webim Server версии 10.5.
Масштабирование Webim Chat Backend
Принципиально схема масштабирования бэкенда чата выглядит следующим образом:
Масштабирование (кластеризация) предусматривает запуск дополнительного числа экземпляров бэкенда и распределение приходящей нагрузки между ними. Теоретически количество одновременно запущенных экземпляров Chat Backend неограничено, но запуск более 6 экземпляров не рекомендуется.
Внимание!
Данная версия масштабирования не предоставляет fault tolerance: аварийное отключение slave-узла приведёт к частичной деградации сервиса, а последствием отключения master-узла будет полная остановка работы.
Масштабирование является асимметричным, то есть, нагрузка между серверами распределяется неравномерно. В частности, задачи, относящиеся ко многим сессиям посетителей и операторов, такие как автоназначение чатов, реализуются только на одном из серверов (master); задачи, относящиеся к одной сессии, такие как добавление сообщения в чат, выполняются на домашней slave-узле сессии.
В каждом кластере должен быть один master-узел и не менее одного slave-узла. Master-узел выполняет задачи, которы не могут быть распределены между несколькими узлами, например - автоназначение чатов на операторов. Сесиии операторов и посетителей распределяются по slave-узлам и каждый slave-узел выполняет задачи, относящиеся к сессиям, для которых он является домашним, например, смена статуса оператора или добавление нового сообщения в чат. Стоит отметить, что принципиально ничего не мешает распределять часть сессии на master-узел, но для симметрии, а также чтобы разгрузить master, этого не делается.
Для синхронизации и актуализации данных между серверами осуществляется при помощи очередей сообщений RabbitMQ. Каждый сервер обрабатывает информацию, появившуюся в очереди (например, при добавлении нового сообщения), благодаря чему данные актуализируются.
Настройка RabbitMQ
Предварительным условием для запуска масштабирования является наличие установленного RabbitMQ на сервере Chat Backend. Инструкцию по установке Вы можете найти в официальной документации.
N.B.
При желании Вы также можете добавить административную панель, отображающую текущее состояние сервиса. Это может пригодится для мониторинга. Сделать это Вы можете, выполнив следующую команду:
rabbitmq-plugins enable rabbitmq_management
Перезагрузка сервиса при этом не требуется.
Дополните конфигурационный файл RabbitMQ /etc/rabbitmq/rabbitmq.conf
следующими параметрами:
listeners.tcp.default = <port>
management.tcp.port = <port>
default_user_tags.administrator = true
default_user = <username>
default_pass = <password>
loopback_user = none
Здесь:
-
listeners.tcp.default
- порт прослушивания запросов к RabbitMQ -
management.tcp.port
- порт, по которому предоставляется доступ к административной панели RabbitMQ. Заполняется при наличии соответствующего плагина -
default_user
- имя пользователя RabbitMQ -
default_pass
- пароль пользователя RabbitMQ
Настройка масштабирования
Для запуска масштабирования Вам необходимо изменить конфиграцию nginx. Ниже приведена подробная инструкция.
-
Создайте новый конфигурационный файл в директории
/etc/nginx/sites-available/
для хранения в нём настроек балансировщика нагрузки. -
В созданном файле укажите IP-адреса, на которых будут развёрнуты экземпляры Chat backend. Файл должен иметь следующий вид:
upstream chat-backend { server <IP address 1>:<port 1>; server <IP address 2>:<port 2>; server <IP address 3>:<port 3>; ... server <IP address N>:<port N> }
Значения портов могут совпадать.
-
Сохраните изменения и откройте файл
/etc/nginx/sites-available/webim.conf
. В его начало добавьте следующее:include </path/to/file.conf>
Здесь
</path/to/file.conf>
- путь к ранее созданному файлу. -
В том же файле замените
proxy_pass 127.0.0.1:<port>
наproxy_pass http://chat_backend
в следующих локациях:\/l\/button\.php
\/ws\/
\/l\/(v|o)\/download.*\.(png|gif|jpe?g|svg|webp|pdf|doc)$
\/l\/(v|o)\/download\/.*?([^\/]+)$
\/l\/v\/
/l/o/get-operator-statuses
\/l\/
\/api\/v\d+\/(chats|operators|departments|chat|tariffs|stats|categories)
\/api\/v\d+\/(rt|file|wm_notification|visitor|robot_post_message)
^\/api\/stc-bot\/
Настройка кластера
В параметрах запуска чат-сервера нужно указать:
-
--node_name
- имя узла. Оно должно содержаться в списке узлов, указываемых в конфигурации кластера. В рамках одного кластера нельзя запускать два узла с указанием одного и того же имени. -
--cluster_config
- путь к json-файлу, содержащему конфигурацию кластера вида:{ "cluster_name": "default", "chat_server_node_names": ["master", "slave8270", "slave8271"], "chat_server_master_node_name": "master" }
Конфигурация содержит:
-
cluster_name
- имя кластера -
chat_server_node_names
- список имён всех узлов кластера -
chat_server_master_node_name
- имя выделенного мастер-узла в кластере, выполняющего функции, которые нельзя распределить по разным узлам (например, автоназначение чатов), должно содержаться в спискеchat_server_node_names
Конфигурация должна быть одинаковой для всех узлов в кластере. Для узлов, запускаемых на одном хосте предполагается использовать один и тот же файл, для разных хостов - его копии.
-
Для того, чтобы масштабирование заработало, также необходимо добавить в конфигурационный файл main.ini
следующие параметры:
-
mq_host
- имя / IP-адрес хоста RabbitMQ -
mq_port
- порт подключения к RabbitMQ (значение параметраlisteners.tcp.default
из/etc/rabbitmq/rabbitmq.conf
) -
mq_username
- имя пользователя RabbitMQ (значение параметраdefault_user
из/etc/rabbitmq/rabbitmq.conf
) -
mq_password
- пароль пользователя RabbitMQ (значение параметраdefault_pass
из/etc/rabbitmq/rabbitmq.conf
) -
mq_virtual_host
- значениеname
созданного виртуального хоста на стороне RabbitMQ
Для удобства администрирования рекомендуется добавить параметр mq_node_id_prefix
в дополнительный конфигурационный файл webim_mq.ini
, размещающийся в поддиректории /main.ini.d/
.
Отключение масштабирования Chat Backend
Для отключения масштабирования Chat Backend необходимо совершить следующие действия:
-
Выключить все узлы кластера
-
Убрать из конфигурации nginx настройки, добавленные для включения масштабирования (см. выше)
-
Запустить Chat Backend без параметров масштабирования