Depolama İleri Düzey
TEKNİK REHBER DEPOLAMA RAID & ÇOK DİSKLİ 2026

RAID & Çok Diskli Depolama —
mdadm & NVMe.

Linux yazılım RAID'i derinlemesine: mdadm ile RAID1/RAID5/RAID10 kurulumu, NVMe multi-namespace yönetimi, gömülü NAS topolojisi tasarımı, disk arızası senaryoları, yeniden oluşturma izleme ve Prometheus ile sürekli sağlık denetimi.

00 Linux yazılım RAID — md driver mimarisi

Linux Multi-Device (md) driver, yazılım RAID'i kernel seviyesinde uygular. Donanım RAID kontrolörü gerektirmez; modern CPU'larda performans farkı ihmal edilebilir düzeydedir.

md Katman Mimarisi
Uygulamalar (dosya sistemi: ext4, xfs, btrfs)
       │
       ▼
/dev/md0, /dev/md1  ... (md sanal blok cihazları)
       │
       ▼ md driver (kernel)
┌──────────────────────────────────────────────┐
│  RAID Level: 0/1/4/5/6/10                   │
│  Stripe size, chunk size, write-intent bitmap │
│  Sync thread, reshape, integrity check        │
└──────────────────────────────────────────────┘
       │
       ▼
/dev/sda  /dev/sdb  /dev/nvme0n1  ...  (üye diskler)
RAID 0 (Striping)
Veriyi şerit halinde birden fazla diske dağıtır. Yedeklilik yok; bir disk arızalanırsa tüm veri kaybolur. Maksimum okuma/yazma hızı.
RAID 1 (Mirroring)
Her veri tam olarak N diske yazılır. N-1 disk arızasına dayanır. Kapasite = tek disk kapasitesi.
RAID 5
Veri ve eşlik (parity) şerit halinde dağıtılır. 1 disk arızasına dayanır. Kapasite = (N-1) × disk.
RAID 6
Çift eşlik. 2 disk arızasına dayanır. Kapasite = (N-2) × disk. Büyük disk dizilerinde önerilir.
RAID 10
RAID 1 + RAID 0 kombinasyonu. Yedeklilik + yüksek performans. Kapasite = N/2 × disk.

01 RAID1 — ayna kurulumu (mdadm)

RAID1, kritik veri depolama için en güvenli seçenektir. Gömülü sistemlerde sistem diskinin ayna kopyası olarak yaygın kullanılır.

bash — RAID1 kurulumu
## Diskler: /dev/sda ve /dev/sdb

## 1. GPT bölüm oluştur (her disk için)
for disk in /dev/sda /dev/sdb; do
    parted -s "$disk" mklabel gpt
    parted -s "$disk" mkpart primary 1MiB 100%
    parted -s "$disk" set 1 raid on
done

## 2. RAID1 dizisi oluştur
mdadm --create /dev/md0 \
      --level=1 \
      --raid-devices=2 \
      /dev/sda1 /dev/sdb1

## Oluşturma onayı
# mdadm: Defaulting to version 1.2 metadata
# mdadm: array /dev/md0 started.

## 3. Dosya sistemi oluştur
mkfs.ext4 -F /dev/md0
mkdir -p /mnt/raid1
mount /dev/md0 /mnt/raid1

## 4. mdadm.conf güncelle (sistem yeniden başlatmada gerekli)
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u    # Ubuntu/Debian

## 5. fstab kaydı
UUID=$(blkid -s UUID -o value /dev/md0)
echo "UUID=$UUID  /mnt/raid1  ext4  defaults,nofail  0 2" >> /etc/fstab

RAID1 durumu kontrol

bash
## Detaylı durum
mdadm --detail /dev/md0
# /dev/md0:
#           Version : 1.2
#     Creation Time : Mon Jan  1 10:00:00 2026
#        Raid Level : raid1
#        Array Size : 976768000 (931.49 GiB)
#     Used Dev Size : 976768000 (931.49 GiB)
#      Raid Devices : 2
#     Total Devices : 2
#       Persistence : Superblock is persistent
#           State   : clean
#  Active Devices   : 2
# Working Devices   : 2
#  Failed Devices   : 0
#   Spare Devices   : 0

## Kısa özet
cat /proc/mdstat
# Personalities : [raid1]
# md0 : active raid1 sdb1[1] sda1[0]
#       976768000 blocks super 1.2 [2/2] [UU]

02 RAID5 — eşlik tabanlı şerit kurulumu

RAID5, yedeklilik ile kapasite verimliliğini dengeler. En az 3 disk gerektirir; N diskle (N-1) disk kapasitesi kazanılır. Gömülü NAS ve arşiv depolama için uygundur.

bash — RAID5 (3 disk) kurulumu
## Diskler: /dev/sdb, /dev/sdc, /dev/sdd
for disk in /dev/sdb /dev/sdc /dev/sdd; do
    parted -s "$disk" mklabel gpt
    parted -s "$disk" mkpart primary 1MiB 100%
    parted -s "$disk" set 1 raid on
done

## RAID5 oluştur — chunk size 512 KB
mdadm --create /dev/md1 \
      --level=5 \
      --raid-devices=3 \
      --chunk=512 \
      /dev/sdb1 /dev/sdc1 /dev/sdd1

## Senkronizasyon ilerlemesini izle
watch -n2 cat /proc/mdstat
# md1 : active raid5 sdd1[2] sdc1[1] sdb1[0]
#       1953536000 blocks super 1.2 level 5, 512k chunk
#       [3/3] [UUU]
#       [=====>...............]  resync = 25.5% finish=7.2min

## RAID5 stripe cache ve read-ahead
echo 4096 > /sys/block/md1/md/stripe_cache_size  # 4096 şerit cache
blockdev --setra 65536 /dev/md1   # 32 MB read-ahead

## XFS dosya sistemi (RAID5 ile performanslı)
mkfs.xfs -f -d su=512k,sw=2 /dev/md1
# su = stripe unit (chunk size), sw = stripe width (N-1)

RAID5 write hole sorunu

Write-Intent Bitmap ile koruma
## Yazma niyeti bitmap'i ekle (UPS olmayan sistemlerde kritik)
mdadm --grow /dev/md1 --bitmap=internal
# veya oluştururken:
# mdadm --create ... --bitmap=internal

## Bitmap durumu
mdadm --detail /dev/md1 | grep -i bitmap
# Bitmap : Internal

03 RAID10 — yüksek performanslı yedekli yapı

RAID10, RAID1'in yedekliliğini ve RAID0'ın performansını birleştirir. Veritabanı ve yüksek I/O gerektiren iş yükleri için idealdir.

bash — RAID10 (4 disk, near-2 layout)
## Near-2 layout: her şerit iki farklı diske yazılır
mdadm --create /dev/md2 \
      --level=10 \
      --raid-devices=4 \
      --layout=n2 \
      --chunk=256 \
      /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1

## far-2 ve offset-2 layout alternatifleri:
## far-2:    her kopya farklı disk bölgesinde → daha iyi sekansiyel okuma
## offset-2: offset şeritler → iyi her iki mod

## RAID10 özellikleri
mdadm --detail /dev/md2 | grep -E "Level|Layout|Chunk"
# Raid Level : raid10
# Layout     : near=2
# Chunk Size : 256K

04 NVMe multi-namespace (NS) yönetimi

NVMe multi-namespace, tek bir NVMe SSD'yi birden fazla bağımsız blok cihazına bölmeyi sağlar. Her namespace bağımsız kapasite, erişim kontrolü ve QoS ayarlarına sahip olabilir.

bash — NVMe namespace yönetimi
## nvme-cli kurulum
sudo apt install nvme-cli

## Mevcut namespace'leri listele
nvme list-ns /dev/nvme0
# [   0]:0x1
# Namespace: 1, NSID: 1, Size: 1.00TB

## Controller'ı keşfet
nvme id-ctrl /dev/nvme0 | grep -E "mn|sn|tnvmcap|unvmcap"
# mn     : Samsung SSD 990 Pro 2TB
# tnvmcap: 2000398934016  (toplam NVM kapasitesi)
# unvmcap: 1000199467008  (atanmamış kapasite, 2. NS oluşturmak için)

## Yeni namespace oluştur (500 GB, 4096 LBA formatı)
nvme create-ns /dev/nvme0 \
    --nsze=122070312 \    # LBA sayısı (500GB / 4096)
    --ncap=122070312 \
    --flbas=0             # LBA formatı indeksi (0=512B, 1=4096B)

# Namespace ID al
nvme list-ns /dev/nvme0
# [   0]:0x1
# [   1]:0x2   ← yeni NS

## Namespace'i controller'a ekle
nvme attach-ns /dev/nvme0 --namespace-id=2 --controllers=0x7

## Kernel'e bildir
nvme reset /dev/nvme0

## Blok cihazı görünümü
ls /dev/nvme0n*
# /dev/nvme0n1  (NS 1)
# /dev/nvme0n2  (NS 2)

NVMe namespace ile RAID

bash — iki NVMe NS ile RAID1
## İki farklı NVMe SSD'nin namespace'leri ile RAID1
mdadm --create /dev/md_nvme \
      --level=1 \
      --raid-devices=2 \
      /dev/nvme0n1 /dev/nvme1n1

mkfs.xfs /dev/md_nvme
mount /dev/md_nvme /mnt/nvme_raid

NVMe Namespace I/O Policy

bash — NVMe NS QoS
## NVM Set ile namespace gruplaması (NVMe 1.4+)
nvme set-feature /dev/nvme0 --feature-id=0x19 \
    --value=0x1   # NVM Set ID

## I/O determinism (Intel Optane / özel SSD)
nvme id-ns /dev/nvme0 --namespace-id=1 | grep -i "nsfeat"

05 Gömülü NAS topolojisi — PCIe + SATA genişletici

ARM tabanlı gömülü NAS (Synology, QNAP benzeri) mimarisinde PCIe SATA genişletici kartlar yaygındır. Her diskin güç yönetimi ve hata tespiti bağımsız olmalıdır.

Gömülü NAS Topolojisi
ARM Cortex-A55 SoC (örn. Marvell ARMADA 3720)
  ├── PCIe Gen 3 x4
  │     └── ASM1166 SATA 6G × 6 port genişletici
  │           ├── /dev/sda  (3.5" HDD 4TB — RAID5 üye)
  │           ├── /dev/sdb  (3.5" HDD 4TB — RAID5 üye)
  │           ├── /dev/sdc  (3.5" HDD 4TB — RAID5 üye)
  │           ├── /dev/sdd  (3.5" HDD 4TB — hot spare)
  │           └── /dev/sde  (2.5" SSD — cache tier)
  ├── eMMC 32GB   → sistem (/) ve /boot
  ├── USB 3.0     → yedekleme
  └── GigE        → ağ erişimi

SAS/SATA genişletici ile HDD yönetimi

bash — sdparm ile disk bilgisi
sudo apt install sdparm smartmontools hddtemp

## HDD bilgisi
smartctl -i /dev/sda | grep -E "Device Model|Firmware|Capacity"

## SMART sağlık durumu
smartctl -H /dev/sda
# SMART overall-health self-assessment: PASSED

## Sıcaklık
smartctl -A /dev/sda | grep Temperature_Celsius

## Tüm diskler için döngü
for d in /dev/sd{a..d}; do
    echo -n "$d: "
    smartctl -H "$d" | grep -o "PASSED\|FAILED"
done

06 Disk arızası — tespit ve hot-spare

RAID dizisinde disk arızası gerçek zamanlı tespit edilmeli ve hot-spare varsa yeniden oluşturma otomatik başlamalıdır. mdadm bildirimleri ve kernel syslog entegrasyonu kritiktir.

Disk arızası simülasyonu ve hot-spare

bash — arıza senaryosu
## Disk arızasını simüle et (TEST amaçlı)
mdadm --fail /dev/md1 /dev/sdb1

## Durum kontrol — disk F (failed) işaretlendi
cat /proc/mdstat
# md1 : active raid5 sdd1[3] sdc1[1] sdb1[0](F)
#       1953536000 blocks level 5 [3/2] [_UU]

## Başarısız diski kaldır
mdadm --remove /dev/md1 /dev/sdb1

## Hot-spare ekle (mevcut hot-spare yoksa)
mdadm --add /dev/md1 /dev/sdd1
# mdadm: added /dev/sdd1 — rebuild başlar otomatik

## Yeniden oluşturma ilerlemesi
cat /proc/mdstat
# [===>.................]  recovery = 15.8%
#  finish=47.2min speed=148K/sec

mdadm bildirimleri — e-posta ve systemd

/etc/mdadm/mdadm.conf — bildirim
MAILADDR root@localhost
MAILFROM mdadm@nas.local
PROGRAM /usr/local/bin/raid_alert.sh
/usr/local/bin/raid_alert.sh
#!/bin/bash
# mdadm tarafından olay bildiriminde çalıştırılır
# $1 = event türü, $2 = md cihazı, $3 = disk (opsiyonel)

EVENT="$1"
DEVICE="$2"
COMPONENT="$3"

SUBJECT="RAID Olayı: $EVENT on $DEVICE"
BODY="Olay: $EVENT\nCihaz: $DEVICE\nBileşen: $COMPONENT\nZaman: $(date)\n\n$(mdadm --detail $DEVICE)"

echo -e "$BODY" | mail -s "$SUBJECT" root@localhost
logger -t raid-alert "Event=$EVENT Device=$DEVICE Component=$COMPONENT"

07 RAID yeniden oluşturma (rebuild) izleme

Büyük disk dizilerinde yeniden oluşturma saatler sürebilir. Süreç izleme, kalan süre tahmini ve I/O önceliklendirme kritik yönetim görevleridir.

Yeniden oluşturma hızı optimizasyonu

bash — rebuild hızı ayarlama
## Mevcut sync hızı
cat /proc/sys/dev/raid/speed_limit_min
cat /proc/sys/dev/raid/speed_limit_max

## Rebuild süresini kısaltmak için hız artır (üretim I/O'sundan çal)
echo 100000 > /proc/sys/dev/raid/speed_limit_min  # 100 MB/s minimum
echo 200000 > /proc/sys/dev/raid/speed_limit_max  # 200 MB/s maximum

## Sadece geceleri hızlı rebuild (cron ile)
# Gece: hızlı
echo "0 22 * * * root echo 200000 > /proc/sys/dev/raid/speed_limit_min" \
  >> /etc/cron.d/raid_speed
# Gündüz: yavaş (üretim öncelikli)
echo "0 8 * * * root echo 10000 > /proc/sys/dev/raid/speed_limit_min" \
  >> /etc/cron.d/raid_speed

Python ile rebuild izleme script'i

raid_monitor.py
import re, time

def parse_mdstat():
    arrays = {}
    with open("/proc/mdstat") as f:
        content = f.read()

    blocks = re.split(r'\n(?=md)', content)
    for block in blocks:
        m = re.search(r'^(md\d+)', block, re.M)
        if not m:
            continue
        name = m.group(1)

        state_m = re.search(r'\[([U_]+)\]', block)
        state   = state_m.group(1) if state_m else "?"

        sync_m  = re.search(r'(\w+)\s*=\s*([\d.]+)%\s*'
                            r'finish=([\d.]+)(min|hour)', block)
        if sync_m:
            arrays[name] = {
                "state":    state,
                "op":       sync_m.group(1),
                "pct":      float(sync_m.group(2)),
                "finish":   f"{sync_m.group(3)}{sync_m.group(4)}",
            }
        else:
            arrays[name] = {"state": state, "op": "idle", "pct": 100.0}
    return arrays

while True:
    for name, info in parse_mdstat().items():
        print(f"{name}: {info['state']}  {info['op']} "
              f"{info['pct']:.1f}%  finish={info.get('finish','—')}")
    time.sleep(30)

08 Performans kıyaslama ve ayarlama

RAID dizisi performansı, stripe size, read-ahead, I/O scheduler ve dosya sistemi seçimine göre önemli ölçüde değişir.

fio ile kıyaslama

bash — fio RAID kıyaslaması
## Sıralı okuma/yazma (RAID5, 3 disk)
fio --filename=/dev/md1 \
    --direct=1 \
    --rw=read \
    --bs=1M \
    --ioengine=libaio \
    --iodepth=32 \
    --numjobs=1 \
    --size=10G \
    --name=seq_read \
    --output-format=terse

## Rastgele okuma (IOPS testi)
fio --filename=/mnt/raid5/test \
    --direct=1 \
    --rw=randread \
    --bs=4K \
    --ioengine=libaio \
    --iodepth=64 \
    --numjobs=4 \
    --size=1G \
    --name=rand_read

Tipik kıyaslama sonuçları

Performans Tablosu — 4TB HDD × 3, RAID5
İş yükü           Seq Read  Seq Write  RandR(4K)  RandW(4K)
──────────────────────────────────────────────────────────────
RAID5 (HDD)       380 MB/s  220 MB/s    2.1K IOPS   1.2K IOPS
RAID10 (HDD)      380 MB/s  300 MB/s    3.8K IOPS   2.8K IOPS
RAID5 (SSD)       1.8 GB/s  900 MB/s  320K IOPS  180K IOPS
RAID10 (SSD)      2.4 GB/s  1.5 GB/s  480K IOPS  380K IOPS

I/O scheduler ayarlama

bash
## HDD için mq-deadline önerilir
echo mq-deadline > /sys/block/sda/queue/scheduler
echo mq-deadline > /sys/block/sdb/queue/scheduler

## SSD için none (NVMe) veya mq-deadline
echo none > /sys/block/nvme0n1/queue/scheduler

## read-ahead artır (sıralı yük için)
blockdev --setra 65536 /dev/md1   # 32 MB

## stripe cache (RAID5/6)
echo 8192 > /sys/block/md1/md/stripe_cache_size

09 Prometheus ile RAID sağlık izleme

Prometheus node_exporter, mdstat bilgilerini otomatik toplar. Özel metrikleri textfile collector ile eklenerek Grafana dashboard ve AlertManager entegrasyonu yapılır.

node_exporter kurulum ve mdstat

bash
## node_exporter — mdstat collector varsayılan aktif
./node_exporter --collector.mdadm

## Prometheus metrik örnekleri
# node_md_state{device="md0"} 1  (1=aktif, 0=inaktif)
# node_md_disks{device="md0",state="active"} 2
# node_md_disks{device="md0",state="failed"} 0
# node_md_disks{device="md0",state="spare"}  1
# node_md_sync_completed{device="md0"}       1  (1=tamamlandı)
# node_md_sync_speed_bytes_per_second{device="md0"} 0

Özel SMART metrik collector

smart_collector.sh
#!/bin/bash
OUTPUT="/var/lib/node_exporter/textfile_collector/smart.prom"
TMP=$(mktemp)

echo "# HELP disk_smart_health Disk SMART health (1=OK, 0=FAIL)" > "$TMP"
echo "# TYPE disk_smart_health gauge" >> "$TMP"
echo "# HELP disk_temperature_celsius Disk temperature" >> "$TMP"
echo "# TYPE disk_temperature_celsius gauge" >> "$TMP"

for dev in /dev/sd{a..h}; do
    [ -b "$dev" ] || continue
    model=$(smartctl -i "$dev" 2>/dev/null | \
            awk '/Device Model/{print $3,$4}')
    health=$(smartctl -H "$dev" 2>/dev/null | \
             grep -c PASSED)
    temp=$(smartctl -A "$dev" 2>/dev/null | \
           awk '/Temperature_Celsius/{print $10}')

    label="device=\"$dev\",model=\"$model\""
    echo "disk_smart_health{$label} ${health:-0}"   >> "$TMP"
    echo "disk_temperature_celsius{$label} ${temp:-0}" >> "$TMP"
done

mv "$TMP" "$OUTPUT"

AlertManager kuralları

raid_alerts.yaml
groups:
- name: raid
  rules:
  - alert: RAIDDegradedArray
    expr: node_md_disks{state="failed"} > 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "RAID dizisi bozuldu: {{ $labels.device }}"
      description: "{{ $value }} disk arızalı"

  - alert: RAIDRebuildInProgress
    expr: node_md_sync_completed{} == 0
    for: 0m
    labels:
      severity: warning
    annotations:
      summary: "RAID yeniden oluşturma devam ediyor"

  - alert: DiskHighTemperature
    expr: disk_temperature_celsius > 55
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Disk sıcaklığı yüksek: {{ $labels.device }}"