Перейти к содержанию

Масштабирование 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 необходимо совершить следующие действия:

  1. Выключить все узлы кластера

  2. Убрать из конфигурации nginx настройки, добавленные для включения масштабирования (см. выше)

  3. Запустить Chat Backend без параметров масштабирования