Describe architecture in README

master
Mikhail Novosyolov 3 years ago
parent 7956ca96a0
commit d62d91395f

@ -1,3 +1,6 @@
install:
mkdir -p $(DESTDIR)/usr/lib/cups/backends
install -m0700 cups-backend-copy-raw.sh /usr/lib/cups/backends/bbb-copy-raw
mkdir -p $(DESTDIR)/usr/local/bigbluebutton/core/scripts/post_archive
install -m0755 post-archive_cups-bbb-copy-raw.rb $(DESTDIR)/usr/local/bigbluebutton/core/scripts/post_archive/20-cups-bbb-copy-raw.rb

@ -22,4 +22,78 @@ CUPS многим известен как сервер печати в UNIX-по
Вместо принтера у нас обработчик записей, вместо задания печати ­— исходники записи.
CUPS имеет встроенный функционал, так сказать, кластеризации: может сам распределять задания печати между свободными принтерами, чем мы воспользуемся для распределения заданий обрбаотки записей между несколькими серверами.
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`. Задание печати считается выполненным по окончанию перемещения.

@ -83,8 +83,6 @@ fi
# Examples of valid URIs:
# - local/srv/container2/raw
# it means copy from /var/bigbluebutton/recording/raw/$meeting_id to /srv/container2/raw/$meeting_id
# - ssh/port/user@host/remote_path (has not been tested and used!)
# it means rsync -av -e "ssh -p $port" /var/bigbluebutton/recording/raw/$meeting_id user@host:/remote_path/
DEVICE_URI="$(echo "$DEVICE_URI" | sed -e 's,^bbb-copy-raw://,,' -e 's,^bbb-copy-raw:/,,')"
case "$DEVICE_URI" in
local/* )
@ -98,17 +96,26 @@ case "$DEVICE_URI" in
fi
mkdir -p "$target_dir"/"$jobtitle"
dd if="$input" | tar -C "$target_dir"/"$jobtitle" xf -
echo > "$target_dir"/"$jobtitle"/.cups.copied_raw
chown -R bigbluebutton:bigbluebutton "$target_dir"/"$jobtitle"
# TODO: rebuild recordings via CUPS instead of bbb worker in ruby
#if [ "$target_dir" = /var/bigbluebutton/recording/raw ]; then
# bbb-record --rebuild "$jobtitle"
#fi
;;
ssh/* )
ssh_port="$(echo "$DEVICE_URI" | awk -F '/' '{print $2}')"
ssh_userhost="$(echo "$DEVICE_URI" | awk -F '/' '{print $3}')"
# ssh/port/user@host/remote_path/dir1/dir2 -> remote_path/dir1/dir2
# https://stackoverflow.com/a/49130247
ssh_remote_path="$(echo "$DEVICE_URI" | awk -F '/' '{for(i=4; i<=NF; ++i) printf "%s/", $i;}')"
# TODO: run as sudo -u <special user> ssh ...
ssh -p "$ssh_port" "$ssh_userhost" mkdir -p "$ssh_remote_path"/"$jobtitle"
dd if="$input" | ssh -p "$ssh_port" "$ssh_userhost" tar -C "$ssh_remote_path"/"$jobtitle" xf -
;;
# XXX ssh probably makes no sense here, comment it for now
# ssh can make sense if we use ionotify on directory where new recordings appear and run building task
# but we run CUPS on every wndpoint, so ssh seems to not make any sense
# ssh/* )
# ssh_port="$(echo "$DEVICE_URI" | awk -F '/' '{print $2}')"
# ssh_userhost="$(echo "$DEVICE_URI" | awk -F '/' '{print $3}')"
# # ssh/port/user@host/remote_path/dir1/dir2 -> remote_path/dir1/dir2
# # https://stackoverflow.com/a/49130247
# ssh_remote_path="$(echo "$DEVICE_URI" | awk -F '/' '{for(i=4; i<=NF; ++i) printf "%s/", $i;}')"
# # TODO: run as sudo -u <special user> ssh ...
# ssh -p "$ssh_port" "$ssh_userhost" mkdir -p "$ssh_remote_path"/"$jobtitle"
# dd if="$input" | ssh -p "$ssh_port" "$ssh_userhost" tar -C "$ssh_remote_path"/"$jobtitle" xf -
# ;;
* )
echo CRIT: Device URI is not supported! 1>&1
exit "$CUPS_BACKEND_FAILED"

Loading…
Cancel
Save