GlusterFS yazılım tabanlı opensource NAS çözümüdür. Bu yazımda 3 Server’dan oluşan bir Cluster kuracağız. İşletim sistemi olarak Ubuntu 20.04 kullanacağım. Gün sonunda belirlediğimiz bir dizin veya dizinler 3 sunucuda da eş zamanlı olarak senkronize olacak. Bunu yüksek erişilebilirlik (High Availability) için yapıyoruz.

GlusterFS’in önerilen kullanımı için Ubuntu üzerinde ayrı bir disk tanımladım. Eğer root partition’a brick yapmaya çalışırsanız alacağınız uyarı aşağıdaki gibi olacaktır. Bu uyarıyı “force” komutuyla geçebiliyorsunuz fakat önerilen bir kullanım değil.

It is recommended that you don’t use the system’s root partition for storage backend. Or use ‘force’ at the end of the command if you want to override this behavior.

3 sunucuda da disk yapıları aynıdır. Ayrı bir ikinci disk bulunmaktadır.

vda                       252:0    0  100G  0 disk 
├─vda1                    252:1    0    1M  0 part 
├─vda2                    252:2    0  1.5G  0 part /boot
└─vda3                    252:3    0 98.5G  0 part 
  └─ubuntu--vg-ubuntu--lv 253:0    0 98.5G  0 lvm  /
vdb                       252:16   0    2T  0 disk 

Tüm sunucularımızda tek tek işletim sistemimizi güncelleyelim.

apt update -y && apt upgrade -y

Şimdi 3 sunucumuzda da hosts dosyasına aşağıdaki gibi tanımlarınızı ekleyin. Bunları kendinize göre elbette düzenleyin.

nano /etc/hosts
10.0.0.80 cdn1.sezer.test cdn1
10.0.0.81 cdn2.sezer.test cdn2
10.0.0.82 cdn3.sezer.test cdn3

3 sunucuya da aşağıdaki repoları ekliyoruz.

sudo add-apt-repository ppa:gluster/glusterfs-9

Ardından sitemlerimizi tekrardan update edelim.

sudo apt update -y

Sunucularımıza GlusterFS paketini kuralım.

sudo apt install glusterfs-server -y

Sunucularımızda GlusterFS servisini başlatalım.

sudo systemctl start glusterd.service

Sunucularımızda sistem reboot olduğunda servis otomatik başlasın diye enable edelim

sudo systemctl enable glusterd.service

Ardından servisimizi kontrol edelim.

sudo systemctl status glusterd.service
● glusterd.service - GlusterFS, a clustered file-system server
     Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-04-16 15:42:46 UTC; 1min 3s ago
       Docs: man:glusterd(8)
   Main PID: 12967 (glusterd)
      Tasks: 9 (limit: 9441)
     Memory: 6.7M
     CGroup: /system.slice/glusterd.service
             └─12967 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

Apr 16 15:42:45 cdn1 systemd[1]: Starting GlusterFS, a clustered file-system server...
Apr 16 15:42:46 cdn1 systemd[1]: Started GlusterFS, a clustered file-system server.

Peer probe kısmında dış network kullanacaksanız UFW kuralları girmeyi ihmal etmeyin. İzin vereceğiniz portlar 24007 ve 49152 tcp protokolünde olacaktır.

Şimdi ilk sunucumuzdan aşağıdaki komutları girelim.

sudo gluster peer probe cdn2
sudo gluster peer probe cdn3

İşlem başarılı olduysa aşağıdaki gibi çıktı alacaksınız.

peer probe: success

Ardından tüm sunucularda kontrol edelim.

sudo gluster peer status

Şimdi 3 sunucuda da eklediğimiz 2. diski kalıcı olarak mount edelim. Bunu nasıl yapacağına dair bilgiyi bu yazıda vermeyeceğim. Zaten bunun için daha önce yazdığım bir doküman var. Aşağıdan ulaşabilirsiniz.

Ben disklerimi /mnt/glusterfs yoluna mount ettim. Ardından içerisinde “share” adlı bir klasör oluşturdum. Çünkü /mnt/glusterfs doğrudan mount edildiği için GlusterFS bunu önermiyor ve aşağıdaki uyarıyı veriyor. “Force” ile uyarıyı göz artı edebilirsiniz ama önerilmiyor.

Please create a sub-directory under the mount point and use that as the brick directory. Or use ‘force’ at the end of the command if you want to override this behavior.

/mnt
└── glusterfs
    └── share

Şimdi test için her sunucunun ana dizinine “test_volume” klasörü oluşturalım.

mkdir /test_volume

Şimdi Volume oluşturalım. Bu komutu herhangi bir makinede çalıştırın.

sudo gluster volume create shared_volume replica 3 cdn1:/mnt/glusterfs/share cdn2:/mnt/glusterfs/share cdn3:/mnt/glusterfs/share

Şimdi herhangi bir sunucuda aşağıdaki komutu çalıştırarak volume’ü başlatın.

sudo gluster volume start shared_volume

Aşağıdaki gibi bir çıktı almanız gerekiyor.

volume start: shared_volume: success

Aşağıdaki komutla kontrol sağlayın.

sudo gluster volume status
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick cdn1:/mnt/glusterfs/share             49152     0          Y       2000 
Brick cdn2:/mnt/glusterfs/share             49152     0          Y       1587 
Brick cdn3:/mnt/glusterfs/share             49152     0          Y       1657 

Artık NAS işlemlerimizi bitirdik. Şimdi ana dizine oluşturduğumuz /test_volume klasörüne bu NAS’ı mount edelim ve senkronizasyonu kontrol edelim.

#Server -1

sudo mount -t glusterfs cdn1:/shared_volume /test_volume

#Server -2

sudo mount -t glusterfs cdn2:/shared_volume /test_volume

#Server -3

sudo mount -t glusterfs cdn3:/shared_volume /test_volume

Şimdi test için 3. sunucuda /test_volume klasörümüzde sezer.txt adında dosya oluşturalım.

cdn3:/shared_volume                2.0T   20G  1.9T   2% /test_volume
root@cdn3:/test_volume# touch sezer.txt
root@cdn3:/test_volume# ls
sezer.txt

Diğer sunucularımızı kontrol edelim.

root@cdn2:/mnt/glusterfs# cd /test_volume/
root@cdn2:/test_volume# ls -la
total 8
drwxr-xr-x  4 root root 4096 Apr 16 17:43 .
drwxr-xr-x 20 root root 4096 Apr 16 16:58 ..
-rw-r--r--  1 root root    0 Apr 16 17:43 sezer.txt
root@cdn1:/# cd /test_volume/
root@cdn1:/test_volume# ls -la
total 8
drwxr-xr-x  4 root root 4096 Apr 16 17:43 .
drwxr-xr-x 20 root root 4096 Apr 16 16:58 ..
-rw-r--r--  1 root root    0 Apr 16 17:43 sezer.txt

Dışarıdan gelecek client isteklerini aşağıdaki komutla ip bazlı kısıtlayacağız.

#Server -1

sudo gluster volume set shared_volume auth.allow cdn2,cdn3

#Server -2

sudo gluster volume set shared_volume auth.allow cdn1,cdn3

#Server -3

sudo gluster volume set shared_volume auth.allow cdn1,cdn2

That’s all!