Distributed Lock Mekanizmaları Dağıtık Sistemlerde Kilitleme Mantığı

Dağıtık sistemlerde en büyük problemlerden biri şudur: Birden fazla sunucu aynı kaynağı aynı anda değiştirmeye çalıştığında veri tutarsızlığı oluşur.İçindekilerListeyi göstermek için tıklayın Tek sunuculu sistemlerde:Ama dağıtık sistemlerde:Örnek Problem: Kredi başvurusu onay sistemiA) Redis Üzerinden Lock (Redlock)B) Zookeeper Üzerinden LockC) Etcd Üzerinden Distributed MutexD) Database Üzerinden Lock (en zayıf yöntem) Temel kullanım logic: Lock alma:Lock bırakma: Avantajlar: Dezavantaj: Örnek node yapısı:Watch mekanizması Avantajlar Dezavantajlar Lease

Google News Google News Flipboard Flipboard Sesli oku Yazıyı beğen Favorilere Ekle 0 Yorumlar
Daha fazla

Dağıtık sistemlerde en büyük problemlerden biri şudur:

Birden fazla sunucu aynı kaynağı aynı anda değiştirmeye çalıştığında veri tutarsızlığı oluşur.

Bu duruma race condition denir. İşte distributed lock mekanizmaları, bu durumların önüne geçmek için vardır.

Aşağıdaki örneği düşün:

  • 3 farklı backend sunucusu var (Server A, B, C)

  • Hepsi aynı anda bir stok bilgisini güncellemek istiyor

  • Eğer lock kullanılmazsa:

    • Stok sayısı yanlış hesaplanır

    • Aynı ürün birden fazla kişiye satılabilir

    • Veritabanında çakışmalar olur

Distributed lock mekanizmaları:

  • Kaynağı “tek bir işlemciye” tahsis eder

  • Diğerlerini sıraya sokar

  • İş bitince kilidi bırakır

Şimdi bu mekanizmaların nasıl çalıştığını anlatmaya başlıcam hazırız.


1) Neden Distributed Lock’a İhtiyaç Var?

 Tek sunuculu sistemlerde:

  • JVM içi lock

  • Python threading.Lock

  • MySQL row-level lock

yeterlidir.

Ama dağıtık sistemlerde:

  • Bir işlem birden çok sunucuda çalışabilir

  • Aynı anda çalışmaları mümkün ve tehlikelidir

Örnek bir problem:

Örnek Problem: Kredi başvurusu onay sistemi

3 farklı API sunucusu aynı SMS kodunu doğrulayıp kullanıcıya 3 farklı kredi oluşturabilir.

Bu hem finansal hem güvenlik açısından büyük bir sıkıntıdır.

Distributed lock burada devreye girer.


2) Distributed Lock Türleri

Dağıtık kilitleme çeşitli yöntemlerle yapılabilir.

A) Redis Üzerinden Lock (Redlock)

B) Zookeeper Üzerinden Lock

C) Etcd Üzerinden Distributed Mutex

D) Database Üzerinden Lock (en zayıf yöntem)

Aşağıda hepsini örneklerle detaylandırıyorum.


A) Redis Distributed Lock (Redlock Algoritması)

Redis, özellikle performans isteyen sistemlerde tercih edilir.
Ana amaç:

Anahtar set edildiğinde lock alınır, süre dolunca veya işlem bitince lock salınır.

 Temel kullanım logic:

SET resource_name unique_id NX PX 30000
  • NX: Anahtar yoksa oluştur

  • PX: Süreli (expire time)

  • 30000: 30 saniye kilit süresi

  • unique_id: Kilidi alan sunucunun kendine özgü ID’si

 Lock alma:

SET order_123_lock abc123 NX PX 10000

Lock bırakma:

Redis Lua script ile:

if redis.call("GET",KEYS[1]) == ARGV[1] then
return redis.call("DEL",KEYS[1])
else
return 0
end

 Avantajlar:

  • Çok hızlı

  • En yoğun yükte bile performans kaybı minimal

  • Basit mantık

 Dezavantaj:

  • Tek Redis node kullanılmamalı

  • Redlock eleştiriliyor (teorik olarak %100 güvenli değil)


B) Zookeeper Lock

Zookeeper daha “güvenlik odaklı” distributed lock yöntemidir.

Mantık:

  • Her lock denemesi için sıralı bir node oluşturulur

  • En küçük numaraya sahip node lock sahibidir

  • İş bitince node silinir

 Örnek node yapısı:

/locks/order-xxxx-0001
/locks/order-xxxx-0002

0001 kilidi alır.

Watch mekanizması

0001 silinirse 0002 otomatik olarak lock’ı devralır.

 Avantajlar

  • Çok güvenilir

  • Failover güçlü

  • Seçim algoritması doğrudan içinde var

 Dezavantajlar

  • Redis’ten çok daha yavaş

  • Kurulumu daha zor


C) Etcd Dağıtık Mutex

Etcd, Kubernetes’in kendisinde kullandığı dağıtık KV store’dur.

 Lease mantığıyla çalışır:

  • Bir key oluşturulur

  • Lease ID verilir

  • Lease ayakta olduğu sürece lock geçerlidir

  • Lease düşerse lock otomatik çözülür

 Kod mantığı:

(Pseudocode)

mutex = etcd.NewMutex("order_lock")
mutex.Lock()
processOrder()
mutex.Unlock()

 Avantajlar:

  • Çok stabil

  • Kubernetes ile doğal uyum

  • Leader election için hazır yapı


D) Database locking

MySQL, PostgreSQL gibi sistemlerde:

Pessimistic lock:

SELECT * FROM orders WHERE id=1 FOR UPDATE;

Optimistic lock:

UPDATE orders
SET stock = stock - 1
WHERE id=10 AND version=5;

✔ Basittir
✔ Ek yazılım gerektirmez

❌ Ama yüksek yükte çökebilir
❌ Ölçeklenmez


3) Distributed Lock Ne Zaman Kullanılır?

  • Stok kontrolü

  • Hesap bakiyesi güncelleme

  • Ödeme sistemleri

  • Kredi/başvuru onay süreçleri

  • Oyunlarda eşzamanlı obje erişimi

  • Tek seferlik job çalıştırma (Cron deduplication)


4) Hangi Sistem Ne Zaman Seçilmeli?

Senaryo En iyi çözüm
Yük çok yüksek Redis Lock
Güvenlik çok önemli Zookeeper
Kubernetes ortamı Etcd Mutex
Basit projeler MySQL lock

5) En Basit Gerçek Hayat Örneği

 Stok yönetimi

3 API sunucusu aynı anda şöyle istekte bulunuyor:

/order/create?id=555

Hepsi stok = 2 olarak okuyor.

Kilit olmasa:

  • A → stok 1

  • B → stok 1

  • C → stok 1

Toplamda 3 satılır.

Lock ile:

  1. A lock alır → iş yapar → bırakır

  2. B lock alır → iş yapar → bırakır

  3. C lock alır → iş yapar → bırakır

Problem çözülür.


6) Hatalı Lock Senaryosu (Çok Önemli)

Eğer expire süresi yanlış ayarlanırsa:

❌ İşlem uzun sürer → lock otomatik düşer
❌ Başkası lock alır
❌ Aynı veri iki kez işlenir

Bu yüzden süre belirlerken:

  • İşlem süresini tahmini hesapla

  • Lease/renew mekanizması kullan


7) Sonuç

Distributed lock mekanizmaları modern yazılımın temel taşlarından biridir.
Doğru yapı kullanılırsa:

  • Veri tutarsızlığı olmaz

  • İşlem çakışmaları önlenir

  • Sistem kararlılığı artar

Yanlış yapı kullanılırsa:

  • Deadlock

  • Veri kaybı

  • Çifte işlem

  • Performans çökmesi

gibi kritik hatalar oluşabilir.

Yazar Hakkında

Benzer Yazılar

Bir Cevap Yaz

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

0/30 karakter