Web Uygulamanızın DigitalOcean Ubuntu 14.04 Droplet’leri Üzerinde Otomatik Ölçeklenmesi
Bu makale, web uygulamalarının değişen trafik yüklerine dinamik olarak adapte olabilmesi için DigitalOcean’ın Ubuntu 14.04 Droplet’leri üzerinde otomatik ölçeklenme (auto-scaling) mekanizmalarının nasıl kurulacağını ve yönetileceğini detaylandırmaktadır. Web uygulamalarının başarısı, yüksek performans, erişilebilirlik ve maliyet etkinliği gibi faktörlere bağlıdır. Bu faktörler, uygulamanın anlık taleplere göre kaynaklarını artırıp azaltabilmesi, yani ölçeklenebilir olmasıyla doğrudan ilişkilidir.
Giriş: Neden Otomatik Ölçeklenme?
Modern web uygulamaları, gün içinde veya belirli olaylar sırasında trafik yükünde büyük dalgalanmalar yaşayabilir. Örneğin, bir e-ticaret sitesi kampanya dönemlerinde normalin çok üzerinde ziyaretçi alabilirken, haber siteleri flaş haberler sırasında anlık trafik patlamaları yaşayabilir. Bu tür senaryolarda, uygulamanın performansını ve kullanıcı deneyimini korumak için altyapının hızla genişlemesi (scale-out) veya daralması (scale-in) gerekir. Manuel ölçeklenme, özellikle beklenmedik trafik artışlarında yavaş kalabilir, insan hatasına açık olabilir ve operasyonel maliyetleri artırabilir. İşte bu noktada otomatik ölçeklenme devreye girer. Otomatik ölçeklenme, önceden tanımlanmış metrikler (CPU kullanımı, bellek, ağ trafiği vb.) ve eşik değerlere göre altyapı kaynaklarını otomatik olarak yöneten bir sistemdir. Bu, uygulamanın her zaman optimum performansla çalışmasını sağlarken, gereksiz kaynak kullanımını önleyerek maliyetleri düşürür.
Dikey ve Yatay Ölçeklenme Farkı
Ölçeklenme temel olarak iki ana kategoriye ayrılır:
* Dikey Ölçeklenme (Vertical Scaling veya Scale-Up): Mevcut sunucunun (bu durumda DigitalOcean Droplet’in) kaynaklarını (CPU, RAM, depolama) artırmaktır. Daha güçlü bir Droplet’e geçmek bu kategoriye girer. Avantajı basittir ve uygulama mimarisinde büyük değişiklikler gerektirmez. Ancak, tek bir sunucunun kapasitesinin bir sınırı vardır ve tek hata noktası (Single Point of Failure – SPOF) riskini taşır.
* Yatay Ölçeklenme (Horizontal Scaling veya Scale-Out/Scale-In): Mevcut sunucu sayısını artırmak veya azaltmaktır. Uygulamanızın birden fazla Droplet üzerinde çalışmasını sağlamak ve yükü bu Droplet’ler arasında dağıtmak bu kategoriye girer. Yatay ölçeklenme, sınırsız denebilecek bir kapasite artışı sunar, hata toleransını artırır (bir Droplet çökerse diğerleri çalışmaya devam eder) ve genellikle daha maliyet etkindir. Otomatik ölçeklenme genellikle yatay ölçeklenmeyi hedefler.
DigitalOcean ve Ubuntu 14.04 Bağlamı
DigitalOcean, geliştiricilere ve küçük/orta ölçekli işletmelere yönelik basit ve güçlü bulut altyapısı sunan popüler bir platformdur. Droplet’leri (sanal özel sunucuları) hızlı bir şekilde oluşturma, yönetme ve API aracılığıyla otomatize etme yeteneği, otomatik ölçeklenme için ideal bir ortam sağlar. Ubuntu 14.04 ise, 2014 yılında piyasaya sürülen ve uzun süreli destek (LTS) almış bir Linux dağıtımıdır. Her ne kadar güncel ve daha güvenli sürümleri (örneğin Ubuntu 18.04, 20.04 veya 22.04) mevcut olsa da, bu makalenin gereksinimleri doğrultusunda Ubuntu 14.04’ün kullanıldığı bir senaryo ele alınacaktır. Bu sürüm için güvenlik güncellemelerinin sona erdiğini ve modern uygulamalar için daha yeni sürümlerin tercih edilmesi gerektiğini belirtmek önemlidir. Ancak, temel otomatik ölçeklenme prensipleri ve DigitalOcean API kullanımı, işletim sistemi sürümünden bağımsız olarak büyük ölçüde aynı kalacaktır.
Ölçeklenme Kavramlarını Anlamak
Otomatik ölçeklenmenin başarılı bir şekilde uygulanabilmesi için temel ölçeklenme kavramlarının iyi anlaşılması şarttır.
Dikey Ölçeklenme (Vertical Scaling)
Dikey ölçeklenme, uygulamanızın çalıştığı tek bir sunucunun işlemci gücünü, bellek miktarını veya depolama alanını artırarak kapasitesini yükseltme işlemidir. DigitalOcean’da bu, mevcut Droplet’inizi daha büyük bir planla yükseltmek anlamına gelir. Örneğin, 1 CPU ve 2GB RAM’e sahip bir Droplet’i, 2 CPU ve 4GB RAM’e sahip bir Droplet’e yükseltmek dikey ölçeklenmedir.
* Avantajları: Uygulama mimarisinde değişiklik gerektirmez, kurulumu ve yönetimi basittir.
* Dezavantajları: Tek bir sunucunun fiziksel sınırları vardır, sonsuz kapasite artışı sağlamaz. Sunucu yükseltme sırasında genellikle kısa bir kesinti yaşanır. Tek hata noktası riski taşır.
Yatay Ölçeklenme (Horizontal Scaling)
Yatay ölçeklenme, uygulamanızın birden fazla sunucu üzerinde çalışmasını sağlamak ve gelen trafiği bu sunucular arasında dağıtmaktır. Bu, yeni Droplet’ler oluşturup bunları mevcut altyapınıza ekleyerek kapasiteyi artırma işlemidir.
* Avantajları: Teorik olarak sınırsız kapasite artışı sağlar. Bir sunucunun arızalanması durumunda diğerleri çalışmaya devam ettiği için yüksek erişilebilirlik ve hata toleransı sunar. Genellikle dikey ölçeklenmeye göre daha maliyet etkindir, çünkü küçük, uygun fiyatlı sunucuların birleşimini kullanır.
* Dezavantajları: Uygulamanın durumsuz (stateless) olması gerekir. Yük dengeleyici gibi ek bileşenler gerektirir. Uygulama mimarisinde değişiklikler gerektirebilir (örneğin, oturum yönetimi, paylaşılan depolama).
Yük Dengeleme (Load Balancing)
Yatay ölçeklenmenin olmazsa olmaz bir bileşeni yük dengeleyicidir. Yük dengeleyici, gelen tüm ağ trafiğini alır ve bu trafiği arkasındaki birden fazla sunucu (Droplet) arasında verimli bir şekilde dağıtır. Bu, her sunucunun aşırı yüklenmesini önler, performansı artırır ve bir sunucu arızalandığında trafiği otomatik olarak diğer çalışan sunuculara yönlendirerek uygulamanın kesintisiz çalışmasını sağlar. DigitalOcean, yönetilen bir Yük Dengeleyici (Managed Load Balancer) hizmeti sunar, bu da kurulum ve yönetimi oldukça kolaylaştırır. Nginx ve HAProxy gibi yazılımsal yük dengeleyiciler de Droplet’ler üzerinde kurulabilir.
Otomatik Ölçeklenme (Auto-Scaling) Mekanizması
Otomatik ölçeklenme, uygulamanın performans metriklerini (CPU kullanımı, bellek tüketimi, ağ trafiği, istek sayısı vb.) sürekli izleyerek, önceden belirlenmiş eşik değerlere ulaşıldığında otomatik olarak yeni sunucular ekleme (scale-out) veya mevcut sunucuları kaldırma (scale-in) işlemidir. Bu mekanizma genellikle şu adımları içerir:
1. İzleme (Monitoring): Uygulama ve altyapı metriklerinin sürekli toplanması.
2. Eşik Değer Belirleme (Thresholds): Ölçeklenme eylemlerini tetikleyecek performans eşiklerinin tanımlanması (örneğin, “CPU kullanımı 5 dakika boyunca %70’in üzerindeyse yeni bir Droplet ekle”).
3. Politika Belirleme (Policies): Ölçeklenme eylemlerinin nasıl gerçekleştirileceğinin (kaç Droplet eklenecek/silinecek, hangi aralıklarla vb.) tanımlanması.
4. Otomasyon (Automation): Belirlenen eşik değerlere ulaşıldığında DigitalOcean API’si aracılığıyla Droplet oluşturma/silme ve yük dengeleyiciyi güncelleme işlemlerinin otomatik olarak yapılması.
Otomatik Ölçeklenme İçin Temel Bileşenler ve Ön Koşullar
Otomatik ölçeklenebilir bir yapı kurmak için belirli bileşenlere ve ön koşullara ihtiyaç vardır.
DigitalOcean Hesabı ve Droplet’ler
Öncelikle aktif bir DigitalOcean hesabınız olmalı ve Droplet oluşturma, API anahtarı yönetimi gibi temel işlemleri biliyor olmanız gerekir. Otomatik ölçeklenme için Droplet’lerinizin Ubuntu 14.04 üzerinde çalışacağı varsayılmaktadır.
Durumsuz (Stateless) Web Uygulaması
Otomatik ölçeklenmenin en kritik ön koşullarından biri, web uygulamanızın durumsuz olmasıdır. Durumsuz bir uygulama, her isteği bağımsız olarak işler ve herhangi bir oturum veya kullanıcı verisini yerel sunucu belleğinde veya dosya sisteminde tutmaz. Tüm oturum bilgileri, kullanıcı verileri ve uygulama durumu, Redis, Memcached gibi harici bir önbellek sunucusunda veya bir veritabanında depolanmalıdır. Bu sayede, yeni bir Droplet eklendiğinde veya mevcut bir Droplet kaldırıldığında uygulamanın işleyişi etkilenmez.
Yük Dengeleyici (Load Balancer) Seçimi
DigitalOcean’ın yönetilen Yük Dengeleyici hizmeti, otomatik ölçeklenme için en uygun seçenektir. Kurulumu kolaydır, otomatik olarak ölçeklenir ve Droplet’leri hedef gruplarına ekleyip çıkarmak için API desteği sunar. Alternatif olarak, Nginx veya HAProxy gibi yazılımsal yük dengeleyicileri ayrı bir Droplet üzerine kurabilir ve yönetebilirsiniz, ancak bu daha fazla yapılandırma ve bakım gerektirir.
İzleme ve Uyarı Sistemleri
Otomatik ölçeklenmenin tetikleyicisi olan metrikleri toplamak için güçlü bir izleme sistemine ihtiyacınız vardır. DigitalOcean Monitoring, Droplet’lerinizin CPU, bellek, disk I/O ve ağ trafiği gibi temel metriklerini ücretsiz olarak sağlar. Bu metrikler üzerinden uyarılar tanımlayabilir ve DigitalOcean API’si aracılığıyla bu verilere erişebilirsiniz. Daha gelişmiş senaryolar için Prometheus ve Grafana gibi açık kaynaklı çözümler de kullanılabilir.
Yapılandırma Yönetimi Araçları
Yeni Droplet’ler oluşturulduğunda, uygulamanızın ve bağımlılıklarının hızla kurulması gerekir. Ansible, Chef veya Puppet gibi yapılandırma yönetimi araçları, bu süreci otomatikleştirmek için mükemmeldir. Bu araçlar sayesinde, tüm Droplet’lerinizin tutarlı bir şekilde yapılandırılmasını ve uygulamanızın hızlıca dağıtılmasını sağlayabilirsiniz.
Otomasyon ve Orkestrasyon Araçları (DigitalOcean API, doctl)
Otomatik ölçeklenmenin kalbi, DigitalOcean API’si ve bu API ile etkileşime geçen otomasyon araçlarıdır.
* DigitalOcean API: Tüm Droplet, Yük Dengeleyici, Snapshot, Görüntü (Image) ve diğer DigitalOcean kaynaklarını programatik olarak yönetmek için RESTful bir arayüz sunar. Python, Node.js, Ruby gibi dillerde yazılmış otomasyon betikleri bu API’yi kullanarak kaynakları oluşturabilir, değiştirebilir ve silebilir.
* doctl: DigitalOcean API’si ile etkileşim kurmak için kullanılan resmi bir komut satırı aracıdır. Bash betikleri içinde doctl komutlarını kullanarak Droplet oluşturma, silme, yük dengeleyiciye Droplet ekleme/çıkarma gibi işlemleri kolayca gerçekleştirebilirsiniz.
Adım Adım Otomatik Ölçeklenme Uygulaması
Şimdi, DigitalOcean Ubuntu 14.04 Droplet’leri üzerinde otomatik ölçeklenmeyi nasıl uygulayacağımıza dair adımları inceleyelim.
1. Temel Droplet Kalıbı Oluşturma (Golden Image)
Otomatik ölçeklenmenin ilk adımı, uygulamanızın ve tüm bağımlılıklarının önceden kurulduğu, “altın görüntü” veya “temel kalıp” adı verilen bir Droplet görüntüsü oluşturmaktır.
* Temel Droplet Kurulumu:
1. Bir Ubuntu 14.04 Droplet oluşturun.
2. Droplet’e SSH ile bağlanın.
3. Web sunucunuzu (Nginx veya Apache), uygulama çalışma zamanınızı (PHP-FPM, Node.js, Python Gunicorn/uWSGI) ve uygulamanızın gerektirdiği diğer yazılımları kurun.
4. Uygulama kodunuzu Droplet’e dağıtın ve gerekli yapılandırmaları yapın. Uygulamanızın durumsuz olduğundan ve veritabanı gibi dış kaynaklara bağlandığından emin olun.
5. Tüm servislerin otomatik olarak başlaması için systemd (veya upstart – Ubuntu 14.04’te varsayılan) yapılandırmalarını yapın.
6. Droplet’in düzgün çalıştığından ve uygulamanızın erişilebilir olduğundan emin olun.
* Görüntü (Snapshot/Custom Image) Oluşturma:
* DigitalOcean kontrol panelinden veya doctl komutuyla bu Droplet’in bir görüntüsünü (snapshot) alın. Bu görüntü, yeni Droplet’ler oluşturmak için kullanılacak temel kalıp olacaktır.
* doctl compute droplet-action snapshot --snapshot-name my-web-app-image
Bu “altın görüntü”, yeni Droplet’lerin hızlı bir şekilde başlatılmasını sağlayacak ve her yeni Droplet’in aynı yapılandırmaya sahip olmasını garantileyecektir.
2. Yük Dengeleyici Kurulumu
DigitalOcean Managed Load Balancer kullanarak yük dengeleyiciyi kurun.
* Yük Dengeleyici Oluşturma:
1. DigitalOcean kontrol panelinden veya doctl komutuyla bir Yük Dengeleyici oluşturun.
2. doctl compute load-balancer create --name my-app-lb --region nyc1 --forwarding-rules entry_protocol:https,entry_port:443,target_protocol:http,target_port:80,certificate_id: --health-check protocol:http,port:80,path:/healthz (HTTPS sonlandırma için bir SSL sertifikası yüklediğinizi varsayar. HTTP için entry_protocol:http,entry_port:80 kullanın.)
3. Başlangıçta, yük dengeleyiciye manuel olarak birkaç Droplet ekleyebilirsiniz (altın görüntünüzden oluşturduğunuz Droplet’ler). Bu, uygulamanızın ilk çalışır durumunu oluşturur.
3. İzleme ve Eşik Değerlerin Belirlenmesi
Otomatik ölçeklenme için tetikleyici görevi görecek metrikleri ve eşik değerleri belirleyin.
* DigitalOcean Monitoring Kurulumu: DigitalOcean Droplet’lerinizde varsayılan olarak izleme ajanı yüklü gelir. Bu ajan, CPU, bellek, disk ve ağ metriklerini otomatik olarak DigitalOcean kontrol paneline gönderir.
* Eşik Değerlerin Belirlenmesi:
* Scale-Out (Genişleme) Tetikleyicisi: Örneğin, “Ortalama CPU kullanımı 5 dakika boyunca %70’in üzerindeyse”.
* Scale-In (Daralma) Tetikleyicisi: Örneğin, “Ortalama CPU kullanımı 15 dakika boyunca %30’un altındaysa”.
* Bu değerler uygulamanızın karakteristiklerine göre optimize edilmelidir. Yanlış eşikler, sürekli ölçeklenmeye veya yetersiz performansa yol açabilir.
* Metriklere Erişim: DigitalOcean API’si üzerinden Droplet metriklerine erişebilirsiniz. Bu, otomasyon betiğinizin mevcut durumu sorgulaması için kritik öneme sahiptir.
4. Otomatik Ölçeklenme Mantığının Geliştirilmesi
Bu, otomatik ölçeklenme sisteminin kalbidir. DigitalOcean API’si veya doctl kullanarak Droplet’leri ve Yük Dengeleyiciyi yönetecek bir betik yazılmalıdır. Bu betik, bir cron işi olarak belirli aralıklarla (örneğin her 5 dakikada bir) çalıştırılabilir.
Ölçeklenme Tetikleyicileri
Betik, öncelikle tüm web uygulaması Droplet’lerinin ortalama CPU kullanımını veya diğer ilgili metrikleri DigitalOcean API’sinden çekmelidir.
* DigitalOcean Monitoring API: https://api.digitalocean.com/v2/monitoring/metrics/droplet/cpu gibi endpoint’ler üzerinden metrik verilerine erişilebilir. Kimlik doğrulama için DigitalOcean API anahtarınızı kullanmanız gerekecektir.
Droplet Oluşturma ve Yük Dengeleyiciye Ekleme (Scale-Out)
Eğer ortalama metrik eşik değerini (örneğin %70 CPU) aşarsa:
1. Yeni Droplet Oluşturma:
* DigitalOcean API’sini kullanarak daha önce oluşturduğunuz “altın görüntüden” yeni bir Droplet oluşturun.
* doctl compute droplet create --image --region --size --name web-app-new --tag web-app --wait
* image_id yerine altın görüntünüzün ID’sini veya adını kullanın.
* --wait parametresi, Droplet oluşturma işleminin tamamlanmasını bekler.
2. Yük Dengeleyiciye Ekleme:
* Yeni Droplet’in IP adresini veya ID’sini alın.
* DigitalOcean API’sini kullanarak bu Droplet’i Yük Dengeleyiciye ekleyin.
* doctl compute load-balancer add-droplets --droplet-ids
3. Bekleme Süresi: Yeni Droplet’in başlatılması, uygulamanın yüklenmesi ve sağlık kontrollerinden geçmesi için yeterli bir süre (örneğin 2-5 dakika) bekleyin. Bu, trafiğin yeni Droplet’e yönlendirilmeden önce hazır olmasını sağlar.
Droplet Silme ve Yük Dengeleyiciden Çıkarma (Scale-In)
Eğer ortalama metrik eşik değerinin (örneğin %30 CPU) altına düşerse:
1. Yük Dengeleyiciden Çıkarma:
* En az yüklü veya en eski Droplet’lerden birini seçin (uygulamanızın minimum Droplet sayısının altına düşmediğinden emin olun).
* DigitalOcean API’sini kullanarak bu Droplet’i Yük Dengeleyiciden kaldırın.
* doctl compute load-balancer remove-droplets --droplet-ids
2. Zarif Kapatma (Graceful Shutdown): Droplet’in yük dengeleyiciden çıkarıldıktan sonra mevcut bağlantıları tamamlaması için bir süre (örneğin 60 saniye) bekleyin. Bu, kullanıcıların devam eden isteklerinin kesintiye uğramamasını sağlar.
3. Droplet Silme:
* Bekleme süresi sonunda, DigitalOcean API’sini kullanarak Droplet’i silin.
* doctl compute droplet delete --force
Örnek Otomasyon Senaryosu (Python/Bash)
Bu otomasyon mantığı Python veya Bash betikleriyle uygulanabilir. İşte Python ile basit bir yapı:
import os
import time
import requests
import json
DigitalOcean API Anahtarı
DO_API_TOKEN = os.environ.get("DO_API_TOKEN")
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DO_API_TOKEN}"
}
Yapılandırma
MIN_DROPLETS = 2
MAX_DROPLETS = 5
TARGET_CPU_THRESHOLD_UP = 70 # %
TARGET_CPU_THRESHOLD_DOWN = 30 # %
SCALE_UP_COOLDOWN = 300 # Saniye
SCALE_DOWN_COOLDOWN = 900 # Saniye
DROPLET_IMAGE_ID = "your_custom_image_id_or_slug" # Oluşturduğunuz altın görüntünün ID'si veya slug'ı
LOAD_BALANCER_ID = "your_load_balancer_id"
DROPLET_SIZE_SLUG = "s-1vcpu-1gb" # Droplet boyutu
REGION = "nyc1" # Droplet bölgesi
TAG_NAME = "web-app" # Droplet'leri gruplamak için etiket
last_scale_up_time = 0
last_scale_down_time = 0
def get_droplets_by_tag(tag):
url = f"https://api.digitalocean.com/v2/droplets?tag_name={tag}"
response = requests.get(url, headers=HEADERS)
response.raise_for_status()
return response.json()["droplets"]
def get_droplet_cpu_usage(droplet_id):
# DigitalOcean Monitoring API'sinden CPU kullanımını çek
# Bu kısım daha karmaşık olabilir, basitleştirilmiş bir örnek.
# Gerçek uygulamada belirli bir zaman aralığındaki ortalamayı almalısınız.
# DigitalOcean Monitoring API'si için daha detaylı sorgu gerekebilir.
# Örnek olarak, DigitalOcean'ın kendi metriklerini kullanan bir proxy veya doğrudan API çağrısı yapılabilir.
# Basitlik adına, burada bir placeholder değeri döndürüyoruz.
# Gerçek senaryoda bu fonksiyon DigitalOcean Monitoring API'si ile entegre olmalıdır.
# Örneğin: requests.get(f"https://api.digitalocean.com/v2/monitoring/metrics/droplet/cpu?host_id={droplet_id}&duration=300", headers=HEADERS)
# ve gelen veriden ortalamayı hesaplamak.
return 0 # Placeholder
def create_droplet():
print("Yeni Droplet oluşturuluyor...")
url = "https://api.digitalocean.com/v2/droplets"
data = {
"name": f"web-app-{int(time.time())}",
"region": REGION,
"size": DROPLET_SIZE_SLUG,
"image": DROPLET_IMAGE_ID,
"tags": [TAG_NAME]
}
response = requests.post(url, headers=HEADERS, data=json.dumps(data))
response.raise_for_status()
droplet_info = response.json()["droplet"]
print(f"Droplet oluşturuldu: {droplet_info['name']} (ID: {droplet_info['id']})")
return droplet_info
def add_droplet_to_load_balancer(droplet_id):
print(f"Droplet {droplet_id} Yük Dengeleyiciye ekleniyor...")
url = f"https://api.digitalocean.com/v2/load_balancers/{LOAD_BALANCER_ID}/droplets"
data = {"droplet_ids": [droplet_id]}
response = requests.post(url, headers=HEADERS, data=json.dumps(data))
response.raise_for_status()
print(f"Droplet {droplet_id} Yük Dengeleyiciye eklendi.")
def remove_droplet_from_load_balancer(droplet_id):
print(f"Droplet {droplet_id} Yük Dengeleyiciden kaldırılıyor...")
url = f"https://api.digitalocean.com/v2/load_balancers/{LOAD_BALANCER_ID}/droplets"
data = {"droplet_ids": [droplet_id]}
response = requests.delete(url, headers=HEADERS, data=json.dumps(data))
response.raise_for_status()
print(f"Droplet {droplet_id} Yük Dengeleyiciden kaldırıldı.")
def delete_droplet(droplet_id):
print(f"Droplet {droplet_id} siliniyor...")
url = f"https://api.digitalocean.com/v2/droplets/{droplet_id}"
response = requests.delete(url, headers=HEADERS)
response.raise_for_status()
print(f"Droplet {droplet_id} silindi.")
def main():
global last_scale_up_time, last_scale_down_time
current_time = time.time()
try:
droplets = get_droplets_by_tag(TAG_NAME)
active_droplets = [d for d in droplets if d['status'] == 'active']
num_active_droplets = len(active_droplets)
print(f"Aktif Droplet sayısı: {num_active_droplets}")
if num_active_droplets == 0:
print("Hiç aktif Droplet yok. Minimum Droplet sayısına ulaşmak için Droplet oluşturuluyor.")
new_droplet = create_droplet()
# Droplet'in hazır olmasını bekleyin
time.sleep(60) # Sağlık kontrolü ve başlatma için bekleme
add_droplet_to_load_balancer(new_droplet['id'])
return
total_cpu_usage = 0
for droplet in active_droplets:
cpu = get_droplet_cpu_usage(droplet['id']) # Gerçek CPU kullanımını DigitalOcean Monitoring API'sinden alın
total_cpu_usage += cpu
if num_active_droplets > 0:
average_cpu_usage = total_cpu_usage / num_active_droplets
else:
average_cpu_usage = 0
print(f"Ortalama CPU kullanımı: {average_cpu_usage:.2f}%")
# Scale Up Mantığı
if average_cpu_usage > TARGET_CPU_THRESHOLD_UP and num_active_droplets < MAX_DROPLETS:
if (current_time - last_scale_up_time) > SCALE_UP_COOLDOWN:
print("Ortalama CPU yüksek, yeni Droplet oluşturuluyor.")
new_droplet = create_droplet()
# Droplet'in hazır olmasını bekleyin
time.sleep(60) # Sağlık kontrolü ve başlatma için bekleme
add_droplet_to_load_balancer(new_droplet['id'])
last_scale_up_time = current_time
else:
print("Scale-up bekleme süresi içinde.")
# Scale Down Mantığı
elif average_cpu_usage < TARGET_CPU_THRESHOLD_DOWN and num_active_droplets > MIN_DROPLETS:
if (current_time - last_scale_down_time) > SCALE_DOWN_COOLDOWN:
print("Ortalama CPU düşük, Droplet siliniyor.")
# En az yüklü veya en eski Droplet'i seçin (burada basitleştirilmiş: rastgele birini seçelim)
droplet_to_remove = active_droplets[0]
remove_droplet_from_load_balancer(droplet_to_remove['id'])
time.sleep(60) # Graceful shutdown için bekleme
delete_droplet(droplet_to_remove['id'])
last_scale_down_time = current_time
else:
print("Scale-down bekleme süresi içinde.")
else:
print("Ölçeklenme eşikleri karşılanmadı.")
except requests.exceptions.RequestException as e:
print(f"API Hatası: {e}")
except Exception as e:
print(f"Beklenmeyen Hata: {e}")
if __name__ == "__main__":
main()
Not: Yukarıdaki Python betiği, DigitalOcean API’si ile etkileşim kurmak için requests kütüphanesini kullanır. get_droplet_cpu_usage fonksiyonu, DigitalOcean Monitoring API’sinden gerçek metrikleri çekecek şekilde doldurulmalıdır. Bu, API çağrılarının ve JSON yanıtlarının işlenmesini gerektirecektir. Ayrıca, DROPLET_IMAGE_ID ve LOAD_BALANCER_ID değişkenlerini kendi değerlerinizle güncellemeniz gerekmektedir. Bu betik, bir cron işi olarak düzenli aralıklarla çalışacak şekilde ayarlanmalıdır.
5. Uygulama Dağıtımı ve Güncelleme Stratejileri
Otomatik ölçeklenme ortamında uygulama güncellemeleri, “altın görüntü” yaklaşımıyla daha kolay yönetilir. Yeni bir uygulama sürümü yayınlandığında:
1. Mevcut “altın görüntünüzden” yeni bir Droplet oluşturun.
2. Bu yeni Droplet üzerine uygulamanın yeni sürümünü dağıtın ve test edin.
3. Bu yeni Droplet’in bir görüntüsünü alın. Bu, yeni “altın görüntünüz” olur.
4. Otomasyon betiğinizi, Droplet oluştururken bu yeni görüntüyü kullanacak şekilde güncelleyin.
5. Mevcut Droplet’leri yavaş yavaş yeni görüntülerden oluşturulanlarla değiştirin (rolling update). Bu, hizmet kesintisi olmadan güncelleme yapmanızı sağlar.
Veritabanı Ölçeklenmesi ve Ek Optimizasyonlar
Web uygulamasının kendisi ölçeklenirken, veritabanı genellikle ayrı bir zorluk kümesi sunar.
Veritabanı Ölçeklenmesi Yaklaşımları
* Ayrı Droplet: Veritabanını web Droplet’lerinden ayrı bir Droplet üzerinde çalıştırmak ilk adımdır.
* DigitalOcean Managed Databases: DigitalOcean’ın yönetilen veritabanı hizmetleri (PostgreSQL, MySQL, Redis) ölçeklenebilirlik, yedeklilik ve bakım yükünü hafifletme açısından büyük avantajlar sunar. Bu hizmetler, otomatik yedeklemeler, replikalar ve dikey ölçeklenme seçenekleri sunar.
* Read Replicas: Okuma yoğun uygulamalar için veritabanının okuma replikaları oluşturulabilir. Uygulama okuma sorgularını replikalara, yazma sorgularını ana veritabanına yönlendirir.
* Sharding: Çok büyük veri kümeleri ve yüksek yazma/okuma yükleri için veritabanını parçalara ayırmak (sharding) gerekebilir, ancak bu uygulama mimarisinde önemli değişiklikler gerektirir.
Önbellekleme (Caching) ve CDN Kullanımı
Otomatik ölçeklenmeyi destekleyen ek optimizasyonlar:
* Uygulama İçi Önbellekleme: Sık erişilen verileri veya hesaplama yoğun sonuçları Redis veya Memcached gibi in-memory önbelleklerde tutmak, veritabanı yükünü azaltır ve uygulama yanıt sürelerini hızlandırır.
* CDN (Content Delivery Network): Statik içerikleri (resimler, CSS, JavaScript) CDN üzerinden sunmak, ana sunucuların yükünü azaltır ve son kullanıcıya daha yakın sunuculardan içerik sağlayarak performansı artırır. Cloudflare, DigitalOcean Spaces CDN gibi hizmetler kullanılabilir.
Karşılaşılabilecek Zorluklar ve En İyi Uygulamalar
Otomatik ölçeklenme kurulumu ve yönetimi sırasında bazı zorluklarla karşılaşılabilir ve bu zorlukların üstesinden gelmek için belirli en iyi uygulamalar mevcuttur.
Uygulamanın Durumsuz Yapısı
En büyük zorluklardan biri, uygulamanın gerçekten durumsuz olmasını sağlamaktır. Oturum verilerini, kullanıcıya özel geçici dosyaları veya diğer durum bilgilerini yerel Droplet’te saklamak, ölçeklenme sırasında veri kaybına veya tutarsızlıklara yol açar. Tüm durum bilgilerinin harici ve ölçeklenebilir bir depolama çözümünde (veritabanı, Redis, S3 uyumlu depolama) tutulduğundan emin olun.
Oturum Yönetimi
Web uygulamalarında kullanıcı oturumları genellikle bir zorluktur. Oturumlar, sunucular arasında paylaşılabilir olmalıdır. Redis, Memcached veya veritabanı gibi merkezi bir oturum deposu kullanmak bu sorunu çözer.
Zarif Kapatma (Graceful Shutdown)
Bir Droplet ölçeklenme daralması (scale-in) nedeniyle kapatılırken, o an işlenmekte olan isteklerin tamamlanmasına izin verilmelidir. Yük dengeleyiciden çıkarıldıktan sonra Droplet’e belirli bir “boşaltma süresi” (draining period) tanımak, mevcut bağlantıların kesintiye uğramamasını sağlar. Otomasyon betiğinizde bu bekleme süresi göz önünde bulundurulmalıdır.
Maliyet Yönetimi ve Optimizasyon
Otomatik ölçeklenme, maliyetleri optimize etme potansiyeli sunsa da, yanlış yapılandırıldığında gereksiz yere Droplet’lerin çalışmasına neden olabilir.
* Minimum ve Maksimum Droplet Sayısı: Uygulamanızın her zaman çalışması gereken minimum Droplet sayısını ve dayanabileceği maksimum Droplet sayısını belirleyin.
* Soğuma Süreleri (Cooldown Periods): Ölçeklenme eylemleri arasında yeterli soğuma süreleri (cooldown periods) tanımlayın. Bu, sistemin sürekli olarak Droplet ekleyip çıkarmasını önler ve kararlılığı artırır.
* Metrik Eşikleri: Metrik eşiklerini dikkatlice ayarlayın. Çok düşük eşikler gereksiz ölçeklenmeye, çok yüksek eşikler ise performans sorunlarına yol açabilir.
Güvenlik Konuları
* API Anahtarları: DigitalOcean API anahtarınız çok güçlü yetkilere sahiptir. Bu anahtarı güvenli bir şekilde saklayın (ortam değişkenleri, sır yönetimi araçları). Sadece gerekli izinlere sahip bir anahtar kullanın.
* Güvenlik Duvarları: Droplet’leriniz ve yük dengeleyiciniz için güvenlik duvarı kurallarını (DigitalOcean Cloud Firewalls) yapılandırın. Yalnızca gerekli portların ve IP adreslerinin erişimine izin verin.
Test Etme ve İzleme
Otomatik ölçeklenme sisteminizi düzenli olarak test edin. Yüksek trafik simülasyonları yaparak ölçeklenme kurallarınızın beklendiği gibi çalıştığından emin olun. Ölçeklenme eylemlerini, Droplet durumlarını ve uygulama performansını sürekli izleyin. Günlük kayıtları (logging) merkezi bir yerde toplayın (örneğin ELK Stack, Grafana Loki).
Altyapıyı Kod Olarak Yönetme (IaC)
Otomasyon betiklerinizi, yapılandırma dosyalarınızı ve DigitalOcean kaynak tanımlarınızı (Droplet boyutları, imaj ID’leri vb.) versiyon kontrol sistemlerinde (Git) yönetin. Terraform gibi araçlar, DigitalOcean altyapınızı kod olarak tanımlamanıza olanak tanır ve bu da altyapının tutarlılığını ve tekrarlanabilirliğini artırır.
Gelişmiş Ölçeklenme Yaklaşımları
Bu makale Ubuntu 14.04 Droplet’leri üzerinde temel otomatik ölçeklenmeye odaklanırken, modern bulut mimarilerinde daha gelişmiş yaklaşımlar da mevcuttur.
Terraform ile Altyapı Yönetimi
Terraform, HashiCorp tarafından geliştirilen bir Altyapı Kod Olarak (Infrastructure as Code – IaC) aracıdır. DigitalOcean sağlayıcısı ile entegre olarak, Droplet’ler, Yük Dengeleyiciler, Güvenlik Duvarları ve diğer tüm DigitalOcean kaynaklarını HCL (HashiCorp Configuration Language) kullanarak tanımlamanıza olanak tanır. Bu, altyapınızın versiyonlanabilir, tekrarlanabilir ve otomatikleştirilebilir olmasını sağlar. Otomatik ölçeklenme betiğiniz, Terraform tarafından tanımlanan kaynaklarla daha entegre çalışabilir.
Kapsayıcılaştırma (Containerization) ve Kubernetes
Uygulamalarınızı Docker gibi kapsayıcı teknolojileriyle paketlemek ve Kubernetes gibi kapsayıcı orkestrasyon platformları üzerinde çalıştırmak, ölçeklenebilirlik ve dağıtım yönetimini bir üst seviyeye taşır. Kubernetes, yerleşik otomatik ölçeklenme (yatay pod otomatik ölçekleyicisi – HPA) yeteneklerine sahiptir ve uygulamalarınızın kaynak kullanımına göre otomatik olarak ölçeklenmesini sağlar. DigitalOcean Kubernetes (DOKS), bu karmaşıklığı yönetilen bir hizmet olarak sunar. Ubuntu 14.04 Droplet’leri üzerinde kapsayıcılaştırma mümkün olsa da, Kubernetes genellikle daha modern işletim sistemi sürümleri ve daha güçlü Droplet’ler üzerinde daha iyi performans gösterir.
Sonuç
Web uygulamanızın DigitalOcean Ubuntu 14.04 Droplet’leri üzerinde otomatik ölçeklenmesi, uygulamanızın değişen trafik yüklerine dinamik olarak uyum sağlamasına olanak tanıyan güçlü bir yaklaşımdır. Bu, hem kullanıcı deneyimini iyileştirir hem de altyapı maliyetlerini optimize eder. Başarılı bir otomatik ölçeklenme sistemi kurmak; uygulamanın durumsuz olmasını sağlamak, doğru izleme metriklerini ve eşik değerlerini belirlemek, DigitalOcean API’sini kullanarak Droplet ve Yük Dengeleyici yönetimini otomatikleştirmek ve sağlam bir yapılandırma yönetimi stratejisi uygulamakla mümkündür.
Her ne kadar bu makale Ubuntu 14.04’e odaklanmış olsa da, temel prensipler ve DigitalOcean API kullanımı, daha güncel işletim sistemi sürümleri için de geçerlidir. Güvenlik ve performans açısından, üretim ortamlarında her zaman en güncel ve desteklenen işletim sistemi sürümlerinin kullanılması şiddetle tavsiye edilir. Otomatik ölçeklenme, bir kez kurulan ve unutulan bir sistem değildir; sürekli izleme, test etme ve iyileştirme gerektiren dinamik bir süreçtir. Doğru yapılandırıldığında, web uygulamanızın kesintisiz ve yüksek performanslı çalışmasını sağlayan kritik bir bileşen haline gelecektir.
