Azure VM Disk ve Depolama Yönetimi: Kapsamlı Rehber
Bulut ortamında disk yönetimi, birçok sysadmin için göründüğünden daha karmaşık bir konu. Azure’da bir VM ayağa kaldırdığınızda işin aslında yarısını tamamlamış oluyorsunuz; asıl iş diskleri doğru yapılandırmak, performansı optimize etmek ve maliyetleri kontrol altında tutmak. Bu yazıda Azure VM disk yönetimini tüm detaylarıyla ele alacağız, gerçek dünya senaryolarıyla pratik bilgiler paylaşacağız.
Azure Disk Türleri ve Ne Zaman Hangisini Seçmelisiniz
Azure’da dört temel disk türü var ve bunları doğru seçmek hem performans hem de maliyet açısından kritik.
Ultra Disk: Milisaniyenin altında gecikme süreleri gerektiren iş yükleri için. SAP HANA, üst düzey SQL Server veritabanları gibi senaryolar için düşünün. Pahalı ama gerçekten ihtiyacınız varsa değer.
Premium SSD v2: Ultra Disk’in daha esnek versiyonu. IOPS ve throughput değerlerini bağımsız olarak ayarlayabiliyorsunuz. Orta-üst segment veritabanı workload’ları için ideal.
Premium SSD: Üretim ortamları için standart tercih. Çoğu kurumsal iş yükü için yeterli performansı makul maliyetle sunuyor.
Standard SSD: Geliştirme ortamları, düşük trafikli web sunucuları, test makineleri için uygun.
Standard HDD: Yedekleme diskleri, arşiv verileri, kritik olmayan iş yükleri için. Maliyeti en düşük seçenek.
Çoğu zaman production VM’leriniz için Premium SSD ile başlayıp gözlemlemenizi öneririm. Ultra Disk için gerçekten ihtiyacınız olup olmadığını metriklerle kanıtlamadan geçmeyin, fiyat farkı ciddi.
Azure CLI ile Disk Yönetimi
PowerShell veya Portal kullanabilirsiniz ama Azure CLI’ı öğrenirseniz çok daha hızlı çalışırsınız. Önce temel komutları görelim.
Mevcut VM’e bağlı diskleri listelemek için:
# VM'e bağlı tüm diskleri görüntüle
az vm show
--resource-group myResourceGroup
--name myVM
--query "storageProfile"
--output json
Yeni bir managed disk oluşturmak:
# 128 GB Premium SSD disk oluştur
az disk create
--resource-group myResourceGroup
--name myDataDisk
--size-gb 128
--sku Premium_LRS
--location eastus
--zone 1
Bu komutu çalıştırırken --zone parametresine dikkat edin. VM’iniz availability zone kullanıyorsa, disk de aynı zone’da olmalı. Farklı zone’larda VM ve disk oluşturursan diski attach edemezsiniz, bu hatayı çok görüyorum.
Diski VM’e bağlamak:
# Oluşturduğun diski VM'e bağla
az vm disk attach
--resource-group myResourceGroup
--vm-name myVM
--name myDataDisk
--lun 1
LUN numarasını dikkatli verin. 0’dan başlar ve her disk için benzersiz olmalı. VM içinde /dev/sdc, /dev/sdd gibi görünürler.
Disk Boyutunu Artırma (Online ve Offline)
Production’da sık karşılaşılan senaryo: Disk doldu, boyutu artırmanız gerekiyor. Azure’da bu işlemi genellikle VM’i durdurmadan yapabilirsiniz ama birkaç koşul var.
Önce diski portaldan veya CLI’dan büyütün:
# Disk boyutunu 128 GB'dan 256 GB'a çıkar
az disk update
--resource-group myResourceGroup
--name myDataDisk
--size-gb 256
Disk Azure tarafında büyütüldükten sonra VM içinde de işlem yapmanız gerekiyor. Linux için:
# Mevcut disk ve partition durumunu kontrol et
lsblk
fdisk -l /dev/sdc
# Partition'ı büyüt (parted kullanarak)
sudo parted /dev/sdc
# parted içinde:
# print -> mevcut durumu gör
# resizepart 1 100% -> partition'ı maksimuma genişlet
# quit
# Dosya sistemini büyüt (ext4 için)
sudo resize2fs /dev/sdc1
# XFS için
sudo xfs_growfs /mount/point
OS diskini büyütmek biraz farklı. Çalışan sistemde OS diskini büyütmek için önce disk boyutunu artırıp ardından:
# OS disk büyütme sonrası (Ubuntu/Debian)
sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1
# RHEL/CentOS için XFS dosya sistemi varsa
sudo growpart /dev/sda 2
sudo xfs_growfs /
Önemli bir not: Disk boyutunu küçültemezsiniz. Azure’da disk downsizing mümkün değil, bu yüzden boyut artırma kararlarınızı düşünerek verin.
Snapshot Alma ve Disk Klonlama
Snapshot’lar, disk yönetiminin olmazsa olmazı. Migration öncesi, büyük bir değişiklik yapmadan önce veya backup stratejinizin parçası olarak kullanabilirsiniz.
# Snapshot al
az snapshot create
--resource-group myResourceGroup
--name myDiskSnapshot
--source myDataDisk
--location eastus
--sku Standard_LRS
# Snapshot'tan yeni disk oluştur
az disk create
--resource-group myResourceGroup
--name myClonedDisk
--source myDiskSnapshot
--sku Premium_LRS
--location eastus
Snapshot’larla ilgili bir gerçek dünya senaryosu paylaşayım. Müşteri ortamında her gece script ile snapshot alıyorduk ve 30 günden eski olanları siliyorduk. Bu basit ama etkili bir yöntem:
#!/bin/bash
# Otomatik snapshot ve temizleme scripti
RESOURCE_GROUP="myResourceGroup"
DISK_NAME="myDataDisk"
RETENTION_DAYS=30
DATE_TAG=$(date +%Y%m%d-%H%M%S)
# Snapshot oluştur
az snapshot create
--resource-group $RESOURCE_GROUP
--name "snap-${DISK_NAME}-${DATE_TAG}"
--source $DISK_NAME
--sku Standard_LRS
--tags "created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" "retention=30days"
echo "Snapshot oluşturuldu: snap-${DISK_NAME}-${DATE_TAG}"
# 30 günden eski snapshot'ları listele ve sil
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%Y-%m-%dT%H:%M:%SZ)
echo "Eski snapshot'lar temizleniyor..."
az snapshot list
--resource-group $RESOURCE_GROUP
--query "[?timeCreated < '${CUTOFF_DATE}'].name"
--output tsv | while read snapshot_name; do
echo "Siliniyor: $snapshot_name"
az snapshot delete
--resource-group $RESOURCE_GROUP
--name "$snapshot_name"
done
echo "Temizleme tamamlandi."
Bu scripti cron’a ekleyip her gece çalıştırabilirsiniz. Ama dikkat: Snapshot maliyetleri de birikir, retention sürenizi ihtiyacınıza göre ayarlayın.
Disk Şifreleme
Uyumluluk gereksinimleri olan ortamlarda (KVKK, ISO 27001, PCI DSS) disk şifreleme zorunlu. Azure’da iki seçenek var.
Azure Disk Encryption (ADE): BitLocker (Windows) veya DM-Crypt (Linux) kullanarak disk içeriğini şifreler. Key Vault ile entegre çalışır.
Server-Side Encryption (SSE): Azure platformu seviyesinde otomatik şifreleme. Tüm managed diskler varsayılan olarak platform-managed key ile şifrelenmiş geliyor. Customer-managed key (CMK) kullanmak isterseniz bunu yapılandırmanız gerekiyor.
CMK ile disk şifreleme:
# Key Vault oluştur
az keyvault create
--name myKeyVault
--resource-group myResourceGroup
--location eastus
--enable-purge-protection true
--enable-soft-delete true
# Şifreleme anahtarı oluştur
az keyvault key create
--vault-name myKeyVault
--name myDiskEncryptionKey
--protection software
# Disk Encryption Set oluştur
az disk-encryption-set create
--name myDiskEncryptionSet
--resource-group myResourceGroup
--location eastus
--key-url $(az keyvault key show
--vault-name myKeyVault
--name myDiskEncryptionKey
--query key.kid
--output tsv)
--source-vault myKeyVault
# DES'in Key Vault'a erişim iznini ver
DES_IDENTITY=$(az disk-encryption-set show
--name myDiskEncryptionSet
--resource-group myResourceGroup
--query identity.principalId
--output tsv)
az keyvault set-policy
--name myKeyVault
--object-id $DES_IDENTITY
--key-permissions wrapkey unwrapkey get
Şifreli disk oluşturmak:
# Encryption Set ile disk oluştur
az disk create
--resource-group myResourceGroup
--name myEncryptedDisk
--size-gb 128
--sku Premium_LRS
--encryption-type EncryptionAtRestWithCustomerKey
--disk-encryption-set myDiskEncryptionSet
Disk Performans Optimizasyonu
Disk Caching Ayarları
OS diski için varsayılan cache modu ReadWrite, veri diskleri için None geliyor. Ama iş yüküne göre değiştirmeniz gerekebilir.
- ReadWrite caching: OS diski için uygundur. Veri kaybı riski var, sadece yazma işlemlerinin toleranslı olduğu durumlarda kullanın.
- ReadOnly caching: Sık okunan ama nadiren yazılan veriler için idealdir. SQL Server veri dosyaları, uygulama binary’leri.
- None: SQL Server log dosyaları gibi sıralı yazma gerektiren ve caching’in fayda sağlamadığı durumlar için.
# Veri diskinin cache modunu değiştir
az vm disk attach
--resource-group myResourceGroup
--vm-name myVM
--name myDataDisk
--lun 1
--caching ReadOnly
Write Accelerator
M-serisi VM’lerde SQL Server log diskleri için Write Accelerator’ı mutlaka aktif edin. Gecikmeyi dramatik şekilde düşürüyor.
# Write Accelerator etkinleştir
az vm update
--resource-group myResourceGroup
--name myVM
--write-accelerator 1=true
IOPS ve Throughput Bursting
Premium SSD diskler belirli koşullarda burst yapabilir. 512 GB ve altı diskler on-demand bursting’i otomatik yapıyor ama bazı boyutlarda bunu manuel etkinleştirmeniz gerekiyor:
# Bursting'i etkinleştir
az disk update
--resource-group myResourceGroup
--name myDataDisk
--enable-bursting true
Disk Taşıma ve Migration Senaryoları
Bir VM’i farklı bir bölgeye taşımak veya bir diski farklı resource group’a almak sık karşılaşılan senaryolar.
# Diski farklı resource group'a taşı
az resource move
--destination-group targetResourceGroup
--ids $(az disk show
--resource-group sourceResourceGroup
--name myDisk
--query id
--output tsv)
Disk bölgeler arası taşınamaz doğrudan. Bunun için snapshot alıp hedef bölgede yeni disk oluşturmanız gerekir:
# Kaynak snapshot'u al
az snapshot create
--resource-group myResourceGroup
--name migrationSnap
--source myDataDisk
--location westeurope
# Snapshot'u hedef bölgeye kopyala (aynı subscription içinde)
SOURCE_SNAP_ID=$(az snapshot show
--resource-group myResourceGroup
--name migrationSnap
--query id
--output tsv)
az snapshot create
--resource-group targetResourceGroup
--name migrationSnap-target
--source $SOURCE_SNAP_ID
--location northeurope
--copy-start true
# Hedef bölgede diskten oluştur
az disk create
--resource-group targetResourceGroup
--name myDataDisk-migrated
--source migrationSnap-target
--location northeurope
--sku Premium_LRS
--copy-start parametresi asenkron kopyalama başlatır. Kopyalanma durumunu kontrol etmek için:
az snapshot show
--resource-group targetResourceGroup
--name migrationSnap-target
--query completionPercent
Unmanaged Disk’ten Managed Disk’e Geçiş
Hala unmanaged disk kullanan VM’leriniz varsa, bir an önce migrate edin. Unmanaged disk’ler storage account limitlerinden etkilenir, yönetimi zordur ve bazı yeni özellikler desteklenmez.
# VM'i durdur (bu işlem için VM kapalı olmalı)
az vm deallocate
--resource-group myResourceGroup
--name myVM
# Managed disk'e convert et
az vm convert
--resource-group myResourceGroup
--name myVM
# VM'i yeniden başlat
az vm start
--resource-group myResourceGroup
--name myVM
Bu işlem genellikle 5-15 dakika sürer, VM boyutuna ve disk sayısına göre değişir. Conversion öncesi mutlaka snapshot alın.
Maliyet Optimizasyonu
Disk maliyetleri fatura kalemleri arasında göz ardı edilen kalemlerden. Birkaç pratik öneri:
Kullanılmayan diskleri silin: VM silindiğinde diskler otomatik silinmez. Yüzlerce GB’lık disklerin aylarca boşta durduğunu çok görüyorum.
# Unattached diskleri listele
az disk list
--query "[?diskState=='Unattached'].{Name:name, Size:diskSizeGb, SKU:sku.name, RG:resourceGroup}"
--output table
# Sahipsiz diskleri temizle (dikkatli olun!)
az disk list
--query "[?diskState=='Unattached'].id"
--output tsv | while read disk_id; do
echo "Silinecek: $disk_id"
# Onay için yorumu kaldırın:
# az disk delete --ids $disk_id --yes
done
Doğru SKU seçin: Geliştirme ortamları için Premium SSD yerine Standard SSD yeterlidir. Aradaki fark büyük bir ortamda aylık yüzlerce dolara ulaşabilir.
Snapshot’ları yönetin: Eski ve gereksiz snapshot’ları düzenli temizleyin.
Reserved capacity kullanın: Uzun vadeli kullanım için disk rezervasyonu yapabilirsiniz, maliyet avantajı sağlar.
LRS vs ZRS vs GRS seçimi: Gerçekten cross-zone redundancy’ye ihtiyacınız yoksa LRS (Locally Redundant Storage) kullanın. ZRS ve GRS daha pahalı.
Disk Monitoring ve Alerting
Disk problemlerini önceden tespit etmek için monitoring şart.
Azure Monitor ile disk metriklerini izlemek:
# Son 1 saatin disk IOPS metriklerini çek
az monitor metrics list
--resource $(az disk show
--resource-group myResourceGroup
--name myDataDisk
--query id
--output tsv)
--metric "Composite Disk Read Operations/sec"
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
--interval PT5M
--output table
Alert kuralı oluşturmak:
# Disk IOPS %90'ı aştığında uyar
az monitor metrics alert create
--name "High-Disk-IOPS-Alert"
--resource-group myResourceGroup
--scopes $(az disk show
--resource-group myResourceGroup
--name myDataDisk
--query id
--output tsv)
--condition "avg Composite Disk Read Operations/sec > 4500"
--window-size 5m
--evaluation-frequency 1m
--severity 2
--action myActionGroup
VM içinden disk performansını izlemek için:
# iostat ile anlık disk I/O izleme
iostat -xz 5 10
# iotop ile process bazlı disk kullanımı
sudo iotop -o -d 5
# dstat ile kapsamlı sistem metrikler
dstat -dnyc --disk-stat 5
Gerçek Dünya Senaryosu: E-ticaret Platformu Disk Optimizasyonu
Bir e-ticaret müşterisinin Azure ortamını optimize ederken karşılaştığım durumu paylaşayım. MySQL veritabanı çalıştıran VM’lerde yoğun kampanya dönemlerinde ciddi I/O sorunları yaşanıyordu.
Analiz sonucu şunları tespit ettik:
- OS diski üzerinde MySQL veri dosyaları duruyordu (yanlış)
- Tek bir Premium SSD disk her şeyi taşıyordu
- Write caching kapalıydı, ReadOnly caching de kullanılmıyordu
Uyguladığımız çözüm:
- MySQL data ve log dosyaları ayrı disklere taşındı
- Data diski için ReadOnly caching etkinleştirildi
- Log diski için caching kapalı bırakıldı (Write Ahead Log için doğru)
- Disk striping ile IOPS kapasitesi artırıldı
- VM boyutu IOPS limitini aşmayacak şekilde seçildi
Bu değişikliklerle kampanya dönemlerinde disk I/O latency %60 düştü ve throttling sorunları tamamen ortadan kalktı.
Sonuç
Azure disk yönetimi, doğru yapılandırıldığında hem performans hem de maliyet açısından büyük kazanımlar sağlıyor. Özetlemek gerekirse:
- Disk türü seçimini iş yüküne göre yapın, varsayılanlarla devam etmeyin
- Snapshot stratejinizi baştan belirleyin, otomasyona alın ve eski snapshot’ları temizleyin
- Disk caching ayarlarını iş yüküne göre optimize edin
- Kullanılmayan diskleri düzenli denetimle tespit edip silin
- Monitoring’i disk sorunları büyümeden önce kurun
- Şifrelemeyi compliance gereksinimlerinize göre yapılandırın
CLI’da akıcı olun, script yazın ve her şeyi otomasyona bağlayın. Disk sorunları genellikle sabahın üçünde ortaya çıkar ve o saatte elle yapacağınız işlemler yerine hazır scriptlerinizin olması hem sizi hem de müşteriyi kurtarır.
