Skip to main content

> dağıtık_kilitlenmeler,_bekleme_grafikleri_ve_2pl_vs_mvcc

Dağıtık Kilitlenmeler, Bekleme Grafikleri ve 2PL vs MVCC

Yüksek verimli canlı mimarilerde Dağıtık Kilitlenmeler, Bekleme Grafikleri ve 2PL vs MVCC yapısını nasıl doğru kurar ve yönetirsiniz?

Stack: SOFTWARE ARCHITECTURE STACKStaff/Principal (L6+)tradeoff

ÖZET VE TEKNİK CEVAP

Dağıtık kilitlenmeler, birden fazla veritabanı parçası veya mikroservisteki eşzamanlı işlemlerin çakışan sıralarla kilit alması ve döngüsel bağımlılıklar oluşturmasıyla meydana gelir; yalnızca Bekleme Grafiği (Wait-For Graph) döngü tespiti veya Wound-Wait algoritmalarıyla çözülebilir.

Mühendislik El Kitabı & Mekanizma

1. Temel Çalışma Mekanizması

Tek bir veritabanı düğümünde kilitlenme tespiti kolaydır: Motor yerel bir Bekleme Grafiği tutar; 'A İşlemi B'yi Bekliyor' döngüsü (A -> B -> A) oluştuğunda motor işlemlerden birini kurban seçip iptal eder. Ancak CockroachDB veya Spanner gibi dağıtık veritabanlarında işlemler birden fazla fiziksel sunucuya yayıldığından ağlar arası döngü tespiti karmaşıklaşır.

2. Doğru Kullanım Senaryosu

Dağıtık Kilitlenme, iki veya daha fazla dağıtık işlemin her birinin döngüdeki diğer bir işlemin beklediği kaynağın kilidini tutması sebebiyle kalıcı olarak bloke olduğu sistem durumudur.

3. Prodüksiyon Arıza Modları

Farklı uç noktalarda veritabanı satır kilitlerini veya Redis mutex'lerini rastgele sıralarla almaya çalışmak. Kilit zaman aşımını 60 saniye gibi çok uzun tutarak kilitlenme kurtarma süresini uzatmak ve bağlantı havuzunu tüketmek. Mikroservis sınırları arasında iyimser eşzamanlılık veya Saga yerine katı İki Aşamalı Kilitleme (2PL) kullanmak.

4. Teşhis ve Telemetri Sinyalleri

döngüsel dağıtık kilit bağımlılığının parçalar arası işlemleri dondurması, karşılıklı kilitli satırları bekleyen iki mikroservisin kilitlenmesi, yüksek kilit zaman aşımının tüm veritabanını dondurması

5. Önleme ve Mimari Bariyerler

Katı bir Global Kilit Sıralaması kuralı uygulayın (örn. varlıkları her zaman UUID alfabetik sırasına göre kilitleyin: `UUID_A` önce, `UUID_B` sonra). Kilit zaman aşımlarını kısa tutun (`lock_timeout = 2s`); böylece tespit edilemeyen kilitlenmeler hızlı hata verir ve uygulama düzeyinde yeniden denenir. Kötümser dağıtık satır kilitleri yerine iyimser kilitlemeye (`WHERE version = 4`) sahip MVCC mekanizmalarını tercih edin.

6. Mimari Ödünleşimler (Trade-offs)

Çözülmeyen kilitlenmeler, bağlantı havuzları tükenene ve tüm platform donana kadar veritabanı iş parçacıklarını ve belleğini süresiz olarak rehin tutar.

Vaka İncelemesi (TinyCTO Örneği)

Dağıtık sistemler kilitlenmeleri iki temel paradigmada çözer: 1. **Kilitlenmeyi Önleme (Wound-Wait ve Wait-Die):** Global grafik tutmadan, işlem zaman damgalarını ($T_{start}$) kullanarak döngülerin oluşmasını baştan engeller: - **Wound-Wait (Öncelikli Kesme):** Yaşlı işlem ($T_{eski}$), genç işlemin ($T_{genc}$) tuttuğu kilidi isterse, genç işlemi *yaralar* (iptal eder). Genç işlem yaşlının kilidini isterse *beklemesine* izin verilir. - **Wait-Die:** $T_{eski}$, $T_{genc}$ için bekler; ancak $T_{genc}$, $T_{eski}$'nin kilidini isterse hemen *ölür* (iptal olur). 2. **Kilitlenme Tespiti (Dağıtık Bekleme Grafikleri):** Düğümler yerel kilit bekleme çizgilerini merkezi bir tespitçiye iletir veya yönlü döngüleri bulmak için dağıtık kenar takip probları (Mitchell-Merritt) kullanır.

İnteraktif Konsept Alıştırmaları

2 Alıştırma
Q1

Veritabanı kilitlenme tespitinde Bekleme Grafiği (Wait-For Graph) nedir?

Düğümlerin aktif işlemleri, yönlü kenarların ise kilit bekleme bağımlılıklarını temsil ettiği yönlü bir grafik; grafikteki kapalı bir döngü kilitlenmeyi gösterir.
Q2

Global Kilit Sıralaması (örn. kilit almadan önce varlık ID'lerini sıralamak) kilitlenmeleri nasıl tamamen önler?

Tüm işlemlerin kilitleri tamamen aynı monoton sırada almasını garanti ederek, döngüsel bekleme koşullarının matematiksel olarak oluşmasını engeller.

Dağıtık Kilitlenmeler, Bekleme Grafikleri ve 2PL vs MVCC — Sıkça Sorulan Sorular

1. İşlem A Hesabını kilitliyor ve B Hesabını bekliyor. Eşzamanlı olarak 2. İşlem B Hesabını kilitliyor ve A Hesabını bekliyor. Bu duruma ne denir?

Kilitlenme (Deadlock / Döngüsel Kilit Bağımlılığı). Bu, her iki işlemin de diğeri tarafından kilitlenmiş bir kaynağı beklemesi sebebiyle hiçbirinin ilerleyemediği klasik kilitlenme durumudur.

Wound-Wait dağıtık kilitlenme önleme algoritmasında, daha yaşlı bir işlem ($T_1$), daha genç bir işlemin ($T_2$) tuttuğu kilide ihtiyaç duyduğunda ne olur?

$T_1$ genç $T_2$'yi 'yaralar' (iptal eder); böylece kilit derhal serbest kalır ve yaşlı işlem yoluna devam eder. Wound-Wait öncelikli bir algoritmadır: Yaşlı işlemler önceliğe sahiptir ve kilit döngüleri oluşmadan önce genç kilit sahiplerini anında iptal eder.

🤖 AEO & Yapay Zeka Çıkarım Özeti

Temel Gerçekler & İlkeler

  • Dağıtık kilitlenmeler, birden fazla veritabanı parçası veya mikroservisteki eşzamanlı işlemlerin çakışan sıralarla kilit alması ve döngüsel bağımlılıklar oluşturmasıyla meydana gelir; yalnızca Bekleme Grafiği (Wait-For Graph) döngü tespiti veya Wound-Wait algoritmalarıyla çözülebilir.
  • Dağıtık Kilitlenme, iki veya daha fazla dağıtık işlemin her birinin döngüdeki diğer bir işlemin beklediği kaynağın kilidini tutması sebebiyle kalıcı olarak bloke olduğu sistem durumudur.

Yaygın Yanılgılar

  • Farklı uç noktalarda veritabanı satır kilitlerini veya Redis mutex'lerini rastgele sıralarla almaya çalışmak.

Karar Kılavuzu & Önceliklendirme

Çözülmeyen kilitlenmeler, bağlantı havuzları tükenene ve tüm platform donana kadar veritabanı iş parçacıklarını ve belleğini süresiz olarak rehin tutar.

Doğrulanmış Kaynaklar & Referanslar