Ana içeriğe geç

MergerFS ile arşiv dizinini birden fazla diske genişletme

MergerFS'i yalnızca disk dizisini önceden planlayamıyorsanız kullanın

Arşiv için gereken alanı önceden planlamanızı ve büyük veri hacimleri için verileri diskler arasında dengeli şekilde dağıtan, hata toleransına sahip olan ve düzinelerce diske, yüzlerce terabayt veriye sorunsuzca ölçeklenebilen ZFS gibi özel teknolojileri kullanmanızı öneririz.

Sorun

Yucca'yı sistemin bulunduğu diskte arşivle birlikte temel yapılandırmada başlattınız, zamanla kamera ve arşiv sayısı arttı ve mevcut disk artık yetersiz kaldı. Sisteme bir veya birden fazla disk ekleyip arşiv depolamasını bunlar arasında eşit şekilde dağıtabilirsiniz – ancak bu, Yucca'nın durdurulmasını, bir disk dizisi oluşturulmasını ve tüm verilerin taşınmasını gerektirir. Bu durumda hizmet birkaç saat kullanılamaz hale gelebilir, bu ise kabul edilemez.

Çözüm

Arşiv depolamak için kullanılan dizini, ZFS veya mdadm gibi RAID teknolojilerini kullanmadan ve tüm altyapıyı yeniden kurmadan, ek diskler ekleyerek kademeli olarak genişletmek istiyorsanız, birleştirilmiş bir dosya sistemi (union filesystem) kullanabilirsiniz.

Bu alanda birkaç çözüm bulunur, ancak biz mergerfs üzerinde duracağız ve aşağıdaki her şey onun bağlamında olacak. mergerfs'in diğer çözümlerle karşılaştırması burada mevcuttur.

mergerfs, birçok sıradan depolama aygıtında dosyaların saklanmasını ve yönetimini basitleştirmek için tasarlanmış birleştirilmiş bir dosya sistemidir; mhddfs, UnionFS ve Aufs'a benzer. Daha fazla ayrıntıyı projenin resmi deposunda bulabilirsiniz – https://github.com/trapexit/mergerfs.

Basitçe söylemek gerekirse, mergerfs, ext4 veya XFS gibi farklı dosya sistemlerine sahip farklı disklerdeki birden fazla gerçek dizini kapsayabilen sanal bir dizin oluşturur. mergerfs dosyaları parçalara ayırmaz – tüm meta verileriyle birlikte tam olarak alt dizinlerden birinde saklanırlar:

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

Artıları

  • Yeni diskler ekleyerek alanı genişletmek kolaydır;
  • Kurulumu kolaydır – mergerfs kullanıcı alanında çalışan bir dosya sistemidir, bu nedenle onu herhangi bir Linux üzerine sıradan bir program gibi kurabilirsiniz;
  • Birleştirilecek dizinler için özel bir gereksinim yoktur – farklı boyutlarda disk, farklı dosya sistemi veya hatta ağ paylaşımları olabilirler;
  • Tüm altyapının yeniden kurulmasını gerektirmez.

Eksileri

  • Yük dengelemesi yoktur – bazı disklerdeki yük diğerlerinden daha yüksek olabilir, bunun sonucunda bazı kameraların arşivi diğerlerinden daha yavaş sunulabilir;
  • Yedeklilik yoktur – bir disk arızası tüm verilerin kaybına yol açar.

Kurulum

Kurulum talimatları depoda mevcuttur.

Not

Dağıtımınızın paket yöneticisi mergerfs'i içeriyorsa, sürümünün güncel olup olmadığını kontrol edin. Sürüm eskiyse, sayfada bulunan en son sürümü kullanmanızı öneririz. Yaygın dağıtımlar için ayrıntılar aşağıda verilmiştir.

Aşağıda açıklanan adımlar Ubuntu 22.04 üzerinde gerçekleştirildi, mergerfs depodaki deb paketi ile kuruldu.

openSUSE için en son sürümleri içeren bir OBS deposu mevcuttur.

Yapılandırma

Bu örnekte, 20 gigabaytlık bir diske ve iki adet ek 10 gigabaytlık diske sahip bir sanal makine kullanılmıştır:

# 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
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

Sunucuda Yucca çalışıyor, arşivli 6 kamera eklendi:

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

Veriler arşive başarıyla yazılıyor:

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

Şimdi ek disklerimizin bağlama noktaları içinde, bağlayacağımız bir dizin oluşturup Yucca'nın yazabilmesi için izinlerini ayarlayalım:

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

Birleştirilmiş birimi bağlayacağımız dizini oluşturalım:

mkdir -p /mnt/yucca_mergerfs

Birleştirilmiş birimi bağlayalım:

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

Tüm parametrelerin anlamını resmi dokümantasyonda okuyabilirsiniz. Birimin bağlandığını kontrol edelim:

Not

Elde edilen birimin boyutu, birleştirilen tüm birimlerin toplamına eşittir.

# 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 ve /opt/yucca/data/alloc dizinlerinde aynı dosya kümesinin bulunduğunu kontrol edelim:

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

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

Şimdi, herhangi bir metin düzenleyici ile alloc_dir parametresini değiştirin:

# 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 sunucusunu yeniden başlatın ve her şeyin yolunda olduğunu kontrol edin:

systemctl restart yucca
systemctl status yucca

Yucca segmentleri saatlik parçalar halinde yazar, bu nedenle yeni disklerdeki /mnt/HC_Volume_100511911/yucca ve /mnt/HC_Volume_100511912/yucca verileri yalnızca bir sonraki saat başladığında görünecektir.

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

Birleştirilmiş dizinin sistem yeniden başlatıldığında bağlanması için /etc/fstab dosyasına bir kayıt ekleyin:

# 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

Hata olmadığını kontrol edin:

mount -a

Kontrol etmek için sistemi yeniden başlatın.

Sonuç

mergerfs'i yüksek yük altında veya diğer istisnai durumlarda test etmedik, ancak genel olarak her şeyin kararlı çalıştığını ve herhangi bir sorun gözlenmediğini söyleyebiliriz. Yine de sorunla karşılaşırsanız, projenin izleyicisine başvurun; orada geliştiricileri maddi olarak destekleyebilirsiniz.