Масштабирование v1
В данной статье описываются принцип работы и настройка масштабирования на Webim Server версии 10.3.
Масштабирование Webim Chat Backend
Принципиально схема масштабирования бэкенда чата выглядит следующим образом:
Масштабирование (кластеризация) предусматривает запуск дополнительного экземпляра Chat Backend и распределение приходящей нагрузки между ними асимметрично.
В каждом кластере должен быть один master-узел и один slave-узел. Master-узел выполняет задачи, которы не могут быть распределены между несколькими узлами, например - автоназначение чатов на операторов. Сесиии операторов и посетителей перенаправляются на slave-узел, который выполняет задачи, относящиеся к сессиям, например, смена статуса оператора или добавление нового сообщения в чат. Стоит отметить, что принципиально ничего не мешает распределять часть сессии на master-узел, но для симметрии, а также чтобы разгрузить master, это не делается.
Внимание!
Данная версия масштабирования не предоставляет fault tolerance: аварийное отключение slave-узла приведёт к частичной деградации сервиса, а последствием отключения master-узла будет полная остановка работы.
Для синхронизации и актуализации данных между серверами используются очереди сообщений Rabbit MQ. Каждый сервер обрабатывает информацию, появившуюся в очереди (например, при добавлении нового сообщения), благодаря чему данные актуализируются.
Настройка масштабирования
Для запуска масштабирования на сервере nginx в конфигурационный файл (/etc/nginx/sites-available/webim.conf
) необходимо добавить следующее:
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;
}
и
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;
}
Настройка кластера
В параметрах запуска чат-сервера нужно указать
-
--node_name
- имя узла. Оно должно содержаться в списке узлов, указываемых в конфигурации кластера. В рамках одного кластера нельзя запускать два узла с указанием одного и того же имени. -
--cluster_config
- путь к json-файлу, содержащему конфигурацию кластера вида:{ "cluster_name": "default", "chat_server_node_names": ["master", "slave"], "chat_server_master_node_name": "master" }
Конфигурация содержит:
-
cluster_name
- имя кластера -
chat_server_node_names
- список имён узлов кластера -
chat_server_master_node_name
- имя выделенного мастер-узла в кластере, выполняющего функции, которые нельзя распределить по разным узлам (например, автоназначение чатов), должно содержаться в спискеchat_server_node_names
У серверов, входящих в один кластер Webim Chat Backend, все конфигурационные файлы должны быть абсолютно одинаковыми. При этом у них должны отличаться значения параметра
multinode_mode
:--multinode_mode=master (для master сервера) --multinode_mode=slave (для slave сервера)
-
Для того, чтобы масштабирование заработало, также необходимо добавить в конфигурационный файл main.ini
следующие параметры:
-
mq_host
(имя хоста RabbitMQ) -
mq_port
(порт подключения к RabbitMQ) -
mq_username
(имя пользователя RabbitMQ) -
mq_password
(пароль пользователя RabbitMQ) -
mq_virtual_host
(значениеname
созданного виртуального хоста на стороне RabbitMQ)
Для удобства администрирования рекомендуется добавить параметр mq_node_id_prefix
в дополнительный конфигурационный файл webim_mq.ini
, размещающийся в поддиректории /main.ini.d/
.
Отключение масштабирования Chat Backend
Для отключения масштабирования Chat Backend необходимо совершить следующие действия:
-
Выключить все узлы кластера
-
Убрать из конфигурации nginx настройки, добавленные для включения масштабирования (см. выше)
-
Запустить Chat Backend без параметров масштабирования