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

Масштабирование 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. Ниже приведена подробная инструкция.

  1. Создайте новый конфигурационный файл в директории /etc/nginx/sites-available/ для хранения в нём настроек балансировщика нагрузки.

  2. В созданном файле укажите 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>
    }
    

    Значения портов могут совпадать.

  3. Сохраните изменения и откройте файл /etc/nginx/sites-available/webim.conf. В его начало добавьте следующее:

    include </path/to/file.conf>
    

    Здесь </path/to/file.conf> - путь к ранее созданному файлу.

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

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

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

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