GCP Compute Engine Disk ve Depolama Yönetimi

Google Cloud’da disk yönetimi, kullanmaya başladığınızda basit görünür ama production ortamında işler karmaşıklaşınca “keşke daha iyi anlasaydım” dediğiniz konuların başında gelir. Bir VM’in diskini büyütmek, snapshot almak, farklı disk tiplerini doğru seçmek… Bunların hepsi hem performansı hem de maliyeti doğrudan etkiliyor. Bu yazıda GCP Compute Engine disk yönetimini uçtan uca ele alacağız.

GCP Disk Türleri ve Ne Zaman Hangisini Seçmelisiniz

GCP’de disk seçimi yanlış yapıldığında ya para yanıyor ya da performans sorunlarıyla boğuşuyorsunuz. Önce mevcut disk türlerini anlayalım.

pd-standard (HDD): Standart manyetik disk. Düşük I/O gerektiren workload’lar, arşiv verileri, dev/test ortamları için ideal. En ucuz seçenek ama IOPS limitleri kısıtlı.

pd-balanced: SSD tabanlı, pd-ssd ile pd-standard arasında bir denge noktası. Çoğu web uygulaması ve veritabanı için yeterli performansı makul fiyata sunar. Genellikle ilk tercihim oluyor.

pd-ssd: Yüksek performanslı SSD. Kritik veritabanları, yüksek I/O gerektiren uygulamalar için. IOPS limitleri pd-balanced’ın yaklaşık 3 katı.

pd-extreme: En yüksek performans, en yüksek fiyat. MySQL, PostgreSQL, SQL Server gibi kritik veritabanları için. IOPS’u manuel olarak ayarlayabilirsiniz.

hyperdisk-balanced, hyperdisk-extreme, hyperdisk-throughput: Yeni nesil disk ailesi. Kapasite ve performansı birbirinden bağımsız ayarlayabilmeniz büyük avantaj. Özellikle büyük ölçekli deployment’larda maliyet optimizasyonu sağlıyor.

Pratik bir kural: Boot diski için pd-balanced yeterli, veritabanı için pd-ssd veya pd-extreme değerlendirin, log ve arşiv için pd-standard tercih edin.

Disk Oluşturma ve VM’e Bağlama

gcloud ile Disk Oluşturma

# Temel disk oluşturma
gcloud compute disks create my-data-disk 
  --size=100GB 
  --type=pd-ssd 
  --zone=us-central1-a

# Snapshot'tan disk oluşturma
gcloud compute disks create my-restored-disk 
  --source-snapshot=my-snapshot-name 
  --zone=us-central1-a

# Image'dan disk oluşturma
gcloud compute disks create my-boot-disk 
  --image-family=debian-11 
  --image-project=debian-cloud 
  --size=50GB 
  --type=pd-balanced 
  --zone=us-central1-a

Mevcut VM’e Disk Bağlama

Bir disk oluşturduktan sonra çalışan bir VM’e bağlamak için VM’i durdurmaya gerek yok. GCP hot-attach destekliyor.

# Çalışan VM'e disk bağlama (read-write)
gcloud compute instances attach-disk my-instance 
  --disk=my-data-disk 
  --zone=us-central1-a

# Read-only modda bağlama (birden fazla VM'e aynı diski bağlamak için)
gcloud compute instances attach-disk my-instance 
  --disk=my-data-disk 
  --mode=ro 
  --zone=us-central1-a

# Disk bağlandıktan sonra Linux içinde disk listesini görme
lsblk

Disk bağlandıktan sonra OS içinde görünür hale gelir ama henüz kullanılabilir değildir. Format atıp mount etmek gerekiyor.

# Yeni disk üzerinde partition oluşturma ve formatla
sudo parted /dev/sdb --script mklabel gpt mkpart primary ext4 0% 100%
sudo mkfs.ext4 -F /dev/sdb1

# Mount noktası oluştur ve bağla
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data

# Otomatik mount için fstab'a ekle
echo UUID=$(sudo blkid -s UUID -o value /dev/sdb1) /mnt/data ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab

nofail parametresi kritik. Disk mount edilemese bile sistemin boot etmeye devam etmesini sağlar.

Disk Boyutunu Artırma (Online Resize)

Benim en çok kullandığım senaryolardan biri bu. Production sistemde disk dolduğunda, VM’i durdurmadan diski büyütebiliyorsunuz.

# Önce mevcut disk boyutunu kontrol et
gcloud compute disks describe my-data-disk 
  --zone=us-central1-a 
  --format="get(sizeGb)"

# Diski 200GB'a büyüt (küçültemezsiniz, dikkat!)
gcloud compute disks resize my-data-disk 
  --size=200GB 
  --zone=us-central1-a

GCP tarafında resize işlemi tamamlandıktan sonra OS içinde de partition’ı ve filesystem’i büyütmek gerekiyor.

# Partition'ı büyüt (growpart aracı gerekiyor)
sudo growpart /dev/sdb 1

# Ext4 filesystem'i online resize et
sudo resize2fs /dev/sdb1

# XFS için (online mount edilmişken)
sudo xfs_growfs /mnt/data

# Sonucu kontrol et
df -h /mnt/data

Bu işlemi yaparken bir şeye dikkat edin: GCP diski büyütürken sizi uyarmıyor ama partition tablosu hala eski boyutu gösteriyor. lsblk ile disk boyutunu, df -h ile filesystem boyutunu kontrol edin. İkisi farklıysa growpart ve resize2fs adımlarını atlamışsınızdır.

Snapshot Yönetimi

Snapshot’lar GCP’de disaster recovery stratejisinin temelini oluşturuyor. Incremental olarak çalışıyorlar yani her snapshot sadece değişen bloklarını saklıyor.

Manuel Snapshot Alma

# Tek disk snapshot'ı
gcloud compute disks snapshot my-data-disk 
  --snapshot-names=my-data-disk-$(date +%Y%m%d) 
  --zone=us-central1-a 
  --description="Production veritabanı backup - $(date)"

# VM'deki tüm disklerin snapshot'ını al
gcloud compute instances describe my-instance 
  --zone=us-central1-a 
  --format="get(disks[].source)" | 
  tr ';' 'n' | 
  awk -F'/' '{print $NF}' | 
  while read disk; do
    gcloud compute disks snapshot "$disk" 
      --snapshot-names="$disk-$(date +%Y%m%d-%H%M)" 
      --zone=us-central1-a
  done

Otomatik Snapshot Policy

Snapshot policy oluşturup disklere atamak çok daha temiz bir yaklaşım. Manuel script yazmak yerine bunu kullanın.

# Günlük snapshot policy oluştur (14 gün retention)
gcloud compute resource-policies create snapshot-schedule daily-backup 
  --region=us-central1 
  --max-retention-days=14 
  --on-source-disk-delete=keep-auto-snapshots 
  --daily-schedule 
  --start-time=02:00 
  --storage-location=us

# Policy'yi diske ata
gcloud compute disks add-resource-policies my-data-disk 
  --resource-policies=daily-backup 
  --zone=us-central1-a

# Mevcut snapshot'ları listele
gcloud compute snapshots list 
  --filter="sourceDisk:my-data-disk" 
  --sort-by=~creationTimestamp 
  --limit=10

Snapshot’tan Disk Restore Etme

# Snapshot'tan yeni disk oluştur
gcloud compute disks create restored-data-disk 
  --source-snapshot=my-data-disk-20241015 
  --zone=us-central1-a 
  --type=pd-ssd

# Eski diski detach et, yeni diski attach et
gcloud compute instances detach-disk my-instance 
  --disk=my-data-disk 
  --zone=us-central1-a

gcloud compute instances attach-disk my-instance 
  --disk=restored-data-disk 
  --zone=us-central1-a

Regional Persistent Disk ile Yüksek Erişilebilirlik

Standart persistent disk tek bir zone’da yaşıyor. Zone çökerse disk de erişilemiyor. Kritik workload’lar için regional persistent disk kullanın.

# Regional disk oluştur (iki zone'da replike edilir)
gcloud compute disks create my-regional-disk 
  --type=pd-balanced 
  --size=200GB 
  --region=us-central1 
  --replica-zones=us-central1-a,us-central1-b

# Regional diski VM'e bağlarken zone belirtmek yerine region kullanın
gcloud compute instances attach-disk my-instance 
  --disk=my-regional-disk 
  --disk-scope=regional 
  --zone=us-central1-a

Regional disk kullanırken bir zone’daki VM çökerse, aynı region’daki başka bir zone’da yeni VM başlatıp aynı diski oraya bağlayabilirsiniz. Failover süresi dakikalar mertebesinde.

Disk Performansını Optimize Etme ve İzleme

IOPS ve Throughput Hesaplama

GCP’de disk performansı sadece disk tipine değil, disk boyutuna da bağlı. Küçük disk oluşturduğunuzda düşük IOPS alırsınız.

pd-ssd için kaba hesap: Her GB başına 0.48 okuma IOPS ve 0.48 yazma IOPS. 100GB disk için 48 IOPS, 1TB için 480 IOPS (maksimum limitlere kadar).

# Disk I/O performansını test etme (fio ile)
sudo apt-get install -y fio

# Sequential read testi
sudo fio --name=seq-read 
  --ioengine=libaio 
  --iodepth=1 
  --rw=read 
  --bs=1M 
  --direct=1 
  --size=1G 
  --numjobs=1 
  --filename=/dev/sdb 
  --runtime=60 
  --group_reporting

# Random IOPS testi
sudo fio --name=rand-write 
  --ioengine=libaio 
  --iodepth=32 
  --rw=randwrite 
  --bs=4k 
  --direct=1 
  --size=1G 
  --numjobs=4 
  --filename=/dev/sdb 
  --runtime=60 
  --group_reporting

Cloud Monitoring ile Disk Metrikleri

# gcloud ile disk I/O metriklerini sorgulama
gcloud monitoring metrics list 
  --filter="metric.type:compute.googleapis.com/instance/disk"

# Son 1 saatin disk okuma byte'larını al
gcloud monitoring time-series list 
  --filter='metric.type="compute.googleapis.com/instance/disk/read_bytes_count" AND resource.labels.instance_id="INSTANCE_ID"' 
  --interval-start-time=$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) 
  --interval-end-time=$(date -u +%Y-%m-%dT%H:%M:%SZ)

Cloud Console’da Monitoring bölümünden disk I/O grafiklerini görsel olarak incelemek çok daha pratik. Özellikle ani spike’ları görmek için kullanın.

Disk Şifreleme

GCP defaultta Google tarafından yönetilen anahtarlarla tüm diskleri şifreliyor. Ama uyumluluk gereksinimleri varsa kendi anahtarlarınızı kullanmak isteyebilirsiniz.

Customer-Managed Encryption Keys (CMEK)

# Cloud KMS'te keyring ve key oluştur
gcloud kms keyrings create my-keyring 
  --location=us-central1

gcloud kms keys create my-disk-key 
  --location=us-central1 
  --keyring=my-keyring 
  --purpose=encryption

# Key'in full resource name'ini al
KEY_NAME=$(gcloud kms keys describe my-disk-key 
  --location=us-central1 
  --keyring=my-keyring 
  --format="get(name)")

# CMEK ile disk oluştur
gcloud compute disks create encrypted-disk 
  --size=100GB 
  --type=pd-ssd 
  --zone=us-central1-a 
  --kms-key=$KEY_NAME

# Compute Engine service account'una KMS yetkisi ver
SERVICE_ACCOUNT=$(gcloud iam service-accounts list 
  --filter="email:service-*compute*" 
  --format="get(email)")

gcloud kms keys add-iam-policy-binding my-disk-key 
  --location=us-central1 
  --keyring=my-keyring 
  --member="serviceAccount:$SERVICE_ACCOUNT" 
  --role=roles/cloudkms.cryptoKeyEncrypterDecrypter

Customer-supplied encryption keys (CSEK) de var ama key yönetimi sizin sorumluluğunuzda olduğu için CMEK genellikle daha güvenli tercih.

Disk Maliyetini Optimize Etme

Kullanılmayan Diskleri Tespit Etme

# Herhangi bir VM'e bağlı olmayan diskleri bul
gcloud compute disks list 
  --filter="NOT users:*" 
  --format="table(name,zone,sizeGb,type,status)"

# Oluşturulalı 30 günden fazla olan ve bağlı olmayan diskler
gcloud compute disks list 
  --filter="NOT users:* AND creationTimestamp<'$(date -d '30 days ago' +%Y-%m-%d)'" 
  --format="table(name,zone,sizeGb,type)"

Kullanılmayan diskler için biriken maliyeti çoğu zaman görmüyorsunuz. Bir VM sildiğinizde disk silinmez, orada kalmaya devam eder ve her ay para ödersiniz. Bu listeyi düzenli çalıştırın.

Snapshot Maliyetini Optimize Etme

# Büyük snapshot'ları listele
gcloud compute snapshots list 
  --sort-by=~storageBytes 
  --format="table(name,diskSizeGb,storageBytes,creationTimestamp)" 
  --limit=20

# Belirli snapshot'ları sil
gcloud compute snapshots delete old-snapshot-name --quiet

# 30 günden eski snapshot'ları toplu sil (dikkatli kullanın!)
gcloud compute snapshots list 
  --filter="creationTimestamp<'$(date -d '30 days ago' +%Y-%m-%d)'" 
  --format="get(name)" | 
  while read snapshot; do
    echo "Siliniyor: $snapshot"
    gcloud compute snapshots delete "$snapshot" --quiet
  done

Disk Tipini Düşürme

Bir disk tipini direkt değiştiremezsiniz ama snapshot alıp farklı tipte yeniden oluşturabilirsiniz.

# Mevcut diskten snapshot al
gcloud compute disks snapshot expensive-ssd-disk 
  --snapshot-names=temp-migration-snapshot 
  --zone=us-central1-a

# Snapshot'tan daha ucuz tipte disk oluştur
gcloud compute disks create cheaper-balanced-disk 
  --source-snapshot=temp-migration-snapshot 
  --type=pd-balanced 
  --zone=us-central1-a

# Test et, sonra eski diski sil
gcloud compute disks delete expensive-ssd-disk 
  --zone=us-central1-a

Gerçek Dünya Senaryosu: Veritabanı Disk Migrasyonu

Üretim ortamında bir PostgreSQL sunucusunun diskini pd-standard’dan pd-ssd’ye geçirmek durumunda kaldım. Downtime’ı minimize etmek için şu yaklaşımı kullandım.

# 1. Mevcut disk snapshot'ı al
gcloud compute disks snapshot postgres-data-disk 
  --snapshot-names=postgres-pre-migration-$(date +%Y%m%d%H%M) 
  --zone=us-central1-a

# 2. Snapshot'tan SSD disk oluştur
gcloud compute disks create postgres-data-ssd 
  --source-snapshot=postgres-pre-migration-$(date +%Y%m%d%H%M) 
  --type=pd-ssd 
  --zone=us-central1-a

# 3. PostgreSQL'i durdur, eski diski unmount et
sudo systemctl stop postgresql
sudo umount /var/lib/postgresql

# 4. Eski diski detach et
gcloud compute instances detach-disk pg-instance 
  --disk=postgres-data-disk 
  --zone=us-central1-a

# 5. Yeni SSD diski attach et
gcloud compute instances attach-disk pg-instance 
  --disk=postgres-data-ssd 
  --zone=us-central1-a

# 6. Mount et ve PostgreSQL'i başlat
sudo mount /dev/sdb1 /var/lib/postgresql
sudo systemctl start postgresql

# 7. Kontrol et
sudo systemctl status postgresql
psql -U postgres -c "SELECT version();"

Toplam downtime 3-4 dakika oldu. Snapshot alma süresi downtime dışında gerçekleşti.

Disk Bağlama Sorunlarını Giderme

Zaman zaman disk bağlama veya mount sorunlarıyla karşılaşırsınız.

# Diske ait device'ı bul
ls -la /dev/disk/by-id/ | grep google

# dmesg'de disk ile ilgili hataları görüntüle
sudo dmesg | grep -i "sd[a-z]" | tail -20

# Filesystem tutarsızlığını kontrol et ve düzelt
sudo e2fsck -f /dev/sdb1

# Mount noktasının kullanımda olmadığını doğrula
sudo fuser -m /mnt/data
sudo lsof | grep /mnt/data

# Zorla unmount (son çare)
sudo umount -l /mnt/data

Bir disk mount edilemiyorsa büyük ihtimalle başka bir süreç kullanıyor ya da filesystem hatası var. e2fsck çoğu durumda sorunu çözüyor.

Sonuç

GCP disk yönetimi, doğru yapılandırıldığında hem güvenilir hem de maliyet etkin bir altyapının temelini oluşturuyor. Özetleyecek olursak:

  • Disk tipi seçimi workload’a göre yapın, her şeye pd-ssd koymak bütçeyi eritir
  • Snapshot policy oluşturun ve disklere atayın, manuel backup scriptleri kırılgan
  • Kullanılmayan diskleri düzenli olarak temizleyin, maliyetin önemli bir kısmı oradan geliyor
  • Regional disk kullanmak yüksek erişilebilirlik gerektiren sistemler için ekstra maliyet değil, zorunluluk
  • nofail parametresini her zaman fstab’a ekleyin, gece 3’te boot sorunu istemezsiniz
  • Online resize mümkün ama hem GCP tarafı hem OS tarafı için ayrı adımlar gerektiğini unutmayın

Disk yönetimi genellikle bir problem çıkana kadar göz ardı edilen konulardan. Ama proaktif bir yaklaşımla hem maliyeti düşürebilir hem de olası felaket senaryolarına hazırlıklı olabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir