You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

9.6 KiB

Обработка записей BigBlueButton через CUPS как сервер очереди и балансировщик нагрузки

Формулировка задачи

В часы пиковой нагрузки идет одновременно много (допустим, 50) вебинаров на нескольких серверах BigBlueButton.

Каждый сервер имеет определенное количество ресурсов для проведения вебинара (память и процессор), но не имеет ресурсов — дискового пространства — для хранения записей. Также нецелесообразно хранить разные записи на разных серверах.

Во время пиковой нагрузки нельзя занять ресурсы сервера конвертированием записей, однако записи нужны в готовом для использования виде как можно скорее.

Концепция решения

Выносим обработку записей на отдельные сервер(-ы).

Прошел вебинар — перекачали исходники записи на этот специальный сервер и конвертировали их. Результат конвертации положили на специальный сервер, обслуживающий записи.

Для масштабирования может потребоваться несколько обрабатывающих записи серверов.

Реализация решения

CUPS многим известен как сервер печати в UNIX-подобных операционных системах, однако его можно использовать как сервер очереди, что мы и делаем.

Вместо принтера у нас обработчик записей, вместо задания печати ­— исходники записи.

CUPS имеет встроенный функционал, так сказать, кластеризации: может сам распределять задания печати между свободными принтерами, чем мы воспользуемся для распределения заданий обработки записей между несколькими серверами.

Разделяем весь BigBlueButton на следующие сущности:

  1. Модуль проведения вебинаров
  2. Модуль конвертирования записей
  3. Модуль хранения записей

Количество каждой сущности может машстабироваться горизонтально.

Существует и работает центральный сервер CUPS, а также запущен CUPS на каждом модуле.

Инструменты масштабирования и балансировки нагрузки:

  1. По одному принтеру на поток выполнения задачи (пока принтер занят, занят и поток)
  2. Возможность включения и выключения принтера в CUPS

В веб-интерфейсе центрального CUPS видна картина в целом.

Процесс обработки

На сервере печати

Для сбора исходников записей
  1. Создается класс (группа) принтеров для сбора исходников записей
  2. Сетевой принтер с обработчика записей добавляется в этот центральный CUPS (ipps://ip-адрес-обработчика-записей:631/printer-name)
Для конвертирования записей

(пока не реализовано)

  1. Каждый принтер типа bbb-build-recording (по одному принтеру с каждого обработчика записей) добавляется в этот центральный CUPS (ipps://ip-адрес-обработчика-записей:631/printer-name)
Для отправки записей в хранилище

(пока не реализовано)

  1. Каждый принтер типа bbb-store (по одному принтеру с каждого обработчика записей) добавляется в этот центральный CUPS (ipps://ip-адрес-обработчика-записей:631/printer-name)

На сервере проведения вебинаров:

  1. Установлен CUPS, добавлен принтер с сервера печати, корень класса принтеров
  2. Завершился вебинар
  3. BigBlueButton собрал артефакты записи в /var/bigbluebutton/recording/raw/$meeting_id
  4. BigBlueButton запускает скрипты в /usr/local/bigbluebutton/core/scripts/post_archive, в т.ч. наш 20-cups-bbb-copy-raw.rb (post-archive_cups-bbb-copy-raw.rb)
  5. Этот скрипт запаковывает каталог /var/bigbluebutton/recording/raw/$meeting_id в tar-архив и отправляет на "печать" в CUPS на принтер типа bbb-copy-raw (сервер CUPS, с которого "расшарен" принтер, может находиться в другом месте физически и с точки зрения сети, будет выполнена передача потока по сети, а сам сервер передаст полученное задание печати на непосредственно обработчик записи, на котором тоже запущен CUPS)

На обработчике записей

Прием исходников записей
  1. Установлен CUPS
  2. Бекенд CUPS cups-backend-copy-raw.sh устанавливается в /usr/lib/cups/backends/bbb-copy-raw, с правами 0700, чтобы CUPS запускал его от пользователя root, а не lp
  3. Создан принтер типа bbb-copy-raw (и добавлен на центральном сервере печати в класс/группу), PPD raw queue, URI принтера имеет вид bbb-copy-raw://local/var/bigbluebutton/recording/raw, что означает, что полученные исходники записей будут складываться в /var/bigbluebutton/recording/raw
  4. CUPS получает задание печати с центрального сервера CUPS
  5. Принтер распаковывает tar-архив в нужную директорию, тем самым копируя его содержимое
Обработка записей

(пока не реализовано)

  1. Бекенд CUPS cups-backend-build-recording.sh устанавливается в /usr/lib/cups/backends/bbb-build-recording, с правами 0700, чтобы CUPS запускал его от пользователя root, а не lp
  2. Создан принтер(-ы) типа bbb-build-recording (и добавлен на центральном сервере печати). Один поток обрбаотки записей — один принтер.
  3. На центральный CUPS отправляется задание сборки записи (передать достаточно только ID записи в теле или названии задания), но в качестве принтера указывается принтер типа bbb-build-recording с этого узла, что позволяет и запустить задание сборки здесь же, и отразить его в центральном сервере
  4. Изнутри CUPS-бекенда bbb-build-recording запускается конвертирование записи, задание считается выполненным только по окончанию конвертирования
Отправка записей в хранилище

(пока не реализовано)

  1. Бекенд CUPS cups-backend-store.sh устанавливается в /usr/lib/cups/backends/bbb-store, с правами 0700, чтобы CUPS запускал его от пользователя root, а не lp
  2. Создан принтер типа bbb-store (и добавлен на центральном сервере печати)
  3. На центральный CUPS отправляется задание архивации записи (передать достаточно только ID записи в теле или названии задания), но в качестве принтера указывается принтер типа bbb-record с этого узла, что позволяет и запустить задание сборки здесь же, и отразить его в центральном сервере
  4. Изнутри CUPS-бекенда bbb-record выполняется перемещение результата сборки записи (/var/bigbluebutton/published/presentation/$meeting_id) на сервер, хранящий записи, через mv/cp/rsync && rm. Задание печати считается выполненным по окончанию перемещения.