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