Перейти до основного вмісту

Розширення каталогу з архівом на декілька дисків за допомогою MergerFS

Використовуйте MergerFS лише якщо не можете заздалегідь спланувати дисковий масив

Ми рекомендуємо заздалегідь планувати простір під архів і для великих обсягів даних використовувати спеціальні технології, такі як ZFS, які дозволяють рівномірно балансувати дані по дисках, мають систему відмовостійкості і можуть без проблем розширювати масиви даних на десятки дисків і сотні терабайт даних.

Проблема

Ви запустили Yucca в базовій конфігурації з архівом на диску із системою, з часом кількість камер і архіву збільшилася і поточного диска вже не вистачає. Можна додати в систему ще один або декілька дисків і рівномірно розподілити зберігання архіву по них – це потребуватиме зупинки Yucca, створення дискового масиву, перенесення всіх даних. У цьому випадку сервіс може бути недоступний кілька годин, що неприпустимо.

Рішення

Якщо ви хочете поступово розширювати каталог для зберігання архіву, додаючи додаткові диски, але без використання RAID технологій, на кшталт ZFS або mdadm, і не перебудовувати всю інфраструктуру, можна використовувати об'єднані файлові системи – Union filesystem.

Є кілька рішень у цьому сегменті, але ми зупинимося на mergerfs і далі все буде саме в її контексті. Порівняння mergerfs з іншими рішеннями доступне тут.

mergerfs – це об'єднана файлова система, призначена для спрощення зберігання та керування файлами на численних звичайних пристроях зберігання, вона схожа на mhddfs, UnionFS і Aufs. Більше подробиць ви можете знайти в офіційному репозиторії проєкту – https://github.com/trapexit/mergerfs.

mergerfs, грубо кажучи, створює віртуальний каталог, під яким може знаходитися кілька реальних каталогів на різних дисках з різними файловими системами, на кшталт ext4 чи XFS. mergerfs не розбиває файли на частини, вони повністю з усіма метаданими зберігаються в одному з підкаталогів:

A + B = C
/disk1 /disk2 /merged
| | |
+-- /dir1 +-- /dir1 +-- /dir1
| | | | | |
| +-- file1 | +-- file2 | +-- file1
| | +-- file3 | +-- file2
+-- /dir2 | | +-- file3
| | +-- /dir3 |
| +-- file4 | +-- /dir2
| +-- file5 | |
+-- file6 | +-- file4
|
+-- /dir3
| |
| +-- file5
|
+-- file6

Плюси

  • Легко розширювати простір, додаючи нові диски;
  • Легко налаштувати, mergerfs – файлова система простору користувача, тому ви можете встановити її як програму на будь-який Linux;
  • Немає спеціальних вимог до об'єднуваних каталогів, це можуть бути диски з різним обсягом, файловими системами або навіть мережеві папки;
  • Не потребує перебудови всієї інфраструктури.

Мінуси

  • Немає балансування навантаження – навантаження на одні диски може бути вищим ніж на інші, як наслідок, архів з одних камер може віддаватися повільніше ніж з інших;
  • Немає надлишковості, відмова диска спричинить повну втрату даних.

Встановлення

Інструкція зі встановлення є в репозиторії.

Примітка

Якщо менеджер пакетів вашого дистрибутива містить mergerfs, перевірте, чи актуальна його версія. Якщо версія застаріла, рекомендується використовувати останній випуск, знайдений на сторінці. Подробиці для поширених дистрибутивів наведено нижче.

Описані нижче дії виконувалися на Ubuntu 22.04, mergerfs був встановлений через deb-пакет з репозиторію.

Для openSUSE є репозиторій в OBS з останніми версіями.

Налаштування

У прикладі віртуальна машина з диском на 20 гігабайт і двома додатковими дисками на 10 гігабайт:

# df -h | grep -v -E "(tmpfs|overlay)"
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 4.5G 14G 26% /
/dev/sda15 253M 142K 252M 1% /boot/efi
/dev/sdb 9.8G 28K 9.3G 1% /mnt/HC_Volume_100511911
/dev/sdc 9.8G 28K 9.3G 1% /mnt/HC_Volume_100511912

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 19.1G 0 disk
├─sda1 8:1 0 18.8G 0 part /
├─sda14 8:14 0 1M 0 part
└─sda15 8:15 0 256M 0 part /boot/efi
sdb 8:16 0 10G 0 disk /mnt/HC_Volume_100511911
sdc 8:32 0 10G 0 disk /mnt/HC_Volume_100511912

На сервері працює Yucca, додано 6 камер з архівом:

cat /opt/yucca/yucca.toml | grep "alloc_dir ="
alloc_dir = "/opt/yucca/data/alloc"

Дані в архів успішно записуються:

# tree /opt/yucca/data/alloc/ | head
/opt/yucca/data/alloc/
├── 2
│ ├── archive
│ │ └── 2024
│ │ └── 03
│ │ └── 27
│ │ ├── 15.dvr
│ │ └── 15.ranges
│ ├── logs
│ │ └── ffmpeg.log
│ └── segment
...

Тепер всередині точок монтування з нашими додатковими дисками створимо каталог, який ми примонтуємо, і призначимо права, щоб Yucca могла писати туди:

mkdir -p /mnt/HC_Volume_100511911/yucca
mkdir -p /mnt/HC_Volume_100511912/yucca
chown yucca:yucca /mnt/HC_Volume_100511911/yucca
chown yucca:yucca /mnt/HC_Volume_100511912/yucca

Створюємо каталог, в який ми будемо здійснювати монтування:

mkdir -p /mnt/yucca_mergerfs

Монтуємо об'єднаний том:

mergerfs -o fsname=mergerfs,cache.files=partial,dropcacheonclose=true,category.create=mfs,moveonenospc=true,minfreespace=20G /mnt/HC_Volume_100511911/yucca:/mnt/HC_Volume_100511912/yucca:/opt/yucca/data/alloc /mnt/yucca_mergerfs

Про значення всіх параметрів можна прочитати в офіційній документації. Перевіряємо, що том змонтований:

Зауважте

Підсумковий том має розмір, що дорівнює сумі всіх об'єднаних томів.

# df -h | grep -v -E "(tmpfs|overlay)"
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 5.2G 13G 30% /
/dev/sda15 253M 142K 252M 1% /boot/efi
/dev/sdb 9.8G 28K 9.3G 1% /mnt/HC_Volume_100511911
/dev/sdc 9.8G 28K 9.3G 1% /mnt/HC_Volume_100511912
mnt/HC_Volume_100511911/yucca:mnt/HC_Volume_100511912/yucca:opt/yucca/data/alloc 38G 5.2G 31G 15% /mnt/yucca_mergerfs

Перевіряємо, що в каталогах /mnt/yucca_mergerfs та /opt/yucca/data/alloc однаковий набір файлів:

ls /mnt/yucca_mergerfs/
2 3 4 5 6 8

ls /opt/yucca/data/alloc/
2 3 4 5 6 8

Тепер, за допомогою будь-якого текстового редактора, змінюємо параметр alloc_dir:

# sed -i 's|/opt/yucca/data/alloc|/mnt/yucca_mergerfs|' /opt/yucca/yucca.toml
# cat /opt/yucca/yucca.toml | grep "alloc_dir ="
alloc_dir = "/mnt/yucca_mergerfs"

Перезапускаємо сервер Yucca і перевіряємо, що все гаразд:

systemctl restart yucca
systemctl status yucca

Yucca пише сегменти годинними відрізками, отже на нових дисках /mnt/HC_Volume_100511911/yucca та /mnt/HC_Volume_100511912/yucca дані повинні з'явитися лише з настанням нової години.

root@ubuntu-2gb-fsn1-1:~# tree /mnt/HC_Volume_100511911/yucca/ | head
/mnt/HC_Volume_100511911/yucca/
├── 2
│ ├── archive
│ └── logs
│ └── ffmpeg.log
├── 3
│ ├── archive
│ │ └── 2024
│ │ └── 03
│ │ └── 27
root@ubuntu-2gb-fsn1-1:~# tree /mnt/HC_Volume_100511912/yucca/ | head
/mnt/HC_Volume_100511912/yucca/
├── 2
│ ├── archive
│ │ └── 2024
│ │ └── 03
│ │ └── 27
│ │ ├── 16.dvr
│ │ └── 16.ranges
│ ├── logs
│ └── segment

Щоб об'єднаний каталог монтувався при перезавантаженні системи, додаємо запис у /etc/fstab:

# yucca mergerfs
/mnt/HC_Volume_100511911/yucca:/mnt/HC_Volume_100511912/yucca:/opt/yucca/data/alloc /mnt/yucca_mergerfs mergerfs cache.files=partial,dropcacheonclose=true,category.create=mfs,moveonenospc=true,minfreespace=20G 0 0

Перевіряємо, що немає помилок:

mount -a

Перезавантажуємо систему для перевірки.

Висновок

Ми не тестували mergerfs під великими навантаженнями чи в інших виняткових ситуаціях, але можемо сказати, що, в загальному випадку, все працює стабільно і проблем не спостерігається. Якщо проблеми все ж виникли, зверніться до трекера проєкту, там же ви можете фінансово підтримати розробників.