|
|
# Обработка записей BigBlueButton через CUPS как сервер очереди и балансировщик нагрузки
|
|
|
|
|
|
## Формулировка задачи
|
|
|
|
|
|
В часы пиковой нагрузки идет одновременно много (допустим, 50) вебинаров на нескольких серверах BigBlueButton.
|
|
|
|
|
|
Каждый сервер имеет определенное количество ресурсов для проведения вебинара (память и процессор), но не имеет ресурсов — дискового пространства — для хранения записей. Также нецелесообразно хранить разные записи на разных серверах.
|
|
|
|
|
|
Во время пиковой нагрузки нельзя занять ресурсы сервера конвертированием записей, однако записи нужны в готовом для использования виде как можно скорее.
|
|
|
|
|
|
## Концепция решения
|
|
|
|
|
|
Выносим обработку записей на отдельные сервер(-ы).
|
|
|
|
|
|
Прошел вебинар — перекачали исходники записи на этот специальный сервер и конвертировали их. Результат конвертации положили на специальный сервер, обслуживающий записи.
|
|
|
|
|
|
Для масштабирования может потребоваться несколько обрабатывающих записи серверов.
|
|
|
|
|
|
## Реализация решения
|
|
|
|
|
|
CUPS многим известен как сервер печати в UNIX-подобных операционных системах, однако его можно использовать как сервер очереди, что мы и делаем.
|
|
|
|
|
|
Вместо принтера у нас обработчик записей, вместо задания печати — исходники записи.
|
|
|
|
|
|
CUPS имеет встроенный функционал, так сказать, кластеризации: может сам распределять задания печати между свободными принтерами, чем мы воспользуемся для распределения заданий обработки записей между несколькими серверами.
|
|
|
|
|
|
Разделяем весь BigBlueButton на следующие сущности:
|
|
|
|
|
|
1. Модуль проведения вебинаров
|
|
|
1. Модуль конвертирования записей
|
|
|
1. Модуль хранения записей
|
|
|
|
|
|
Количество каждой сущности может машстабироваться горизонтально.
|
|
|
|
|
|
Существует и работает центральный сервер CUPS, а также запущен CUPS на каждом модуле.
|
|
|
|
|
|
Инструменты масштабирования и балансировки нагрузки:
|
|
|
|
|
|
1. По одному принтеру на поток выполнения задачи (пока принтер занят, занят и поток)
|
|
|
1. Возможность включения и выключения принтера в CUPS
|
|
|
|
|
|
В веб-интерфейсе центрального CUPS видна картина в целом.
|
|
|
|
|
|
### Процесс обработки
|
|
|
|
|
|
#### На сервере печати
|
|
|
|
|
|
##### Для сбора исходников записей
|
|
|
|
|
|
1. Создается класс (группа) принтеров для сбора исходников записей
|
|
|
1. Сетевой принтер с обработчика записей добавляется в этот центральный 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, добавлен принтер с сервера печати, корень класса принтеров
|
|
|
1. Завершился вебинар
|
|
|
1. BigBlueButton собрал артефакты записи в `/var/bigbluebutton/recording/raw/$meeting_id`
|
|
|
1. BigBlueButton запускает скрипты в `/usr/local/bigbluebutton/core/scripts/post_archive`, в т.ч. наш `20-cups-bbb-copy-raw.rb` (`post-archive_cups-bbb-copy-raw.rb`)
|
|
|
1. Этот скрипт запаковывает каталог `/var/bigbluebutton/recording/raw/$meeting_id` в tar-архив и отправляет на "печать" в CUPS на принтер типа `bbb-copy-raw` (сервер CUPS, с которого "расшарен" принтер, может находиться в другом месте физически и с точки зрения сети, будет выполнена передача потока по сети, а сам сервер передаст полученное задание печати на непосредственно обработчик записи, на котором тоже запущен CUPS)
|
|
|
|
|
|
#### На обработчике записей
|
|
|
|
|
|
##### Прием исходников записей
|
|
|
|
|
|
1. Установлен CUPS
|
|
|
1. Бекенд CUPS `cups-backend-copy-raw.sh` устанавливается в `/usr/lib/cups/backends/bbb-copy-raw`, с правами 0700, чтобы CUPS запускал его от пользователя `root`, а не `lp`
|
|
|
1. Создан принтер типа `bbb-copy-raw` (и добавлен на центральном сервере печати в класс/группу), PPD raw queue, URI принтера имеет вид `bbb-copy-raw://local/var/bigbluebutton/recording/raw`, что означает, что полученные исходники записей будут складываться в `/var/bigbluebutton/recording/raw`
|
|
|
1. CUPS получает задание печати с центрального сервера CUPS
|
|
|
1. Принтер распаковывает tar-архив в нужную директорию, тем самым копируя его содержимое
|
|
|
|
|
|
##### Обработка записей
|
|
|
|
|
|
(пока не реализовано)
|
|
|
|
|
|
1. Бекенд CUPS `cups-backend-build-recording.sh` устанавливается в `/usr/lib/cups/backends/bbb-build-recording`, с правами 0700, чтобы CUPS запускал его от пользователя `root`, а не `lp`
|
|
|
1. Создан принтер(-ы) типа `bbb-build-recording` (и добавлен на центральном сервере печати). Один поток обрбаотки записей — один принтер.
|
|
|
1. На центральный CUPS отправляется задание сборки записи (передать достаточно только ID записи в теле или названии задания), но в качестве принтера указывается принтер типа `bbb-build-recording` с этого узла, что позволяет и запустить задание сборки здесь же, и отразить его в центральном сервере
|
|
|
1. Изнутри CUPS-бекенда `bbb-build-recording` запускается конвертирование записи, задание считается выполненным только по окончанию конвертирования
|
|
|
|
|
|
##### Отправка записей в хранилище
|
|
|
|
|
|
(пока не реализовано)
|
|
|
|
|
|
1. Бекенд CUPS `cups-backend-store.sh` устанавливается в `/usr/lib/cups/backends/bbb-store`, с правами 0700, чтобы CUPS запускал его от пользователя `root`, а не `lp`
|
|
|
1. Создан принтер типа `bbb-store` (и добавлен на центральном сервере печати)
|
|
|
1. На центральный CUPS отправляется задание архивации записи (передать достаточно только ID записи в теле или названии задания), но в качестве принтера указывается принтер типа `bbb-record` с этого узла, что позволяет и запустить задание сборки здесь же, и отразить его в центральном сервере
|
|
|
1. Изнутри CUPS-бекенда `bbb-record` выполняется перемещение результата сборки записи (`/var/bigbluebutton/published/presentation/$meeting_id`) на сервер, хранящий записи, через `mv`/`cp`/`rsync && rm`. Задание печати считается выполненным по окончанию перемещения.
|