22 Mart 2026 Pazar

CentOS 9da 4 Nodlu GlusterFS Kümesi Kurulumu


Merhaba. Bu yazıda hyperconverged mimariyle linux makinalar üzerinde bir depolama kümesi (storage cluster) oluşturacağım ama önce bu laf salatasına bir açıklık getireyim. Hyperconverged'den kastım, elimde bir disk kutusu (enclosure) yok. Bunun yerine, üzerinde atıl diskler olan birden fazla özdeş makinam var. Ben bu disk alanını yedekli bir biçimde birleştirip diğer makinalara sunacağım. Makinaların özdeş olması önemli, çünkü yedeklilik (redundancy) ve performans için dosyalar parçalara bölünerek makinalara dağıtılacak. Dolayısıyla sistemdeki en küçük disk dolarsa yazılan dosyalar tüm makinalara dağıtılamaz. Ayrıca işlemci ve bellek de eşit olmalı ki, bir makina yazmayı bitirdiğinde diğerlerini beklemek zorunda kalmasın.

Dağıtık (shared) dosya sistemi olarak GlusterFS kullanacağım, çünkü öncelikle ilk kurulumu görece basit. İleri seviye bir konfigürasyon çok karışık bir hal alabiliyor ama ben bu ayrıntılara en azından bu yazıda girmeyeceğim. Alternatif olarak Ceph veya Quobyte kullanabilirdim ama benim gözlemim Ceph, GlusterFS'ten çok daha karışık. Bir projede Quobyte ile çalıştım ve diğer ikisinin aksine kurulumu inanılmaz kolay, ancak GlusterFS, RHEL tarafından doğrudan destekleniyor(du). Buna geleceğim.

Normalde bu tür bir projede terabyte diskli sunucular kullanılır. Ben sadece yapılabilir olduğunu göstermek için 20 GB diskli dört makina kullanıp bunları %75 verimle, yani 20 GB * %75 * 4 = 60 GB'lık bir disk paylaştıracağım. %25'lik alan yedeklilik için kullanılacak. Bu kapasite, disklerin kapasitesiyle doğru ortantılı. Diğer yandan makina sayısı da önemli. Bu sistemi üç makinayla kursaydım, tavsiye edilen konfigürasyon RAID1 benzeri yapıda %33 verimle çalışıyor. Yani 20GB diskli üç makindan 20 GB kapasite alınabiliyor. Elbette küme RAID0 mantığıyla da kurulabilir ama bu durumda kümeden bir makina bile yeniden başlatılsa veri bozulması ve kaybı oluşur. Benim dört makina seçmemdeki neden, yedeklilikten ödün vermeden az sayıda makinayla yüksek verim sunabilmesi. Bu konfigürasyonda diskler RAID5 mantığında çalışıyor ve bir makina çökse bile sistem etkilenmiyor. Diğer yandan konfigürasyonun karışık bir hal alabileceğini yazmıştım. Dört makina, istenirse RAID10 mantığında, dosya parçalarının yarısı bir makinada diğer yarısı diğer makinada ve geri kalan iki makina da ilk iki makinayı aynalayacak (mirroring) şekilde de ayarlanabilir. Bu durumda aynı mirror group'ta olmamak koşuluyla, sistem iki makina arızasını kaldırabilir ancak depolama verimi %50 olur.

Diski ağda paylaştırmak için samba servisini kullanacağım. Eğer ağda yalnızca linux istemciler varsa NFS de bir seçenek. Samba'yı seçmemdeki bir neden, ctdb servisiyle high-availability sağlayabiliyor. Ctdb, samba'nın bir parçası ve NFS'i de destekliyor. Öte yandan ağda Windows istemciler varsa samba zaten alternatifsiz durumda. Ve disk erişimi Active Directory (AD) ile yönetilecekse samba'yla bunu halletmek daha kolay.

Dağıtım olarak CentOS9 kullanacağım, ama kullandığım GlusterFS komutlarını ve samba konfigürasyonunu Ubuntu'da da test ettim. Bu bakımdan dnf dışında yazı distro-agnostic olacak. Makinaları CentOS Cloud Image'dan oluşturacağım.

İlk olarak birden fazla makinaya kurulum yapacağımdan tmux'ta 4 farklı panel açtım, her panelde bir makinaya bağlandıktan sonra set syn komutunu verdim. Böylelikle komutlar tüm makinalarda çalıştırılacak.

tmux'ta dört panelde güncelleme

Ardından makinalara bağlanıp, gerekli paketleri yükledim. İlk satır hata analizi için gerekli araçlar. İkinci satırda GlusterFS paketlerini içeren repository ve üçüncü satırda bu repository'den glusterfs-server paketi yükleniyor. Sonraki satırlarda samba'yla ilgili paketleri yükleyip sistemi güncelledim. En sonda needs-restart ile makinaları yeniden başlattım.

dnf -y install tcpdump telnet wget epel-release
dnf -y install centos-release-gluster9
dnf -y install glusterfs-server

dnf -y install samba cifs-utils samba samba-common-tools samba-winbind ctdb --enablerepo=resilientstorage

dnf update
needs-restarting -r || reboot

GlusterFS için makinaların birbirlerine hostname'leriyle ulaşabilmeleri gerekiyor. Normalde bu DNS kayıtlarıyla yapılmalı. Ben küçük bir test ortamında çalıştığım için makinaların IP'lerini hosts dosyasına elle ekledim. Makinaları aşağıdaki gibi server01..04 olarak adlandırdım. İkinci komutla makinalara hostname atadım. Elbette bu komut her makinada ayrı ayrı girilmeli ve bash'in yeni hostname'i göstermesi isteniyorsa logout / login yapılmalı (Ubuntu için hostnamectl set-hostname server01).

cat >> /etc/hosts << EOF
172.18.186.101   server01
172.18.186.102   server02
172.18.186.103   server03
172.18.186.104   server04
EOF

nmcli gen hostname server01
chronyc sources

GlusterFS servisi zaman açısından hassas, makinalar arasında saat farkı bulunmamalı. Bu nedenle chrony'nin çalıştığını yukarıdaki komutla kontrol ettim. Bu arada Ubuntu'nun chronyd yerine kendi NTP istemcisi var. İstenirse chronyd yüklenebiliyor ve bu yapılırsa kendi NTP istemcisini sistemden otomatik kaldırıyor.

chronyc sources çıktısı

Bundan sonra sıra diskleri hazırlamaya geldi. Önce lsblk ile diskleri kontrol ettim. Benim diskim /dev/vdb. Kullanımda esnek olması için bir disk bölümü ve bu bölümde LVM'le bir de logical volume oluşturup onu kullandım.

fdisk /dev/vdb
# Burada bölümleme adımlarına değinmeyeceğim. Eski yazılardan nasıl yapılacağı bulunabilir.

pvcreate /dev/vdb1
vgcreate vg_gluster /dev/vdb1
lvcreate -l 100%FREE -n lv_brick vg_gluster
mkfs.xfs -f -i size=512 /dev/vg_gluster/lv_brick
mkdir -p /data/glusterfs/brick1
echo "/dev/vg_gluster/lv_brick  /data/glusterfs/brick1  xfs  defaults  1  2" >> /etc/fstab
systemctl daemon-reload
mount -a

Buraya kadar herşey yolundaysa son komut bir çıktı üretmemeli ve df -hP çıktısında yeni mount edilen bölüm listelenmeli. Bu noktada makinalar kuruluma hazır.

Aşağıdaki komutlarla shared_storage adında bir GlusterFS bölümü oluşturdum. systemctl komutu bütün makinalarda, geri kalan gluster komutları yanlızca birinci makinada çalıştırılacak.

systemctl enable --now glusterd

gluster peer probe server02
gluster peer probe server03
gluster peer probe server04
gluster volume create shared_storage disperse 4 redundancy 1 \
server01:/data/glusterfs/brick1/brick \
server02:/data/glusterfs/brick1/brick \
server03:/data/glusterfs/brick1/brick \
server04:/data/glusterfs/brick1/brick

gluster volume start shared_storage

gluster volume status shared_storage

gluster volume status shared_storage

Yukarıdaki görselde, komutu aynı anda bütün makinalardan girdiğimde, ilk iki makina, diğer makinalardaki komutun sonlanmasını bekliyor. Bu normal bir durum. Muhtemelen komut server03 ile server04'te bir kaç milisaniye farkla çalıştı. Normalde yalnız bir makinada çıktı vermesi gerekirdi.

Bu arada host firewall ile ilgili bir ayar yapmadım, çünkü benim makinalarımda firewalld çalışmıyor.

Bu noktada samba için ufak bir hileye başvuracağım. Normalde samba'nın glusterfs entegrasyonu vardı ve bu gayet performanslı çalışıyordu [1]. Ancak RedHat 2024 sonu itibariyle GlusterFS desteğini kaldırıp, kaynakları Ceph'e kaydırma kararı aldı [2][3]. Dolayısıyla bu entegrasyon dağıtımlardan çıkarıldı [5]. Başka bir deyişle artık samba-vhs-glusterfs paketi RedHat'lerde yok. Bu durum aşağıdaki gibi aşılabilir (bütün makinalarda çalıştırılacak). Fedora bu desteği sürdürüyor [4] ama ne kadar devam eder bilmiyorum.

mkdir -p /mnt/gluster_shared
echo "localhost:shared_storage  /mnt/gluster_shared  glusterfs  defaults,_netdev  0  0" >> /etc/fstab
systemctl daemon-reload
mount -a

Bu şekilde bütün makinalar GlusterFS diskini de kendi üzerine mount ettiler. Sambayı doğrudan GlusterFS ile konuşturamadığımdan, bu kaynağı normal bir dizin gibi samba ile paylaştırdım. Bunun dezavantajı dosya sistemi işlemlerinin kernel'a bir yerine iki kere girmek zorunda kalmasından [1] dolayı oluşan performans kaybı.

Şimdi ctdb'yi ayarlayıp diski ağdan paylaşabilirim, ama bunu yapmadan önce selinux'u Permissive moda almam gerek. Bir kaç kaynakta bazı boolean'larla oynayarak selinux'u kapatmadan ctdb cluster yapılabileceği yazıyor, ancak bende işe yaramadı.

sed -i -e "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
setenforce 0

/etc/ctdb/nodes dosyasında yanlızca node'ların IP'si girilmeli. /etc/ctdb/public_addresses dosyasında da floating IP adresi ve bu IP'nin atanacağı ağ kartını girmek gerek.

cat > /etc/ctdb/nodes << EOF
172.18.186.101
172.18.186.102
172.18.186.103
172.18.186.104
EOF

cat > /etc/ctdb/public_addresses << EOF
172.18.186.200/24    eth0
EOF

smb.conf dosyasının içeriği aşağıdaki gibi olmalı:

[global]
        netbios name = GLUSTER_CLUSTER
        workgroup = SAMBA
        #security = user
        clustering = yes

        passdb backend = tdbsam
        idmap config * : backend = tdb
        idmap config * : range = 1000000-1999999

        #printing = cups
        #printcap name = cups
        #load printers = yes
        #cups options = raw

[shared_storage]
    comment = GlusterFS
    path = /mnt/gluster_shared
    valid users = sambauser
    read only = no
    guest ok = yes
    create mask = 0664
    directory mask = 0775

Ve ctdb'yi aşağıdaki gibi ayarladım:

systemctl stop smb nmb
systemctl disable smb nmb
ctdb event script enable legacy 00.ctdb
ctdb event script enable legacy 10.interface
ctdb event script enable legacy 50.samba
systemctl enable --now ctdb

Aktifleştirilen scriptler, ctdb'nin floating IP'yi ve clustered samba'yı yönetebilmesi için gerekli. ctdb cluster'ın durumu ctdb status komutuyla görülebilir. Herşey doğru ayarlandıysa bu komutları çalıştırdıktan bir kaç saniye sonra bütün nodların OK olması lazım. Bu arada ctdb'ye birden fazla floating IP atamak da mümkün. Ben yalnızca bir tane IP verdim. IP'lerin durumu ctdb ip all komutuyla kontrol edilebilir.

ctdb status

Şimdi son adım, samba için bütün nodlarda bir kullanıcı oluşturmak:

groupadd -g 2000 sambagroup
useradd -u 2000 -g sambagroup -s /sbin/nologin sambauser
smbpasswd -a sambauser

sambauser kullanıcısının sistemdeki şifresi önemli değil. Samba kendi veri tabanını ayrı tutuyor.

Böylelikle depolama kümesi devreye alınmış oldu. Şimdi bunu mount edeceğim bir istemci lazım. Bunu hazırlamak çok daha kolay. Aynı ağda bulunan beşinci bir makinada şu komutları çalıştırdım:

dnf -y install centos-release-gluster9
dnf -y install glusterfs-fuse samba-client cifs-utils
mkdir -p /mnt/my_shared_storage

cat >> /etc/hosts << EOF
172.18.186.101   server01
172.18.186.102   server02
172.18.186.103   server03
172.18.186.104   server04
EOF

mount -t glusterfs 172.18.186.200:/shared_storage /mnt/my_shared_storage/
df -hP

İlk komutla glusterfs reposunu, sonra glusterfs'i mount etmek için gereken paketi ve samba istemcisini yükledim. Sunucuların listesinin olduğu hosts dosyasını bu makinada da oluşturdum. Her ne kadar istemci floating IP üzerinden mount ediyorsa da iç haberleşme için bu makinaların IP'lerini çözebiliyor olması gerek. DNS sunucunun olduğu bir ortamda bu adıma gerek yok. Son adımda shared_storage kaynağını glusterfs olarak mount ettim, df ile kontrol ettiğimde 60 GB'lik bir disk mount edilmiş oldu. Henüz samba olarak mount etmedim.

Samba olarak mount etmek için, önce aşağıdaki ilk komutla paylaşılan kaynakları görebilir ve ikinci komutla bu paylaşıma bağlanabilirim:

smbclient -L //172.18.186.200 -U sambauser
smbclient //172.18.186.200/shared_storage -U sambauser

Bu paylaşımı mount etmeden önce GlusterFS mount'unu kaldırıp sonra aynı paylaşımı bu kez samba olarak mount ettim:

umount /mnt/my_shared_storage
mount -t cifs //172.18.186.200/shared_storage /mnt/my_shared_storage -o username=sambauser

Ve kalıcı mount oluşturmak için /etc/fstab'e aşağıdaki satırı ekledim:

//10.0.100.231/shared_storage  /mnt/my_shared_storage  cifs  credentials=/etc/samba/user.cred,iocharset=utf8,_netdev 0 0

/etc/samba/user.cred dosyasında login bilgileri var.

cat >> /etc/samba/user.cred << EOF
username=sambauser
password=secret
domain=SAMBA
EOF

chmod go= /etc/samba/user.cred
chown root:root /etc/samba/user.cred
systemctl daemon-reload
mount -a
df -hP

Şimdilik yazıyı burada noktalıyorum, bu yazı yeterince uzun oldu. Bunun AD veya LDAP ile nasıl entegre edileceğini ileriki bir yazıda anlatmayı planlıyorum.


Kaynak:

[1]: https://lalatendu.org/2014/04/20/glusterfs-vfs-plugin-for-samba/
[2]: https://en.wikipedia.org/wiki/Gluster#cite_ref-10
[3]: https://www.reddit.com/r/kubernetes/comments/zojdl7/whats_the_story_behind_the_abandonment_with/
[4]: https://pkgs.org/search/?q=samba-vfs-glusterfs
[5]: https://www.samba.org/samba/docs/4.7/man-html/vfs_glusterfs.8.html

Hiç yorum yok:

Yorum Gönder