DigitalOcean Ubuntu 16.04 Droplet’lerinde Web Uygulamanızın Ölçeklendirmesini Otomatikleştirmek
Giriş: Otomatik Ölçeklendirme Neden Önemli?
Modern web uygulamaları, kullanıcı taleplerindeki ani artışlar veya düşüşlerle başa çıkmak zorundadır. Bir e-ticaret sitesinin Kara Cuma indirimi sırasında yaşadığı trafik patlaması ya da bir haber sitesinin gündemdeki sıcak bir gelişmeyle aniden popülerleşmesi gibi senaryolarda, uygulamanın performansını ve kullanılabilirliğini korumak hayati önem taşır. Geleneksel olarak, bu tür durumlar için sunucu kapasitesini manuel olarak artırmak veya azaltmak, zaman alıcı, hataya açık ve verimsiz bir süreçtir. Bu noktada, otomatik ölçeklendirme devreye girer.
Otomatik ölçeklendirme, bir uygulamanın veya hizmetin değişen iş yüküne göre kaynaklarını (sunucular, veritabanları vb.) dinamik olarak ayarlama yeteneğidir. Bu, uygulamanızın her zaman yeterli kaynağa sahip olmasını sağlarken, aynı zamanda gereksiz kaynak kullanımını önleyerek maliyetleri optimize eder. DigitalOcean gibi bulut sağlayıcıları, bu süreci kolaylaştırmak için güçlü API’ler ve entegre hizmetler sunar. Ubuntu 16.04 Droplet’leri üzerinde çalışan bir web uygulamasının otomatik ölçeklendirmesini ele alırken, bu eski işletim sistemi sürümünün bazı güncel yaklaşımlarla tam uyumlu olmayabileceğini, ancak temel prensiplerin aynı kaldığını belirtmek önemlidir. Güvenlik ve performans için her zaman daha güncel Ubuntu sürümlerini (örneğin 20.04 veya 22.04) kullanmanız şiddetle tavsiye edilir.
Otomatik ölçeklendirmenin temel faydaları şunlardır:
* Performans ve Kullanılabilirlik: Yüksek trafik anlarında bile uygulamanızın hızlı ve duyarlı kalmasını sağlar, kullanıcı deneyimini iyileştirir.
* Maliyet Optimizasyonu: Sadece ihtiyacınız olan kaynaklar için ödeme yapmanızı sağlar. Düşük trafik dönemlerinde gereksiz sunucuları kapatarak maliyetleri düşürür.
* Esneklik ve Çeviklik: Uygulamanızın değişen taleplere hızla uyum sağlamasına olanak tanır, geliştiricilerin altyapı yönetiminden çok uygulama geliştirmeye odaklanmasını sağlar.
* Hata Toleransı: Bir sunucunun çökmesi durumunda, otomatik ölçeklendirme yeni bir sunucuyu hızla devreye alarak hizmet kesintisini minimize edebilir.
Ölçeklendirme Temelleri: Dikey ve Yatay Yaklaşımlar
Web uygulamalarını ölçeklendirmenin iki ana yolu vardır: dikey ve yatay ölçeklendirme. Otomatik ölçeklendirme genellikle yatay yaklaşıma odaklanır.
Dikey Ölçeklendirme (Vertical Scaling)
Dikey ölçeklendirme, mevcut bir sunucunun kaynaklarını (CPU, RAM, depolama) artırarak kapasitesini yükseltmektir. Örneğin, bir Droplet’i daha güçlü bir pakete yükseltmek dikey ölçeklendirmedir.
Avantajları:
* Uygulama mimarisinde genellikle daha az değişiklik gerektirir.
* Tek bir sunucuyu yönetmek daha basittir.
Dezavantajları:
* Tek bir sunucunun ulaşabileceği bir üst sınır vardır. Sonsuz ölçeklenemez.
* Yükseltme sırasında genellikle kısa bir kesinti yaşanır.
* Tek bir hata noktası oluşturur; sunucu çökerse uygulama tamamen çevrimdışı kalır.
* Maliyetleri hızla artırabilir, çünkü daha büyük sunucular orantısız şekilde daha pahalı olabilir.
Yatay Ölçeklendirme (Horizontal Scaling)
Yatay ölçeklendirme, mevcut sunucuların kaynaklarını artırmak yerine, sisteme daha fazla sunucu (Droplet) ekleyerek kapasiteyi genişletmektir. Yük dengeleyiciler (Load Balancers) gelen trafiği bu sunucular arasında dağıtır.
Avantajları:
* Neredeyse sınırsız ölçeklenebilirlik potansiyeli sunar.
* Hata toleransını artırır; bir sunucu çökerse diğerleri hizmet vermeye devam eder.
* Maliyet etkinliği sağlar, çünkü ihtiyaca göre küçük sunucular ekleyip çıkarabilirsiniz.
* Kesintisiz yükseltmeler ve bakımlar için daha uygundur.
Dezavantajları:
* Uygulamanın durumsuz (stateless) olması gerekir.
* Daha karmaşık bir altyapı yönetimi ve dağıtım gerektirir.
* Yük dengeleyici ve paylaşımlı depolama gibi ek bileşenler gerektirir.
Durumsuz (Stateless) ve Durumlu (Stateful) Uygulamalar
Yatay ölçeklendirme için uygulamanızın durumsuz olması kritik bir öneme sahiptir. Durumsuz bir uygulama, her isteği bağımsız olarak işler ve önceki isteklerden veya belirli bir sunucunun yerel durumundan herhangi bir bilgiye ihtiyaç duymaz. Kullanıcı oturum bilgileri, alışveriş sepeti verileri gibi durum bilgileri, merkezi bir veritabanı (PostgreSQL, MySQL), bir önbellek (Redis, Memcached) veya bir oturum deposu (örneğin, veritabanı destekli oturumlar) gibi harici bir depolama mekanizmasında tutulmalıdır.
Durumlu bir uygulama ise, belirli bir sunucuya bağlı kalır ve o sunucunun yerel belleğinde veya dosya sisteminde durum bilgileri tutar. Bu tür uygulamalar, yatay ölçeklendirme için uygun değildir, çünkü bir kullanıcı bir sunucuya bağlandıktan sonra, başka bir sunucuya yönlendirilirse önceki durum bilgilerini kaybedebilir.
Veritabanları genellikle durumlu bileşenlerdir. Bunları yatay olarak ölçeklendirmek daha karmaşıktır (örneğin, okuma replikaları, sharding) ve genellikle yönetilen hizmetler (DigitalOcean Managed Databases) kullanılarak veya ayrı bir uzmanlık gerektiren çözümlerle ele alınır.
DigitalOcean Ortamının Temel Bileşenleri
DigitalOcean, web uygulamalarınızı ölçeklendirmek için bir dizi hizmet sunar.
Droplet’ler (Ubuntu 16.04)
Droplet’ler, DigitalOcean’ın sanal özel sunucularıdır (VPS). Web uygulamanızın kodunu ve bağımlılıklarını barındıracak temel işlem birimleridir. İstek gereksinimi arttığında yeni Droplet’ler oluşturulur, azaldığında ise kaldırılır. Ubuntu 16.04, uzun zaman önce yaşam döngüsünün sonuna (End of Life – EOL) ulaşmış bir işletim sistemi sürümüdür. Güvenlik güncellemeleri almadığı için üretim ortamlarında kullanılması risklidir. Ancak bu makalenin konusu gereği, 16.04 Droplet’leri üzerinde otomasyonu anlatacağız. Temel prensipler daha yeni Ubuntu sürümleriyle de aynıdır.
Yük Dengeleyiciler (Load Balancers)
Yük dengeleyiciler, gelen ağ trafiğini birden fazla Droplet arasında dağıtan kritik bileşenlerdir. Uygulamanızın tek bir hata noktası olmasını engeller ve trafiği Droplet’lerinizin kapasitesine göre eşit şekilde dağıtarak performansı artırır. DigitalOcean Yük Dengeleyiciler, otomatik SSL sonlandırma, sağlık kontrolleri ve farklı dağıtım algoritmaları (round robin, least connections) gibi özellikler sunar. Otomatik ölçeklendirme senaryosunda, yeni oluşturulan Droplet’ler otomatik olarak yük dengeleyiciye eklenmeli, silinenler ise çıkarılmalıdır.
Yönetilen Veritabanları (Managed Databases)
Uygulamanızın durum bilgisini depolayan veritabanları, yatay ölçeklendirme için genellikle ayrı bir katmanda, yönetilen bir hizmet olarak kullanılmalıdır. DigitalOcean, PostgreSQL, MySQL ve Redis gibi popüler veritabanları için yönetilen hizmetler sunar. Bu hizmetler, otomatik yedekleme, replikasyon, ölçeklendirme ve güvenlik gibi karmaşık yönetim görevlerini sizin yerinize halleder. Uygulamanızın Droplet’leri durumsuz kalırken, veritabanınız kendi başına ölçeklenebilir ve yüksek kullanılabilirlik sunar.
DigitalOcean Spaces (Nesne Depolama)
Statik dosyalar (resimler, CSS, JavaScript), kullanıcı yüklemeleri veya uygulama günlükleri gibi veriler için DigitalOcean Spaces gibi bir nesne depolama hizmeti kullanmak önemlidir. Bu, Droplet’lerinizin yerel depolama alanına bağımlılığını ortadan kaldırır ve tüm Droplet’lerin aynı verilere erişmesini sağlar. Spaces, S3 uyumlu bir API sunar ve yüksek ölçeklenebilirlik, dayanıklılık ve düşük maliyet avantajları sunar.
Anlık Görüntüler (Snapshots) ve Yedeklemeler (Backups)
Anlık görüntüler (Snapshots), bir Droplet’in tüm disk içeriğinin bir kopyasıdır. Otomatik ölçeklendirme için, uygulamanızın yüklü ve yapılandırılmış olduğu “altın bir imaj” (golden image) oluşturmak için bir anlık görüntü kullanmak çok etkilidir. Yeni bir Droplet oluşturulduğunda, bu anlık görüntüden başlatılarak hızla kullanıma hazır hale getirilebilir. Yedeklemeler ise felaket kurtarma ve veri kaybını önlemek için düzenli olarak alınan Droplet kopyalarıdır.
Etiketleme (Tagging)
DigitalOcean’da kaynakları (Droplet’ler, Yük Dengeleyiciler vb.) etiketlemek, onları gruplandırmak ve yönetmek için kullanışlı bir yoldur. Otomatik ölçeklendirme senaryosunda, bir web uygulamasının tüm Droplet’lerini belirli bir etiketle (örneğin, web-app-prod) işaretleyebilir ve ölçeklendirme betiğinizin bu etiket üzerinden Droplet’leri bulmasını veya yeni Droplet’leri aynı etiketle oluşturmasını sağlayabilirsiniz.
Otomatik Ölçeklendirme İçin Ön Koşullar ve Uygulama Mimarisi
Otomatik ölçeklendirmeyi başarılı bir şekilde uygulamak için uygulamanızın ve altyapınızın belirli gereksinimleri karşılaması gerekir.
Uygulama Tasarımı İlkeleri
* Durumsuzluk (Statelessness): Daha önce de belirtildiği gibi, uygulamanızın durumsuz olması, her isteği bağımsız olarak işleyebilmesi gerekir. Oturum yönetimi için paylaşımlı bir oturum deposu (Redis, veritabanı) veya JWT (JSON Web Tokens) kullanın.
* Harici Veritabanı ve Önbellek Kullanımı: Uygulama sunucularınızın yerelinde veri depolamaktan kaçının. Tüm kalıcı veriler merkezi bir veritabanında, önbellek verileri ise Redis veya Memcached gibi harici bir önbellek hizmetinde tutulmalıdır.
* Paylaşımlı Dosya Sistemleri: Kullanıcı yüklemeleri, statik varlıklar veya diğer paylaşılan dosyalar için DigitalOcean Spaces, NFS veya başka bir merkezi dosya depolama çözümü kullanın.
* Harici Konfigürasyon: Uygulama ayarları, veritabanı bağlantı dizeleri, API anahtarları gibi konfigürasyon bilgilerini kod içinde tutmak yerine, ortam değişkenleri, konfigürasyon dosyaları veya bir merkezi konfigürasyon yönetimi aracı (örneğin, Consul) aracılığıyla dışarıdan sağlamalısınız. Bu, aynı uygulama imajını farklı ortamlar (geliştirme, test, üretim) için kullanabilmenizi sağlar.
Altyapı Olarak Kod (Infrastructure as Code – IaC)
Otomatik ölçeklendirme, altyapının programatik olarak yönetilmesini gerektirir. Terraform gibi IaC araçları, DigitalOcean kaynaklarını (Droplet’ler, Yük Dengeleyiciler, Veritabanları) kod olarak tanımlamanıza olanak tanır. Bu, altyapınızın versiyon kontrolünü yapmanızı, tekrarlanabilir dağıtımlar gerçekleştirmenizi ve hızlı bir şekilde yeni ortamlar oluşturmanızı sağlar. Ansible veya Cloud-init gibi araçlar ise Droplet’ler oluşturulduktan sonra üzerlerindeki yazılımların otomatik olarak yapılandırılması ve dağıtılması için kullanılır.
Merkezi İzleme ve Günlük Kaydı (Monitoring & Logging)
Otomatik ölçeklendirme kararları, uygulamanızın ve altyapınızın performans metriklerine dayanır.
* İzleme: DigitalOcean Monitoring, Droplet’lerinizin CPU kullanımı, RAM kullanımı, disk I/O ve ağ trafiği gibi temel metriklerini toplar. Bu metrikler üzerinden eşik değerler belirleyerek ölçeklendirme tetikleyicileri oluşturabilirsiniz. Prometheus ve Grafana gibi daha gelişmiş izleme çözümleri de kullanılabilir.
* Günlük Kaydı: Tüm Droplet’lerinizden gelen uygulama ve sistem günlüklerini merkezi bir konumda (ELK Stack – Elasticsearch, Logstash, Kibana; Grafana Loki; veya bir günlük yönetim hizmeti) toplamak, sorun giderme ve uygulama davranışını analiz etmek için önemlidir.
Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD)
Otomatik ölçeklendirme ile birlikte, uygulamanızın yeni sürümlerini Droplet’lere otomatik olarak dağıtmak için bir CI/CD hattı (Jenkins, GitLab CI, GitHub Actions) kullanmak verimliliği artırır. Yeni bir kod değişikliği devreye alındığında, CI/CD hattı otomatik olarak bir test Droplet’i üzerinde testi çalıştırabilir, başarılı olursa yeni bir Droplet anlık görüntüsü oluşturabilir ve bu yeni imajı ölçeklendirme grubunuz için varsayılan olarak ayarlayabilir.
DigitalOcean API ile Ölçeklendirme Mantığı Geliştirme
Otomatik ölçeklendirme, DigitalOcean API’nin gücüne dayanır. Bir betik veya servis, API aracılığıyla DigitalOcean kaynaklarını izler ve yönetir.
DigitalOcean API’nin Gücü
DigitalOcean API, bulut altyapınızı programatik olarak oluşturmanıza, yapılandırmanıza ve yönetmenize olanak tanıyan bir RESTful API’dir. Tüm DigitalOcean hizmetleri (Droplet’ler, Yük Dengeleyiciler, Spaces vb.) API üzerinden erişilebilir ve kontrol edilebilir. Bu, özel otomatik ölçeklendirme çözümleri geliştirmenize olanak tanır. API’ye erişim, kişisel bir erişim token’ı (Personal Access Token) ile sağlanır. Bu token’ın güvenli bir şekilde saklanması ve yönetilmesi çok önemlidir.
Ölçeklendirme Metrikleri ve Eşik Değerleri
Otomatik ölçeklendirme kararları genellikle belirli metriklerin önceden tanımlanmış eşik değerlerini aştığında tetiklenir. Yaygın metrikler şunlardır:
* CPU Kullanımı: Belirli bir süre boyunca (örneğin, 5 dakika) ortalama CPU kullanımının %70’in üzerine çıkması, ölçeklendirme yukarı (scale-up) için bir tetikleyici olabilir. %30’un altına düşmesi ise ölçeklendirme aşağı (scale-down) için.
* RAM Kullanımı: Bellek tükenmesi performansı ciddi şekilde etkileyebilir.
* Ağ Trafiği: Gelen/giden ağ trafiği belirli bir eşiği aştığında.
* İstek Sayısı/Gecikme Süresi: Yük dengeleyici veya uygulama metrikleri üzerinden belirli bir süre içinde gelen istek sayısının artması veya yanıt sürelerinin uzaması.
Eşik değerleri, uygulamanızın ve beklenen yükün doğasına göre dikkatlice belirlenmelidir. Çok düşük eşikler gereksiz ölçeklendirmeye, çok yüksek eşikler ise performans düşüşlerine yol açabilir.
Otomatik Ölçekleyici (Autoscaler) Bileşeninin Geliştirilmesi
Otomatik ölçekleyici, DigitalOcean API’sini kullanarak ölçeklendirme kararlarını uygulayan özel bir betik veya servistir. Bu betik, ayrı bir Droplet üzerinde veya sunucusuz bir ortamda (DigitalOcean Functions) çalıştırılabilir.
Temel İşlevleri:
1. Metrikleri Toplama: DigitalOcean Monitoring API’sini kullanarak veya Droplet’ler üzerinde çalışan özel izleme ajanlarından (Prometheus Node Exporter gibi) metrikleri düzenli aralıklarla sorgular.
2. Karar Verme: Toplanan metrikleri önceden tanımlanmış eşik değerleriyle karşılaştırır. Ölçeklendirme yukarı veya aşağı için bir karar verir.
3. API Çağrıları ile Eyleme Geçme:
* Ölçeklendirme Yukarı (Scale-Up):
* Yeni bir Droplet oluşturur (önceden hazırlanmış bir anlık görüntüden).
* Oluşturulan Droplet’e belirli etiketler atar.
* Droplet hazır olduğunda (sağlık kontrolünden geçtiğinde), onu Yük Dengeleyici’nin hedef havuzuna ekler.
* Ölçeklendirme Aşağı (Scale-Down):
* Mevcut Droplet’ler arasında en az yüklü veya en eski Droplet’i belirler.
* Droplet’i Yük Dengeleyici’nin hedef havuzundan çıkarır (bu, mevcut bağlantıların kesilmemesi için önemlidir).
* Belirli bir bekleme süresinden sonra (mevcut isteklerin tamamlanması için), Droplet’i siler.
Örnek Ölçeklendirme Akışı (Pseudocode/Mantıksal Adımlar)
Aşağıda, bir Python betiği ile DigitalOcean API’sinin nasıl kullanılabileceğine dair basitleştirilmiş bir akış gösterilmiştir:
import digitalocean
import time
DigitalOcean API Token'ınızı buraya ekleyin
DO_TOKEN = "YOUR_DIGITALOCEAN_API_TOKEN"
manager = digitalocean.Manager(token=DO_TOKEN)
LOAD_BALANCER_ID = "YOUR_LOAD_BALANCER_ID" # Yük Dengeleyici ID'si
SNAPSHOT_ID = "YOUR_SNAPSHOT_ID" # Altın imajınızın ID'si
REGION = "nyc3" # Droplet'lerin oluşturulacağı bölge
SIZE_SLUG = "s-1vcpu-1gb" # Droplet boyutu
APP_TAG = "web-app-prod" # Uygulama Droplet'leri için etiket
MIN_DROPLETS = 2
MAX_DROPLETS = 10
CPU_THRESHOLD_UP = 70 # %70 CPU kullanımı üzerinde scale-up
CPU_THRESHOLD_DOWN = 30 # %30 CPU kullanımı altında scale-down
CHECK_INTERVAL = 60 # Saniye cinsinden kontrol aralığı
def get_current_droplets():
# Belirli bir etikete sahip Droplet'leri getir
all_droplets = manager.get_all_droplets(tag_name=APP_TAG)
return [d for d in all_droplets if d.status == 'active']
def get_droplet_cpu_usage(droplet_id):
# DigitalOcean Monitoring API'sinden CPU kullanımını al (basitleştirilmiş)
# Gerçek uygulamada, bu kısım DigitalOcean Monitoring API'sine veya
# Prometheus/Grafana API'sine yapılan gerçek bir çağrı olacaktır.
# Şimdilik rastgele bir değer döndürelim.
import random
return random.randint(10, 90)
def scale_up():
current_droplets = get_current_droplets()
if len(current_droplets) < MAX_DROPLETS:
print("Ölçeklendirme yukarı: Yeni Droplet oluşturuluyor...")
droplet = digitalocean.Droplet(token=DO_TOKEN,
name=f"web-app-{int(time.time())}",
region=REGION,
image=SNAPSHOT_ID,
size=SIZE_SLUG,
tags=[APP_TAG],
backups=False,
ssh_keys=[]) # SSH anahtarlarınızı buraya ekleyin
droplet.create()
print(f"Droplet oluşturuluyor: {droplet.name} (ID: {droplet.id})")
# Droplet'in aktif olmasını bekle
while droplet.status != 'active':
time.sleep(10)
droplet.load()
print(f"Droplet {droplet.name} aktif. Yük dengeleyiciye ekleniyor...")
# Yük dengeleyiciye Droplet ekleme (doctl veya API ile)
# Bu kısım DigitalOcean API'sinin Load Balancer endpoint'leri ile yapılır.
# Basitlik adına burada doğrudan manager objesi üzerinden bir örnek yok,
# ancak API çağrısı ile yapılabilir.
# Örneğin: manager.get_load_balancer(LOAD_BALANCER_ID).add_droplets([droplet.id])
print(f"Droplet {droplet.id} yük dengeleyiciye eklendi (varsayımsal).")
return True
return False
def scale_down():
current_droplets = get_current_droplets()
if len(current_droplets) > MIN_DROPLETS:
# En az yüklü veya en eski Droplet'i bul (gerçek senaryoda daha akıllıca bir seçim yapılır)
droplet_to_remove = current_droplets[0]
print(f"Ölçeklendirme aşağı: Droplet {droplet_to_remove.name} (ID: {droplet_to_remove.id}) kaldırılıyor...")
# Yük dengeleyiciden Droplet'i çıkar
# manager.get_load_balancer(LOAD_BALANCER_ID).remove_droplets([droplet_to_remove.id])
print(f"Droplet {droplet_to_remove.id} yük dengeleyiciden çıkarıldı (varsayımsal).")
# Graceful shutdown için bekleme süresi
time.sleep(300) # 5 dakika bekle
droplet_to_remove.destroy()
print(f"Droplet {droplet_to_remove.id} silindi.")
return True
return False
def main():
while True:
current_droplets = get_current_droplets()
total_cpu_usage = 0
if not current_droplets:
print("Hiç aktif Droplet bulunamadı. En az Droplet oluşturuluyor...")
scale_up()
time.sleep(CHECK_INTERVAL)
continue
for droplet in current_droplets:
cpu = get_droplet_cpu_usage(droplet.id)
total_cpu_usage += cpu
print(f"Droplet {droplet.name} (ID: {droplet.id}) CPU: {cpu}%")
avg_cpu_usage = total_cpu_usage / len(current_droplets)
print(f"Ortalama CPU kullanımı: {avg_cpu_usage}%")
if avg_cpu_usage > CPU_THRESHOLD_UP:
print("Ortalama CPU yüksek, ölçeklendirme yukarı tetikleniyor.")
scale_up()
elif avg_cpu_usage < CPU_THRESHOLD_DOWN:
print("Ortalama CPU düşük, ölçeklendirme aşağı tetikleniyor.")
scale_down()
else:
print("CPU kullanımı normal sınırlar içinde.")
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
main()
Yukarıdaki kod sadece bir konsepttir ve DigitalOcean API'sinin gerçek kullanımı için python-digitalocean kütüphanesinin ve doctl CLI aracının dokümantasyonuna başvurulmalıdır. Özellikle yük dengeleyiciye Droplet ekleme/çıkarma işlemleri ve metrik toplama kısımları daha detaylı API çağrıları gerektirir.
Adım Adım Otomatik Ölçeklendirme Uygulaması (Konsept)
Şimdi, yukarıdaki bileşenleri ve prensipleri bir araya getirerek otomatik ölçeklendirme çözümünü nasıl uygulayabileceğimize dair adımları inceleyelim.
1. Uygulamanızı Durumsuz Hale Getirin
Bu, otomatik ölçeklendirmenin temelidir.
* Oturum Yönetimi: Oturum verilerini sunucularınızın yerel belleğinde değil, Redis veya veritabanı gibi merkezi bir yerde saklayın.
* Veritabanı: DigitalOcean Managed Databases kullanın veya kendi veritabanı sunucunuzu ayrı bir Droplet'te çalıştırın. Uygulama Droplet'lerinizin sadece veritabanına bağlanmasını sağlayın.
* Dosya Depolama: Kullanıcı yüklemeleri ve statik dosyalar için DigitalOcean Spaces gibi bir nesne depolama hizmeti kullanın.
* Konfigürasyon: Uygulama ayarlarını ortam değişkenleri veya harici konfigürasyon dosyaları aracılığıyla yönetin.
2. Temel Droplet Anlık Görüntüsü Oluşturun (Golden Image)
Bir "golden image" oluşturmak, yeni Droplet'leri hızlı ve tutarlı bir şekilde başlatmanın en verimli yoludur.
* Bir Ubuntu 16.04 Droplet'i oluşturun.
* Uygulamanızın tüm bağımlılıklarını (web sunucusu, uygulama çalışma zamanı, kütüphaneler vb.) yükleyin.
* Uygulama kodunuzu dağıtın ve düzgün çalıştığından emin olun.
* DigitalOcean Monitoring agent'ını veya diğer izleme ajanlarını (Prometheus Node Exporter gibi) kurun ve yapılandırın.
* SSH anahtarlarınızı ve gerekli tüm güvenlik ayarlarınızı yapın.
* Bu Droplet'in bir anlık görüntüsünü (Snapshot) alın. Bu anlık görüntü, otomatik ölçekleyici tarafından yeni Droplet'ler oluşturmak için kullanılacaktır.
3. DigitalOcean Yük Dengeleyici Kurulumu
* DigitalOcean kontrol panelinden veya doctl CLI aracılığıyla bir Yük Dengeleyici oluşturun.
* Yük dengeleyicinin dinleyeceği portları (örn. 80 ve 443) ve hedef Droplet'lerin dinleyeceği portları yapılandırın.
* Sağlık kontrolü (health check) ayarlarını yapılandırın. Yük dengeleyici, bu kontrolü kullanarak Droplet'lerin canlı olup olmadığını belirler ve sağlıklı olmayan Droplet'lere trafik göndermeyi durdurur. Örneğin, uygulamanızın /health endpoint'ine HTTP GET isteği gönderebilir.
* Başlangıçta, anlık görüntüsünü aldığınız Droplet'i yük dengeleyiciye manuel olarak ekleyin.
4. İzleme ve Uyarı Sistemini Yapılandırın
* DigitalOcean Monitoring: Droplet'lerinizde DigitalOcean Monitoring agent'ının çalıştığından emin olun. Bu, CPU, RAM, disk ve ağ metriklerini toplar.
* Özel Metrikler: Uygulamanızın kendi metriklerini (istek sayısı, hata oranları, yanıt süreleri) toplamak için Prometheus veya başka bir araç kullanıyorsanız, bunları da entegre edin.
* Eşik Değerleri: Ölçeklendirme yukarı ve aşağı tetikleyicileri için eşik değerlerini belirleyin (örn. ortalama CPU %70'in üzerinde, ortalama CPU %30'un altında).
5. Otomatik Ölçeklendirme Betiğini/Servisini Geliştirin
Daha önce bahsettiğimiz gibi, bir Python, Node.js veya Go betiği geliştirin.
* Bu betik, DigitalOcean API'sini kullanarak Droplet metriklerini sorgulayacak.
* Belirlenen eşik değerlerine göre ölçeklendirme kararları alacak.
* doctl komut satırı aracını veya DigitalOcean API istemci kütüphanelerini kullanarak yeni Droplet'ler oluşturacak veya mevcut Droplet'leri silecek.
* Yük dengeleyiciye Droplet ekleme/çıkarma işlemlerini yönetecek.
* Bu betiği ayrı ve küçük bir Droplet üzerinde veya DigitalOcean Functions gibi sunucusuz bir ortamda çalıştırın. Ölçekleyicinin kendisinin yüksek kullanılabilirliğe sahip olması önemlidir.
Örnek doctl Komutları:
* Droplet Oluşturma:
doctl compute droplet create web-app-new --image --size s-1vcpu-1gb --region nyc3 --tag web-app-prod --ssh-keys
* Droplet'i Yük Dengeleyiciye Ekleme:
doctl compute load-balancer add-droplets --droplet-ids
* Droplet'i Yük Dengeleyiciden Çıkarma:
doctl compute load-balancer remove-droplets --droplet-ids
* Droplet Silme:
doctl compute droplet delete --force
6. Ölçekleyiciyi Dağıtın ve Test Edin
* Otomatik ölçeklendirme betiğinizi, güvenli bir şekilde API token'ınıza erişebileceği bir Droplet'te veya sunucusuz bir işlev olarak dağıtın.
* Sisteminizin doğru çalıştığından emin olmak için yük testi araçlarıyla (Apache JMeter, k6, Locust) uygulamanıza yapay yük oluşturun.
* Yük artışıyla Droplet'lerin otomatik olarak eklendiğini, yük azaldığında ise gereksiz Droplet'lerin kaldırıldığını doğrulayın.
* Logları ve izleme panellerini dikkatlice takip edin.
Zorluklar ve En İyi Uygulamalar
Otomatik ölçeklendirme birçok avantaj sunsa da, bazı zorlukları ve en iyi uygulamaları göz önünde bulundurmak önemlidir.
"Cold Start" Süreleri
Yeni bir Droplet oluşturulduğunda ve uygulamayı başlatmak için hazır hale gelmesi zaman alabilir. Bu "cold start" süresi, ani trafik artışlarında uygulamanızın geçici olarak yavaşlamasına neden olabilir.
* Çözüm: Anlık görüntünüzü optimize ederek başlatma süresini kısaltın. Gerekirse, minimum sayıda Droplet'i her zaman çalışır durumda tutun (MIN_DROPLETS). Daha gelişmiş senaryolarda, önceden başlatılmış ancak henüz trafiğe açık olmayan bir "hazır havuz" (warm pool) Droplet'leri tutulabilir.
Droplet'lerin Zarif Kapanışı (Graceful Shutdown)
Ölçeklendirme aşağı durumunda bir Droplet'i aniden kapatmak, o Droplet üzerindeki devam eden isteklerin kesilmesine neden olabilir.
* Çözüm: Bir Droplet'i Yük Dengeleyici'den çıkardıktan sonra, ona belirli bir "bekleme süresi" (cooldown period) tanıyın. Bu süre zarfında Droplet yeni istek almaz, ancak mevcut istekleri tamamlar. Ardından güvenli bir şekilde kapatılabilir.
Veritabanı Ölçeklendirmesi
Uygulama sunucularınızı ölçeklendirmek kolaydır, ancak veritabanı genellikle en büyük darboğazdır.
* Çözüm: DigitalOcean Managed Databases kullanın. Okuma yoğun uygulamalar için salt okunur replikalar (read replicas) ekleyerek okuma yükünü dağıtabilirsiniz. Çok yüksek yazma yükleri için veritabanı sharding gibi daha karmaşık çözümler gerekebilir.
Önbellekleme Stratejileri
Veritabanı yükünü azaltmak ve yanıt sürelerini iyileştirmek için önbellekleme kullanın.
* Çözüm: Redis veya Memcached gibi dağıtık önbellek sistemlerini kullanın. DigitalOcean, yönetilen Redis hizmeti sunar.
Güvenlik
Otomatik ölçeklendirme, API anahtarlarının ve diğer hassas bilgilerin yönetimini gerektirir.
* Çözüm: DigitalOcean API token'larınızı güvenli bir şekilde saklayın (ortam değişkenleri, sır yönetim sistemleri). Sadece gerekli izinlere sahip token'lar kullanın. Droplet'ler arasında ve veritabanıyla iletişim için güvenlik duvarları (firewalls) ve özel ağlar (VPC) kullanın.
Maliyet Yönetimi
Otomatik ölçeklendirme maliyetleri düşürmeye yardımcı olsa da, yanlış yapılandırma gereksiz harcamalara yol açabilir.
* Çözüm: Ölçeklendirme eşiklerini dikkatlice belirleyin. Çok sık ölçeklendirme yukarı ve aşağı, Droplet oluşturma/silme döngüsü maliyetli olabilir. Cooldown sürelerini iyi ayarlayın.
Test Etme
Ölçeklendirme mantığınızın beklendiği gibi çalıştığından emin olun.
* Çözüm: Üretim ortamına dağıtmadan önce bir hazırlık (staging) ortamında yük testleri yaparak otomatik ölçekleyicinin davranışını doğrulayın.
Sonuç
DigitalOcean Ubuntu 16.04 Droplet'lerinde web uygulamanızın ölçeklendirmesini otomatikleştirmek, uygulamanızın performansını, güvenilirliğini ve maliyet etkinliğini önemli ölçüde artırabilir. Bu süreç, uygulamanızın durumsuz olarak tasarlanmasını, DigitalOcean'ın Yük Dengeleyiciler, Managed Databases ve Spaces gibi hizmetlerinden yararlanılmasını ve DigitalOcean API'sini kullanarak özel bir ölçeklendirme mantığı geliştirilmesini gerektirir.
Ancak, Ubuntu 16.04'ün yaşam döngüsünün sonuna ulaştığını ve güvenlik güncellemeleri almadığını bir kez daha vurgulamak önemlidir. Üretim ortamları için her zaman en son LTS (Uzun Süreli Destek) sürümlerini (örneğin Ubuntu 20.04 veya 22.04) kullanmanız şiddetle tavsiye edilir. Bu, hem güvenlik risklerini azaltacak hem de daha modern araçlar ve kütüphanelerle daha iyi uyumluluk sağlayacaktır.
Otomatik ölçeklendirme, bir kez kurulduktan sonra uygulamanızın trafik dalgalanmalarına otonom bir şekilde uyum sağlamasına olanak tanıyarak operasyonel yükü azaltır ve işinize odaklanmanızı sağlar. Daha da ileri gitmek isterseniz, DigitalOcean Kubernetes (DOKS) gibi yönetilen Kubernetes çözümleri, konteynerleştirilmiş uygulamalar için çok daha gelişmiş ve yerleşik otomatik ölçeklendirme yetenekleri sunar. Ancak Droplet tabanlı çözümler de birçok senaryo için yeterli ve güçlü bir otomasyon katmanı sağlayabilir.
