multipathd ve multipath Komutu ile Linux’ta Çok Yollu Depolama Yönetimi
Depolama altyapısında çok yollu bağlantı (multipath) konusu, üretim ortamlarında çalışan sysadmin’lerin bir gün mutlaka yüzleşmek zorunda kaldığı konulardan birisi. Özellikle SAN bağlantılı sistemlerde, bir kablo koptuğunda ya da bir HBA portu arızalandığında tüm sistem ayağa kalkarsa, o gün multipath’i ne kadar iyi yapılandırdığınızın cevabını alırsınız. Bu yazıda multipathd daemon’ını ve multipath komutunu gerçek dünya perspektifinden ele alacağız.
Multipath Nedir ve Neden Gereklidir?
Linux’ta çok yollu depolama, bir disk cihazına birden fazla fiziksel yol üzerinden erişim sağlamak anlamına gelir. Tipik bir kurumsal ortamda, sunucunuzun iki HBA (Host Bus Adapter) kartı vardır ve bu kartlar iki ayrı FC switch üzerinden storage array’e bağlanır. Teorik olarak dört yolunuz olur. multipath olmadan, işletim sistemi bu dört yolu dört ayrı disk cihazı olarak görür: /dev/sdb, /dev/sdc, /dev/sdd, /dev/sde. Hepsi aynı LUN, ama kernel bunları ayrı ayrı tanır.
Bu durumun iki büyük sorunu vardır:
- Yol kopukluğu: Bir yol kesilirse o disk cihazı kaybolur. Eğer o cihaz üzerinde aktif I/O varsa uygulama çöker.
- Yük dengeleme: Dört yol var ama siz sadece birini kullanıyorsunuz.
multipath, bu dört yolu tek bir sanal cihaz /dev/mapper/mpatha altında birleştirir. Yük dengeleme yapar, bir yol düşerse diğerinden devam eder. Uygulama bunların hiçbirini fark etmez.
Kurulum ve Temel Yapılandırma
Çoğu kurumsal dağıtımda paket hazır gelir ama aktif olmayabilir.
# RHEL/CentOS/Rocky Linux
dnf install device-mapper-multipath
# Ubuntu/Debian
apt install multipath-tools
# Servisi başlat ve aktif et
systemctl enable --now multipathd
# Temel yapılandırma dosyasını oluştur
mpathconf --enable --with-multipathd y
mpathconf komutu RHEL ekosisteminde hayat kurtarır. /etc/multipath.conf dosyasını sıfırdan elle yazmak zorunda kalmazsınız. Ubuntu tarafında bu araç yoktur, doğrudan /etc/multipath.conf oluşturmanız gerekir.
Minimal bir multipath.conf şöyle görünür:
# /etc/multipath.conf
defaults {
user_friendly_names yes
find_multipaths yes
path_grouping_policy multibus
path_selector "round-robin 0"
failback immediate
no_path_retry fail
}
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z]"
devnode "^sda"
}
user_friendly_names yes: Cihazlara mpatha, mpathb gibi okunabilir isimler verir. Kapalı bırakırsanız WWN tabanlı uzun isimler alırsınız, ki production’da bunları tercih eden ekipler de var çünkü WWN sabittir.
find_multipaths yes: Sadece gerçekten birden fazla yolu olan cihazları multipath altına alır. Tek yollu cihazları es geçer.
blacklist: Çok önemli! Sistem diskini (/dev/sda) mutlaka blacklist’e alın. Yoksa root filesystem’iniz garip davranışlar sergilemeye başlayabilir.
multipathd Daemon’ı Anlamak
multipathd, arka planda çalışarak yolları sürekli izleyen daemon’dır. Kernel’dan udev event’leri alır, yeni disk cihazı eklendiğinde ya da çıkarıldığında harekete geçer. Yapılandırma değişikliklerini anında uygular.
# Daemon durumunu kontrol et
systemctl status multipathd
# Daemon'ı yeniden başlatmadan yapılandırmayı yükle
multipathd reconfigure
# Hata ayıklama modunda çalıştır
multipathd -d -v 3
# multipathd soket üzerinden komut gönder
multipathd -k"show paths"
multipathd -k"show maps"
multipathd -k"show topology"
multipathd -k ile daemon’a doğrudan komut gönderebilirsiniz. Bu özellik çok az bilinen ama son derece kullanışlı bir özelliktir. Özellikle show topology çıktısı, hangi yolların aktif olduğunu anlık görmek için idealdir.
multipath Komutu ile Cihazları Yönetmek
multipath komutu, cihazları tarama, harita oluşturma ve mevcut durumu görüntüleme için kullanılır.
# Tüm multipath cihazlarını listele
multipath -l
# Verbose çıktı ile listele
multipath -ll
# Yeni cihazları tara ve haritaları güncelle
multipath -v2
# Belirli bir cihazı yeniden tara
multipath -v2 /dev/sdb
# Tüm haritaları temizle ve yeniden oluştur
multipath -F && multipath -v2
# wwid dosyasını güncelle (disk eklerken)
multipath -a /dev/sdb
multipath -ll çıktısını okumayı öğrenmek kritik önem taşır. Tipik bir çıktı şöyle görünür:
mpatha (360000000000000001) dm-0 VENDOR,PRODUCT
size=100G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| |- 1:0:0:1 sdb 8:16 active ready running
| `- 2:0:0:1 sdd 8:48 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
|- 1:0:1:1 sdc 8:32 active ready running
`- 2:0:1:1 sde 8:64 active ready running
Bu çıktıda şunları okuyoruz: mpatha cihazı dört yoldan oluşuyor. İki path group var. İlk group active durumda (öncelikli), ikincisi enabled (yedek ya da düşük öncelikli). Her path’in durumu active ready running gösteriyor. Eğer bir yol düşmüşse faulty ya da failed görürsünüz.
Gerçek Dünya Senaryosu: SAN Bakımı Sırasında Yol Yönetimi
Geçen yıl bir müşteride storage array firmware güncellemesi yapacaktık. Array, controller failover yapacaktı ve bu süreçte bazı yollar geçici olarak kopacaktı. Önceden multipath durumunu belgeledik:
# Mevcut durumu kaydet
multipath -ll > /tmp/multipath_before_maintenance.txt
# Her path'in I/O istatistiklerini gör
multipathd -k"show paths format %n %t %i %o %f %x %c"
# Aktif path sayısını kontrol et
multipath -ll | grep -c "active ready"
Firmware güncellemesi sırasında bir controller’ı devre dışı bıraktığımızda, o controller’a giden yollar faulty duruma düştü. multipathd anında diğer yollara geçti. Uygulama tarafında herhangi bir kesinti yaşanmadı. Güncelleme bittikten sonra:
# Düşen yolları yeniden aktif et
multipathd -k"reinstate path sdb"
multipathd -k"reinstate path sdd"
# Ya da tüm yolları kontrol edip yeniden dene
multipathd -k"check paths"
# Durum doğrulama
multipath -ll
Bu senaryo, multipath olmadan elle yapılması neredeyse imkânsız olan bir işlemi otomatik hale getiriyor. Sysadmin olarak tek yaptığınız iş izlemek.
path_grouping_policy ve Yük Dengeleme Stratejileri
Multipath’in en ince ayar noktalarından biri yük dengeleme politikasıdır. Farklı politikaların farklı kullanım alanları vardır:
failover: Tek path aktif, diğerleri yedekte bekler. Maksimum stabilite ister ve performanstan ödün vermek istemiyorsanız tercih edilir. Bazı eski storage sistemleriyle uyumluluk için zorunludur.
multibus: Tüm path’ler aynı group’ta, hepsi eş zamanlı kullanılır. Basit ve etkili.
group_by_serial: Path’leri seri numarasına göre gruplar.
group_by_prio: Path’leri öncelik değerine göre gruplar. ALUA (Asymmetric Logical Unit Access) kullanan storage sistemlerinde altın değerinde bir ayardır.
# /etc/multipath.conf - ALUA destekli storage için örnek
defaults {
user_friendly_names yes
path_grouping_policy group_by_prio
path_selector "service-time 0"
prio alua
failback immediate
no_path_retry 12
rr_min_io_rq 1
}
devices {
device {
vendor "PURE"
product "FlashArray"
path_grouping_policy multibus
path_selector "service-time 0"
no_path_retry 0
hardware_handler "0"
}
}
devices bloğu, belirli storage vendörlerine özel ayarlar yapmanızı sağlar. Pure Storage, NetApp, EMC, Hitachi gibi büyük üreticilerin hepsinin kendine özgü optimal ayarları vardır ve genellikle vendor dokümantasyonunda verilir.
Sorun Giderme: Yaygın Problemler ve Çözümleri
“All paths down” Durumu
# Hangi cihazların sorunlu olduğunu bul
multipath -ll | grep -A5 "failed|faulty"
# Kernel log'larına bak
dmesg | grep -i "multipath|sd[a-z]|scsi" | tail -50
# Path'leri manuel olarak test et
dd if=/dev/sdb of=/dev/null bs=512 count=1 2>&1
# Path'i manuel olarak devre dışı bırak
multipathd -k"fail path sdb"
# Path'i geri getir
multipathd -k"reinstate path sdb"
Ghost Device Problemi
Bazı sistemlerde, storage’dan LUN sildikten sonra eski cihaz girdileri /dev/mapper altında kalmaya devam eder. Bu durum yönetimi zorlaştırır:
# Kullanılmayan haritaları temizle
multipath -F
# Flush işlemi başarısız olursa (busy cihaz)
dmsetup remove /dev/mapper/mpatha
# SCSI cihazlarını yeniden tara
for host in /sys/class/scsi_host/host*/; do
echo "- - -" > ${host}scan
done
# Mevcut haritaları yeniden oluştur
multipath -v2
Duplicate WWID Problemi
Nadir ama başa bela bir durum: Bazı storage sistemleri klonlama yaparken aynı WWID’yi kopyaladığında ya da sanal ortamlarda disk passthrough yanlış yapılandırıldığında aynı WWID birden fazla fiziksel cihazda görünür.
# WWID'leri kontrol et
/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdc
# Multipath'in gördüğü WWID'leri listele
multipath -ll | grep "^mpath"
cat /etc/multipath/wwids
Monitoring ve Otomasyon
Üretim sistemlerde multipath durumunu sürekli izlemek şarttır. Aşağıdaki script, path sayısını kontrol edip eksiklik varsa uyarı üretir:
#!/bin/bash
# /usr/local/bin/check_multipath.sh
WARN_THRESHOLD=2 # Minimum beklenen path sayısı
ALERT_EMAIL="[email protected]"
HOSTNAME=$(hostname)
check_multipath() {
local failed_devices=()
while IFS= read -r line; do
if echo "$line" | grep -q "^mpath"; then
current_device=$(echo "$line" | awk '{print $1}')
fi
if echo "$line" | grep -qE "faulty|failed|shaky"; then
failed_devices+=("$current_device: $line")
fi
done < <(multipath -ll)
# Toplam aktif path sayısını say
total_active=$(multipath -ll | grep -c "active ready running")
total_paths=$(multipath -ll | grep -cE "active|failed|faulty")
if [ ${#failed_devices[@]} -gt 0 ]; then
echo "UYARI: $HOSTNAME üzerinde sorunlu multipath yolları tespit edildi!"
printf '%sn' "${failed_devices[@]}"
# Mail gönder
{
echo "Sunucu: $HOSTNAME"
echo "Zaman: $(date)"
echo "Sorunlu yollar:"
printf '%sn' "${failed_devices[@]}"
echo ""
echo "Detaylı durum:"
multipath -ll
} | mail -s "[$HOSTNAME] Multipath Uyarısı" "$ALERT_EMAIL"
exit 2
fi
echo "OK: $total_active/$total_paths yol aktif durumda"
exit 0
}
check_multipath
Bu scripti Nagios, Zabbix veya basit bir cron job ile çalıştırabilirsiniz:
# Crontab'a ekle - her 5 dakikada bir kontrol
*/5 * * * * /usr/local/bin/check_multipath.sh >> /var/log/multipath_check.log 2>&1
# Ya da systemd timer ile
Önemli Parametreler ve Ayarlar
multipath.conf içinde sık kullanılan direktiflerin anlamları:
no_path_retry fail: Tüm yollar düştüğünde hemen I/O hatası döndür. Hızlı başarısızlık (fail fast) yaklaşımı.
no_path_retry 12: Tüm yollar düştüğünde 12 deneme yap (yaklaşık 60 saniye). Geçici ağ sorunlarında toleranslı davranır.
no_path_retry queue: Yol bulunana kadar I/O’yu kuyruğa al. NFS üzerinde çalışan uygulamalar için uygun olabilir ama dikkatli kullanın, I/O kuyruğu şişebilir.
path_checker tur: Path kontrolü için kullanılan yöntem. tur (Test Unit Ready) en yaygın olanıdır.
path_checker directio: Doğrudan I/O ile test eder. Bazı storage sistemlerinde TUR desteklenmiyorsa kullanılır.
fast_io_fail_tmo 5: FC bağlantısı kesildiğinde kaç saniye beklenip I/O hatası üretileceğini belirtir. Düşük değer hızlı failover sağlar.
dev_loss_tmo 30: Kernel’ın cihazı kaybetmiş sayması için bekleme süresi.
Network Namespace ve Multipath
Konteyner ortamlarında multipath kullanımı özel dikkat gerektirir. Docker veya Podman kullandığınız ortamlarda, multipathd host’ta çalışır ve block device’ları yönetir. Konteynere doğrudan /dev/mapper/mpatha passthrough yapabilirsiniz.
# Multipath cihazının major:minor numaralarını al
ls -la /dev/mapper/mpatha
# Container'a block device olarak ver (Docker örneği)
docker run --device=/dev/mapper/mpatha:/dev/xvda -it ubuntu bash
# Kubernetes'te storage class'ı multipath aware yapılandır
# /etc/multipath.conf içinde find_multipaths yes olmalı
# ve Docker'ın /dev/mapper erişimine izni bulunmalı
Kubernetes ortamlarında CSI driver’ları multipath farkındalığıyla gelir. Rook-Ceph veya OpenEBS kullanıyorsanız, bu sistemlerin kendi path yönetimi olduğu için çift yönetimden kaçınmak adına dikkatli konfigürasyon yapın.
Sonuç
Multipath yapılandırması bir kez yapılıp unutulan bir iş değildir. Storage altyapısı değiştikçe, yeni LUN’lar eklenip çıkarıldıkça, firmware güncellemeleri yapıldıkça multipath durumunu gözden geçirmek gerekir. multipath -ll çıktısını okumayı gerçekten iyi öğrenin. Birkaç satır çıktı, size altyapınızın sağlığı hakkında çok şey anlatır.
Production ortamına multipath değişikliği uygulamadan önce her zaman test ortamında deneyin. Özellikle no_path_retry, failback ve path_grouping_policy değerleri, yanlış ayarlandığında sessiz sedasız performans sorunlarına ya da beklenmedik I/O hatalarına yol açabilir.
Son olarak: storage vendor’ınızın yayımladığı Linux multipath konfigürasyon kılavuzunu mutlaka inceleyin. Her büyük üreticinin kendi array’i için özelleştirilmiş multipath ayarları vardır ve bunlar genel ayarlardan genellikle daha iyi performans verir. Genel ayarlarla başlayıp vendor önerilerini üstüne eklemek, en sağlıklı yaklaşımdır.
