Skip to main content

Слон

Слон - это панель для управления базами 1С, сочетающая в себе функции управления кластером 1С посредством RAS сервера, основные возможности утилиты ibcmd (выгрузка/загрузка dt,cf,cfe, репликацию) и управление резервными копиями, развернутыми на ZFS (через снимки). Представляет из себя конфигурацию на 1С 8.5, способную работать обособленно в docker контейнере (посредством ibsrv). 

Длительные операции Слон выполняет фоново, с использованием нового механизма УведомленияКлиента, позволяющего заданию уведомлять пользователя о промежуточных состояниях по мере его выполнения:
image.png
Этот механизм позволяет грузить конфигурацию или расширение в несколько баз одновременно. 

Изначально Слон разрабатывался именно для управления 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.

Основные функции

image.png

В настройках, для работы без ZFS достаточно установить пароль, каталог хранилища (там будут храниться dt, cf, dt и временные папки (для ibcmd)) и путь к бинарным файлам платформы (для запуска ibcmd).

image.png

Далее, необходимо добавить сервер 1С:

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

image.png

Введите необходимые данные для работы с БД:

image.png
Теперь можете добавить базу:

image.png
Укажите сервер БД, сервер 1С, включите считывание данных (необязательно). Слон фоново считывает данных с баз помеченных таким образом, о количестве пользователей и состоянии блокировки пользовательских сеансов. После записи, база готова к подключению. Если база существовала на этом месте, она будет подключена, если нет, то создана.

После подключения базы можете загрузить файлы dt, cf, cfe в хранилище (2), затем загрузить в базу (3,4):image.png
Есть возможность загружать файл по прямой ссылке и ссылке из Nextcloud. Можно загружать файлы (несколько) в облако по ссылке на расшаренную папку (тестировал на Nextcloud 32.0.3)

После загрузки в базе будет гореть бардовым, если база не авторизована:Заполните пользователя, пароль, запишите. Бардовая рамка должна исчезнуть, если авторизация пройдена.

Допускается загрузка cf или cfe в несколько баз из контекстного меню списка баз:image.png
В случае загрузки в одну базу, параллельное выполнение не имеет смысла, показываю для ознакомления:
image.png
Если будет выбрана последовательная загрузка, то запустится одно фоновое задание которое загрузит файл в базы одну за другой. Если параллельная, то на каждую базу будет запущено своё фоновое задание.

Из контекстного меню списка баз можно заблокировать пользовательские сеансы (по одной базе):
image.png
Задействовать ibcmd replicate:image.png
Удалить базу:image.png
И снять/установить признак "Считывать данные" для множества баз.
В списке баз отражается информация о блокировке заданий (БС), блокировке сеансов (БС), количестве запущенных приложений "1CV8C" (КП - количество пользователей):

image.png

Список установленных расширений доступен на форме базы. Множеству выбранных расширений можно установить параметры,image.png
image.png
или удалить их. Удаление всех расширений производится за одну итерацию (с ключом -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

Включите пользователя в группу docker

usermod -aG docker slon

Настройка slon-pg

Заполните в настройках Слона адрес, порт подключения, пользователя.

image.png

Введите пароль пользователя slon, который на сервере с ZFS:

image.png
Нажмите проверить ещё раз, при успешной установке вы должны увидеть ответ команды uptime на удалённом сервере. 

Данный способ работает только с установленной утилитой sshpass на 1С сервере. Если её нет, нужно установить ключ из под серверного пользователя 1С вручную.

Создайте массив ZFS в Слоне:
image.png
image.png

Будут созданы подразделы, для оригиналов и клонов (они должны находиться в одном массиве)

~$ 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:
image.png
image.png
Первая запись будет долгой, пока образ не загрузится.
В результате запустится контейнер с 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:
image.png

Снимки

Снимки, доступные из базы, это снимки всего PG инстанса. В боевой обстановке, с натравленными sanoid&syncoid на датасет postgres/slon/orig/test, список будет таким:

image.png
Не снимаю с syncoid копий, и удаляю свои снимки, чтобы из-за неудалённого снимка не кончилось место на ZFS.

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

Клонируется всегда весь инстанс, но интерфейс построен так, что как-будто бы делается копия только одной базы. Сделать клон инстанса можно и из формы объекта slon-pg, но в обоих случаях можно обращаться ко всем базам инстанса.