Слон
Слон - это панель для управления базами 1С, сочетающая в себе функции управления кластером 1С посредством RAS сервера, основные возможности утилиты ibcmd (выгрузка/загрузка dt,cf,cfe, репликацию) и управление резервными копиями, развернутыми на ZFS (через снимки). Представляет из себя конфигурацию на 1С 8.5, способную работать обособленно в docker контейнере (посредством ibsrv).
Длительные операции Слон выполняет фоново, с использованием нового механизма УведомленияКлиента, позволяющего заданию уведомлять пользователя о промежуточных состояниях по мере его выполнения:
Этот механизм позволяет грузить конфигурацию или расширение в несколько баз одновременно.
Изначально Слон разрабатывался именно для управления docker контейнерами с PG, развернутыми на ZFS массиве, для оперативного получения копий баз из снимков. Но по мере наращивания функций работы с базами, переориентирован и на обычный способ подключения к БД. ZFS интересна далеко не каждому, поэтому покажу сначала Слона без неё, а в заключение с ней.
Запуск в контейнере
Слон может работать как на Windows так и на Linux платформе. На Linux ibcmd не может работать с MSSQL, и Слон тоже не будет. Если вам нужен только Postgres, вы можете запустить Слона в docker контейнере, который я для этого приготовил здесь https://github.com/kot-camojiet/1c-single
Создайте docker-compose.yml:
services:
slon:
image: camojiet/1c-single:latest
container_name: slon
ports:
- "8314:8314"
volumes:
- ./fs-data:/fs-data
- ./storage:/storage
security_opt:
- apparmor=unconfined
restart: unless-stopped
environment:
PORT: 8314
TZ: Asia/Vladivostok
Создайте в папке с compose папку с базой и хранилище:
mkdir -p ./fs-data/db-data
mkdir ./storage
Поместите 1Cv8.1CD в ./fs-data/db-data/
Запустите:
docker compose up -d
После запуска контейнера база будет доступна через http на порту 8314.
Основные функции
В настройках, для работы без ZFS достаточно установить пароль, каталог хранилища (там будут храниться dt, cf, dt и временные папки (для ibcmd)) и путь к бинарным файлам платформы (для запуска ibcmd).
Далее, необходимо добавить сервер 1С:

Укажите название, адрес и порт RAS сервера, Администратора сервера и пароль, Администратора кластера и пароль (если есть).
Заблокируйте по умолчанию фоновые задания, чтобы случайно не запустить их во время экспериментов. Установленные по умолчанию параметры будут устанавливаться для создаваемых на этом сервере баз:
Добавьте сервер БД:
Введите необходимые данные для работы с БД:

Укажите сервер БД, сервер 1С, включите считывание данных (необязательно). Слон фоново считывает данных с баз помеченных таким образом, о количестве пользователей и состоянии блокировки пользовательских сеансов. После записи, база готова к подключению. Если база существовала на этом месте, она будет подключена, если нет, то создана.
После подключения базы можете загрузить файлы dt, cf, cfe в хранилище (2), затем загрузить в базу (3,4):
Есть возможность загружать файл по прямой ссылке и ссылке из Nextcloud. Можно загружать файлы (несколько) в облако по ссылке на расшаренную папку (тестировал на Nextcloud 32.0.3)
После загрузки в базе будет гореть бардовым, если база не авторизована:
Заполните пользователя, пароль, запишите. Бардовая рамка должна исчезнуть, если авторизация пройдена.
Допускается загрузка cf или cfe в несколько баз из контекстного меню списка баз:
В случае загрузки в одну базу, параллельное выполнение не имеет смысла, показываю для ознакомления:
Если будет выбрана последовательная загрузка, то запустится одно фоновое задание которое загрузит файл в базы одну за другой. Если параллельная, то на каждую базу будет запущено своё фоновое задание.
Из контекстного меню списка баз можно заблокировать пользовательские сеансы (по одной базе):
Задействовать ibcmd replicate:
Удалить базу:
И снять/установить признак "Считывать данные" для множества баз.
В списке баз отражается информация о блокировке заданий (БС), блокировке сеансов (БС), количестве запущенных приложений "1CV8C" (КП - количество пользователей):
Список установленных расширений доступен на форме базы. Множеству выбранных расширений можно установить параметры,

или удалить их. Удаление всех расширений производится за одну итерацию (с ключом -all), удаление нескольких но не всех - по одной итерации на расширение.
Использование Slon-pg + ZFS
Slon-pg - это docker образ, предназначенный для запуска инстанса PG для 1С в docker контейнере. Он разрабатывался как универсальный инструмент для запуска одиночного PG инстанса, и пары мастер - реплика, через штатный механизм PG. В Слона выведены настройки по запуску мастера и реплики, но в деле испытан только одиночный запуск и в рамках этого материала мы не будем его рассматривать. Исходные файлы для сборки по ссылке https://github.com/kot-camojiet/slon-pg
При заполнении объекта slon-pg, будет запущен инстанс PG данные которого будут расположены на массиве ZFS. На машине с ZFS настраивается sanoid, который обеспечивает создание снимков с нужной периодичностью (например раз в час). Слон может создать клон из выбранного снимка и запустить на этих данных новый инстанс slon-pg на другом порту. Если данные и wal находятся в одном снимке, то копия будет консистентной. Таким образом, мы можем получить копию всего инстанса для получения оперативной копии, для нужд поддержки. При этом, не надо ждать копирования данных и такая копия не занимает место, необходимо только немного подождать, пока PG проиграет журнал транзакций до корректного состояния.
Для того, чтобы это всё заработало, необходима Linux машина с OpenZFS на борту, с настроенным массивом и пользователем, которому доступен целевой датасет, с настроенным доступом через SSH. Слон будет отдавать команды по ssh, обеспечивающие запуск PG и управление ZFS. Если слон располагается на Windows машине, то имейте в виду, что на Windows 2012 R2 нет ssh клиента, а на более новых - есть. Без ssh клиента ничего не получится, как его ставить на старые Windows машины - я не знаю.
ZFS
Создайте массив:
zpool create -o ashift=13 postgres mirror nvme-HP_SSD_EX950_1TB_HBSE45350300040 nvme-HP_SSD_EX950_1TB_HBSE45350300043 log mirror nvme-INTEL_MEMPEK1J016GAL_BTBT84050517016N-part1 nvme-INTEL_MEMPEK1J016GAL_PHBT844300QV016N-part1
В моём случае это зеркало из двух основных дисков + отдельное зеркало для синхронных записей на Optane. Задумка была интересной, но целесообразность под вопросом. Возможно, удачнее расположить на Optane только метаданные. Не будем на этом останавливаться, надеюсь, найдутся товарищи, которым есть что сказать в части развёртывания Postgres на ZFS.
Выделите отдельный датасет:
zfs create postgres/slon
Настройте:
zfs set recordsize=128k postgres/slon
zfs set atime=off postgres/slon
zfs set primarycache=all postgres/slon
zfs set secondarycache=all postgres/slon
zfs set logbias=throughput postgres/slon
zfs set sync=standard postgres/slon
zfs set compression=lz4 postgres/slon
zfs set dnodesize=auto postgres/slon
Экспериментировал с recordsize=8k (32,64) и не увидел особой разницы по сравнению с 128k в тестах того же Гилёва, поэтому оставил большее значение в угоду сжимаемости.
С ZFS возможны различные варианты, позволяющие получить приемлемую производительность с недорогого железа. Чем больше дисков, тем производительнее можно получить массив. Например, 8 10k SAS по 1TB, с двумя недорогими Optane, превратились в приемлемый массив для небольших экспериментов.
Создайте пользователя, сохраните его пароль, он понадобится в дальнейшем:
useradd slon
passwd slon
mkdir /home/slon
chown slon:slon /home/slon
zfs allow -u slon clone,create,destroy,hold,mount,mountpoint,receive,rename,send,snapshot postgres/slon
apt install sudo
Поправьте, если я дал избыточные права.
Мне не удалось без костылей примонтировать под пользователем slon массив в debian. Даёт только root-у, чтобы я не делал. Вышел из положения дополнительными sudo скриптами:
cat > /usr/local/bin/zfsmount.sh << 'EOF'
#!/bin/bash
# Обёртка для безопасного монтирования датасетов slon
DATASET="$1"
# Разрешаем только датасеты внутри postgres/slon/* или storage/slon/*
if [[ "$DATASET" =~ ^(postgres/slon/|storage/slon/) ]]; then
/usr/sbin/zfs mount "$DATASET"
else
echo "Error: you can only mount datasets under postgres/slon/* or storage/slon/*" >&2
exit 1
fi
EOF
chmod +x /usr/local/bin/zfsmount.sh
cat > /usr/local/bin/zfsumount.sh << 'EOF'
#!/bin/bash
# Обёртка для безопасного размонтирования датасетов slon
DATASET="$1"
if [[ "$DATASET" =~ ^(postgres/slon/|storage/slon/) ]]; then
/usr/sbin/zfs unmount "$DATASET"
else
echo "Error: you can only unmount datasets under postgres/slon/* or storage/slon/*" >&2
exit 1
fi
EOF
chmod +x /usr/local/bin/zfsumount.sh
echo "slon ALL=(ALL) NOPASSWD: /usr/local/bin/zfsmount.sh, /usr/local/bin/zfsumount.sh" >> /etc/sudoers
Включите пользователя в группу docker
usermod -aG docker slon
Настройка slon-pg
Заполните в настройках Слона адрес, порт подключения, пользователя.
Введите пароль пользователя slon, который на сервере с ZFS:

Нажмите проверить ещё раз, при успешной установке вы должны увидеть ответ команды uptime на удалённом сервере.
Данный способ работает только с установленной утилитой sshpass на 1С сервере. Если её нет, нужно установить ключ из под серверного пользователя 1С вручную.
Будут созданы подразделы, для оригиналов и клонов (они должны находиться в одном массиве)
~$ zfs list postgres/slon -r
NAME USED AVAIL REFER MOUNTPOINT
postgres/slon 7.33M 802G 25K /postgres/slon
postgres/slon/clon 24K 802G 24K /postgres/slon/clon
postgres/slon/orig 7.28M 802G 25K /postgres/slon/orig
Создайте инстанс PG:

Первая запись будет долгой, пока образ не загрузится.
В результате запустится контейнер с PG, готовый к подключениям:
~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
372e20f0a2b4 camojiet/slon-pg:latest "entrypoint.sh postg…" 9 minutes ago Up 9 minutes 0.0.0.0:5500->5432/tcp, [::]:5500->5432/tcp test
Теперь можно создать базу на этом инстансе PG:
Снимки
Снимки, доступные из базы, это снимки всего PG инстанса. В боевой обстановке, с натравленными sanoid&syncoid на датасет postgres/slon/orig/test, список будет таким:

Не снимаю с syncoid копий, и удаляю свои снимки, чтобы из-за неудалённого снимка не кончилось место на ZFS.
Сделайте снимок:
Теперь можно получить копию базы из снимка ZFS:
На этом этапе, можно поменять имя базы клона, сервер 1С на отладочный (он поменяется сам, если указан в настройках отладочный сервер):
Появится база и фоновое задание, отслеживающее факт готовности клона после запуска:
После уведомления о готовности базы, клоне можно работать, снять копию в dt или реплицировать на другой инстанс.
Удалите клон после того, как закончите с ним работу:
Это необходимо для того, чтобы освободить снимок, который не будет удалён после устаревания и может занять всё место на диске, если про него забыть. Также будет удалён родительский PG инстанс, который потребляет ресурсы сервера.
Клонируется всегда весь инстанс, но интерфейс построен так, что как-будто бы делается копия только одной базы. Сделать клон инстанса можно и из формы объекта slon-pg, но в обоих случаях можно обращаться ко всем базам инстанса.







