İçeriğe geç

Lider Seçimi ve Split-Brain — Ağ Bölününce Kim Karar Verir?

İleri 10 dk Sık karşılaşılır

Önce şunu oku: Dağıtık Kilit ve Fencing Token — Kilit Senin Sandığında

30 saniyede özet

Bir kümede yazmaları tek bir lider kabul eder. Ağ bölününce iki taraf da kendini lider sanabilir ve aynı veriye iki farklı geçmiş yazılır. Çözüm iki kural: lider çoğunluk oyuyla seçilir, yazma çoğunluğa ulaşınca onaylanır.

Beş haneli bir köyde bir muhtar var. Bir gün sel köprüyü yıkıyor: iki hane bir kıyıda, üç hane öbür kıyıda kalıyor. İki kıyı da kendi muhtarını seçerse, aynı tarla iki kez satılabilir.

  1. Bayt: Hesap defteri beş düğümde tutuluyor. Lider düşerse biri hemen onun yerine geçiyor!

  2. Sen: Dün ağ birkaç saniye bölündü. Bir havale onaylanmıştı, ama sonra kayboldu.

  3. Bayt: Loglarda aynı anda iki lider görünüyor... ikisi de yazmayı kabul etmiş.

  4. Bayt: Yerine geçmek kolay. Zor olan, aynı anda iki kişinin geçmemesi.

Ağ bölününce ne olur?

Bir kümede yazmaları tek bir düğüm kabul eder: lider. Öbürleri ondan düzenli kalp atışıLiderin diğer düğümlere düzenli aralıklarla gönderdiği 'buradayım' mesajı. Gelmezse yeni bir seçim başlar.Sözlükte gör → bekler; gelmezse yeni bir lider seçimiBir kümede yazmaları kabul edecek tek düğümün belirlenmesi. Güvenli olması için düğümlerin çoğunluğunun oyu gerekir.Sözlükte gör → başlar.

Ama kalp atışının kesilmesi liderin öldüğü anlamına gelmez; ağ bölünmüş olabilir. İki taraf da kendi liderini seçerse buna split-brainAğ bölününce iki tarafın da kendi liderini seçip yazması. Birleşince iki farklı geçmiş olur ve biri silinmek zorundadır.Sözlükte gör → denir: iki taraf da yazar ve birleşince bir geçmiş silinmek zorundadır.

Kafam karıştı, daha basit anlat

Ağ bölünürse iki taraf da kendini yetkili sanabilir. İkisi de yazarsa, birleşince birinin yazdıkları silinir.

Hızlı kontrolOrta

Split-brain nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bir düğüm liderden kalp atışı alamıyor. Kesin olarak ne bilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Çoğunluk tek kişidir

Yeni lider artık çoğunluk oyuyla seçiliyor: C, D, E oy verdi ve C lider oldu. Ama eski lider A bunu bilmiyor ve yazmaları tek başına onaylamaya devam ediyor. Ağ birleşince A'nın onayladığı havaleye ne olur? Cevabı göster

Silinir. A, C’nin daha yeni bir dönemde seçildiğini görünce liderliği bırakır ve yalnız başına yazdıklarını atar. Müşteri “onaylandı” cevabını almıştı; o cevap yalandı.

Muhtar, beş haneden üçüyle seçilir.
Adım adım oku
  1. Beş hane, bir muhtar.
  2. Sel köprüyü yıktı: iki kıyı.
  3. İki muhtar, aynı tarlayı iki kez sattı.
  4. Kural: muhtar, beş haneden üçüyle seçilir.

RaftBir uzlaşma algoritması: lider çoğunluk oyuyla seçilir, yazma çoğunluk saklayınca onaylanır. etcd ve Kafka KRaft bunu kullanır.Sözlükte gör → iki kuralla bunu önler. Lider çoğunluk oyuyla seçilir ve her seçim bir dönem numarası alır. Bir yazma da ancak düğümlerin çoğunluğu onu sakladıktan sonra onaylanır.

Beş düğümde çoğunluk üçtür ve iki ayrı üçlü aynı anda olamaz. Azınlıkta kalan eski lider, yazmayı üç düğüme ulaştıramadığı için onaylayamaz; müşteri yalan bir “tamam” yerine bir hata alır.

Kafam karıştı, daha basit anlat

Seçim de onay da çoğunlukla. Çoğunluk tek olduğu için iki lider de iki onaylı geçmiş de olamaz.

Hızlı kontrolİleri

Beş düğümlü bir kümede lider çoğunluk oyuyla seçiliyorsa neden aynı anda iki seçilmiş lider olamaz?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Raft'ta bir yazma ne zaman onaylanır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Beş düğüm, bir ağ bölünmesi

Tohum 987964

Oynat ya da adımla: A lider, beş düğüm bağlı.

Hız
Adım 0

Şu an ne oldu?

Kalp atışı kesilen kendini lider ilan eder

A lider. Birazdan ağ ikiye bölünecek: A ile B bir tarafta, C, D, E öbür tarafta.

Görevler0/3

  • Aynı anda iki lider olsunaçık

    İpucu

    Oy istemeden lider seç.

  • Tek lider seçilsin, ama onaylanmış bir havale yine de silinsinaçık

    İpucu

    Seçimi çoğunlukla yap, yazmayı değil.

  • Onaylanan hiçbir havale kaybolmasınaçık

    İpucu

    İki kural birden.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. C kalp atışı alamayınca kendini lider ilan etti; iki lider, iki onaylı havale, biri silindi.
  2. “Çoğunluk oyuyla” seç. Tek seçilmiş lider var, ama eski lider A havale 2’yi yine onayladı ve o havale silindi.
  3. “Çoğunluk oyu + çoğunluğa yazma” seç. A havale 2’yi onaylayamadı, müşteri hata aldı. Onaylanan hiçbir havale kaybolmadı.
Hızlı kontrolİleri

Yeni lider çoğunlukla seçildi, ama eski lider bunu bilmeden yazmaları tek başına onaylamaya devam ediyor. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Raft'ta azınlıkta kalan taraf bölünme boyunca ne yapabilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Uzlaşmayı kendin yazmak. Raft’ın sınır durumları çoktur. etcd, Consul ya da Kafka’nın KRaft modu gibi bunu zaten yapan sistemleri kullan.

Çift sayıda düğüm. Dört düğümde çoğunluk üçtür; ikiye iki bölünmede hiçbir taraf seçim yapamaz. Beş düğüm, dörtten daha çok arızaya dayanır.

Kafka’da acks=1 ile yetinmek. Lider yazmayı tek başına onaylar ve lider değişince kaybolabilir. Önemli kayıtlar için acks=all ile min.insync.replicas=2 kullan.

Kafam karıştı, daha basit anlat

Uzlaşmayı hazır sistemlere bırak, tek sayıda düğüm kullan, Kafka’da çoğunluk onayı iste.

Hızlı kontrolOrta

Neden dört yerine beş düğümlü küme tercih edilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Hesap defteri: çoğunluk onayı ve tek liderli zamanlanmış iş 4 dosya · ~83 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/ledger/ LedgerKafkaConfig.java Kafka: kayıt, en az iki kopya saklayınca onaylanır; bölünmede azınlık taraf yazamaz.

src/main/java/com/bank/ledger/LedgerKafkaConfig.java
@Configuration
class LedgerKafkaConfig {
// Three copies; a write is acknowledged only when at least two of them have it.
@Bean
NewTopic ledgerTopic() {
return TopicBuilder.name("ledger-entries")
.partitions(6)
.replicas(3)
.config(TopicConfig.MIN_IN_SYNC_REPLICAS_CONFIG, "2")
.build();
}
@Bean
ProducerFactory<String, LedgerEntry> ledgerProducerFactory(KafkaProperties properties) {
Map<String, Object> config = new HashMap<>(properties.buildProducerProperties(null));
config.put(ProducerConfig.ACKS_CONFIG, "all");
config.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
return new DefaultKafkaProducerFactory<>(config);
}
}

src/main/java/com/bank/ledger/ LeadershipConfig.java Liderlik: zamanlanmış iş yalnızca kilidi tutan örnekte çalışır; kilit veritabanında.

src/main/java/com/bank/ledger/LeadershipConfig.java
@Configuration
class LeadershipConfig {
@Bean
DefaultLockRepository lockRepository(DataSource dataSource) {
return new DefaultLockRepository(dataSource);
}
@Bean
JdbcLockRegistry lockRegistry(LockRepository repository) {
return new JdbcLockRegistry(repository);
}
// Only the instance holding the lock is leader; the others keep trying.
@Bean
LockRegistryLeaderInitiator leaderInitiator(LockRegistry registry) {
return new LockRegistryLeaderInitiator(registry);
}
}

src/main/java/com/bank/ledger/ InterestPostingJob.java İş: liderlik verilince başlar, geri alınınca durur.

src/main/java/com/bank/ledger/InterestPostingJob.java
@Component
class InterestPostingJob {
private final AtomicBoolean leading = new AtomicBoolean(false);
private final InterestPosting posting;
InterestPostingJob(InterestPosting posting) {
this.posting = posting;
}
@EventListener
void onGranted(OnGrantedEvent event) {
leading.set(true);
}
@EventListener
void onRevoked(OnRevokedEvent event) {
leading.set(false); // stop at once: someone else may already be leading
}
@Scheduled(cron = "0 5 0 * * *", zone = "Europe/Istanbul")
void postDailyInterest() {
if (leading.get()) {
posting.postForYesterday();
}
}
}

src/test/java/com/bank/ledger/ InterestPostingJobTest.java Test: liderlik geri alındıktan sonra iş hiçbir şey yazmaz.

src/test/java/com/bank/ledger/InterestPostingJobTest.java
class InterestPostingJobTest {
private final InterestPosting posting = mock(InterestPosting.class);
private final InterestPostingJob job = new InterestPostingJob(posting);
private final Context context = mock(Context.class);
@Test
void runsOnlyWhileLeading() {
job.onGranted(new OnGrantedEvent(this, context, "ledger"));
job.postDailyInterest();
job.onRevoked(new OnRevokedEvent(this, context, "ledger"));
job.postDailyInterest();
verify(posting, times(1)).postForYesterday();
}
}

Kendini sına

Şimşek turu1/4

Kalp atışı kesilen düğüm, liderin öldüğünden emin olabilir.

Soru 1/3İleri

Kafka'da acks=1 ile gönderilen bir kayıt neden kaybolabilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Kalp atışı kesildi diye kendini lider ilan eden düğüm, bölünmede ikinci bir lider demektir. Buna split-brain denir: iki taraf da yazar, birleşince bir geçmiş silinir.
  2. 2 Raft'ın iki kuralı: lider çoğunluk oyuyla seçilir ve bir yazma ancak çoğunluk onu sakladıktan sonra onaylanır. Çoğunluk tek olduğu için iki lider de iki onaylı geçmiş de olamaz.
  3. 3 Bedeli, azınlıkta kalan tarafın bölünme boyunca yazamamasıdır. Uzlaşma algoritmasını kendin yazma; Raft kullanan sistemleri (etcd, Kafka KRaft) ve doğru ayarlarını kullan.
Sonraki kapı Denetim kaydında müşteri, parasını yatırmadan önce çekmiş görünüyor. Sistem dolandırıcılık alarmı verdi. Müşteri suçsuz. Ne oldu? Mantıksal Saatler — Sunucuların Saati Farklıysa Hangisi Önce Oldu? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı