Raft dağıtık mutabakat algoritmasını, temel prensiplerini, operasyonel aşamalarını, pratik uygulama noktalarını ve küresel ölçeklenebilir sistemler için...
Dağıtık Mutabakat Ustalaşmak: Küresel Sistemler İçin Raft Algoritması Uygulamasına Derinlemesine Bir Bakış
Artan bir şekilde birbirine bağlı dünyamızda, dağıtık sistemler neredeyse her dijital hizmetin omurgasını oluşturur; e-ticaret platformları ve finans kuruluşlarından bulut bilişim altyapısına ve gerçek zamanlı iletişim araçlarına kadar. Bu sistemler, iş yüklerini ve verileri birden fazla makineye dağıtarak eşsiz ölçeklenebilirlik, kullanılabilirlik ve dayanıklılık sunar. Ancak bu güç, önemli bir zorlukla birlikte gelir: ağ gecikmeleri, düğüm arızaları ve eşzamanlı işlemler karşısında bile tüm bileşenlerin sistemin durumu üzerinde anlaşmasını sağlamak. Bu temel sorun dağıtık mutabakat olarak bilinir.
Asenkron, arızaya yatkın bir dağıtık ortamda mutabakatı sağlamak kötü şöhretli bir şekilde karmaşıktır. On yıllardır Paxos, bu zorluğun üstesinden gelmek için baskın algoritma olmuştur, teorik sağlamlığı nedeniyle saygı görmüş ancak genellikle karmaşıklığı ve uygulanmasının zorluğu nedeniyle eleştirilmiştir. Ardından, temel bir hedefle tasarlanmış bir algoritma olan Raft geldi: anlaşılabilirlik. Raft, hataya dayanıklılık ve performans açısından Paxos'a eşdeğer olmayı amaçlar, ancak geliştiricilerin daha kolay kavrayıp üzerine inşa edebilecekleri bir şekilde yapılandırılmıştır.
Bu kapsamlı kılavuz, Raft algoritmasını derinlemesine inceleyerek, temel prensiplerini, operasyonel mekanizmalarını, pratik uygulama noktalarını ve sağlam, küresel olarak dağıtılmış uygulamalar oluşturmadaki hayati rolünü ele almaktadır. Deneyimli bir mimar, dağıtık sistemler mühendisi veya yüksek kullanılabilirlik hizmetleri oluşturmaya istekli bir geliştirici olun, Raft'ı anlamak modern bilişimin karmaşıklıklarında ustalaşmaya giden temel bir adımdır.
Modern Mimari'lerde Dağıtık Mutabakatın Vazgeçilmez İhtiyacı
Her saniye milyonlarca işlem gerçekleştiren küresel bir e-ticaret platformunu hayal edin. Müşteri verileri, envanter seviyeleri, sipariş durumları—tüm bunlar kıtaları kapsayan sayısız veri merkezinde tutarlı kalmalıdır. Bir bankacılık sisteminin defteri, birden fazla sunucuya yayılmış olsa da, bir hesap bakiyesi üzerindeki tek bir anlık anlaşmazlığa bile tahammül edemez. Bu senaryolar, dağıtık mutabakatın kritik önemini vurgulamaktadır.
Dağıtık Sistemlerin Doğasında Var Olan Zorluklar
Dağıtık sistemler, doğası gereği, monolitik uygulamalarda bulunmayan sayısız zorluk getirir. Bu zorlukları anlamak, Raft gibi algoritmaların zarafetini ve gerekliliğini takdir etmek için kritik öneme sahiptir:
- Kısmi Arızalar: Tamamen çalışan veya tamamen arızalanan tek bir sunucunun aksine, bir dağıtık sistemin bazı düğümleri arızalanırken diğerleri çalışmaya devam edebilir. Bir sunucu çökmüş olabilir, ağ bağlantısı kesilmiş olabilir veya diski bozulmuş olabilir; bunların hepsi kümenin geri kalanı işlevselken meydana gelebilir. Sistem, bu kısmi arızalara rağmen doğru şekilde çalışmaya devam etmelidir.
- Ağ Bölünmeleri: Düğümleri birbirine bağlayan ağ her zaman güvenilir değildir. Ağ bölünmesi, düğümlerin alt kümeleri arasındaki iletişimin kesildiği zamandır ve bu da belirli düğümlerin hala çalışıyor olsalar bile arızalanmış gibi görünmesine neden olur. Farklı sistem parçalarının eski veya tutarsız bilgilere dayanarak bağımsız olarak çalıştığı bu "beyin ayrılması" senaryolarını çözmek, temel bir mutabakat sorunudur.
- Asenkron İletişim: Düğümler arasındaki mesajlar gecikebilir, yeniden sıralanabilir veya tamamen kaybolabilir. Küresel bir saat veya mesaj teslim garantisi yoktur, bu da olayların tutarlı bir sırasını veya kesin bir sistem durumunu oluşturmayı zorlaştırır.
- Eşzamanlılık: Birden fazla düğüm aynı veri parçasını güncellemeye veya işlemleri aynı anda başlatmaya çalışabilir. Bu işlemleri koordine etmek için bir mekanizma olmadan, çatışmalar ve tutarsızlıklar kaçınılmazdır.
- Öngörülemeyen Gecikme: Özellikle küresel olarak dağıtılmış dağıtımlarda, ağ gecikmesi önemli ölçüde değişebilir. Bir bölgede hızlı olan işlemler başka bir bölgede yavaş olabilir, karar verme süreçlerini ve koordinasyonu etkiler.
Neden Mutabakat Güvenilirliğin Köşe Taşıdır
Mutabakat algoritmaları, bu zorlukları çözmek için temel bir yapı taşı sağlar. Güvenilmez bileşenlerden oluşan bir koleksiyonun toplu olarak tek, yüksek derecede güvenilir ve tutarlı bir birim olarak hareket etmesini sağlar. Özellikle mutabakat şunları başarmaya yardımcı olur:
- Durum Makinesi Çoğaltması (SMR): Hata toleranslı dağıtık sistemlerin çoğunun arkasındaki temel fikir. Tüm düğümler işlemlerin sırası üzerinde anlaşırsa ve her düğüm aynı başlangıç durumunda başlar ve bu işlemleri aynı sırada yürütürse, tüm düğümler aynı nihai duruma ulaşacaktır. Mutabakat, bu küresel işlem sırası üzerinde anlaşma mekanizmasıdır.
- Yüksek Kullanılabilirlik: Bir sistemin az sayıda düğüm arızalansa bile çalışmaya devam etmesine izin vererek, hizmetlerin erişilebilir ve işlevsel kalmasını sağlayarak kesinti süresini en aza indirir.
- Veri Tutarlılığı: Verilerin tüm kopyalarının senkronize kalmasını garanti ederek, çelişkili güncellemeleri önler ve müşterilerin her zaman en güncel ve doğru bilgileri okumasını sağlar.
- Hata Toleransı: Sistem, belirli sayıda rastgele düğüm arızasına (genellikle çökme arızaları) tahammül edebilir ve insan müdahalesi olmadan ilerlemeye devam edebilir.
Raft'ı Tanıtmak: Mutabakat İçin Anlaşılabilir Bir Yaklaşım
Raft, akademik dünyadan net bir hedefle ortaya çıktı: dağıtık mutabakatı ulaşılabilir kılmak. Yazarları Diego Ongaro ve John Ousterhout, Raft'ı açıkça anlaşılabilirlik için tasarladılar ve mutabakat algoritmalarının daha yaygın benimsenmesini ve doğru uygulanmasını sağlamayı amaçladılar.
Raft'ın Temel Tasarım Felsefesi: Önce Anlaşılabilirlik
Raft, mutabakatın karmaşık sorununu, her biri kendi özel kural ve davranış setlerine sahip birkaç nispeten bağımsız alt probleme ayırır. Bu modülerlik, anlaşılmaya önemli ölçüde yardımcı olur. Temel tasarım ilkeleri şunları içerir:
- Lider Odaklı Yaklaşım: Diğer bazı mutabakat algoritmalarının aksine, tüm düğümlerin karar verme süreçlerine eşit olarak katıldığı Raft, tek bir lider atar. Lider, çoğaltılmış günlüğü yönetmekten ve tüm istemci isteklerini koordine etmekten sorumludur. Bu, günlük yönetimini basitleştirir ve düğümler arasındaki etkileşimlerin karmaşıklığını azaltır.
- Güçlü Lider: Lider, yeni günlük girdilerini önerme ve bunların ne zaman işlendiğini belirleme konusunda nihai otoritedir. Takipçiler pasif olarak liderin günlüğünü çoğaltır ve liderin isteklerine yanıt verir.
- Deterministik Seçimler: Raft, verilen bir seçim döneminde tipik olarak yalnızca bir adayın lider olarak ortaya çıkmasını sağlamak için rastgeleleştirilmiş bir seçim zaman aşımı kullanır.
- Günlük Tutarlılığı: Raft, çoğaltılmış günlüğü üzerinde güçlü tutarlılık özellikleri uygular ve işlenen girdilerin asla geri alınmayacağını ve tüm işlenen girdilerin sonunda tüm kullanılabilir düğümlerde görüneceğini garanti eder.
Paxos ile Kısa Bir Karşılaştırma
Raft'tan önce, Paxos dağıtık mutabakat için fiili standarttı. Güçlü olmasına rağmen, Paxos'un anlaşılması ve doğru uygulanması kötü şöhretli bir şekilde zordur. Rolleri (öneren, kabul eden, öğrenen) ayıran ve birden fazla liderin eşzamanlı olarak var olmasına izin veren (ancak yalnızca birinin bir değeri işleyebildiği) tasarımı, karmaşık etkileşimlere ve uç durumlara yol açabilir.
Buna karşılık Raft, durum alanını basitleştirir. Liderin tüm günlük değişikliklerinden sorumlu olduğu güçlü bir lider modelini uygular. Açıkça roller (Lider, Takipçi, Aday) ve bunlar arasındaki geçişleri tanımlar. Bu yapı, Raft'ın davranışını daha sezgisel ve anlaşılması daha kolay hale getirir, daha az uygulama hatasına ve daha hızlı geliştirme döngülerine yol açar. Başlangıçta Paxos ile mücadele eden birçok gerçek dünya sistemi, Raft'ı benimseyerek başarı bulmuştur.
Raft'ta Üç Temel Rol
Herhangi bir zamanda, bir Raft kümesindeki her sunucu üç durumdan birinde bulunur: Lider, Takipçi veya Aday. Bu roller münhasırdır ve dinamiktir, sunucular belirli kurallara ve olaylara göre aralarında geçiş yapar.
1. Takipçi
- Pasif Rol: Takipçiler, Raft'taki en pasif durumdur. Sadece liderlerden ve adaylardan gelen isteklere yanıt verirler.
-
Heartbeat Alma: Bir takipçi, düzenli aralıklarla liderden heartbeat (boş AppendEntries RPC'leri) almayı bekler. Bir takipçi, belirli bir
election timeoutsüresi içinde bir heartbeat veya AppendEntries RPC almazsa, liderin arızalandığını varsayar ve aday durumuna geçer. - Oylama: Bir seçim sırasında, bir takipçi her dönem için en fazla bir adaya oy verecektir.
- Günlük Çoğaltma: Takipçiler, liderin talimatı doğrultusunda yerel günlüklerine günlük girdilerini ekler.
2. Aday
- Seçim Başlatma: Bir takipçi zaman aşımına uğradığında (liderden ses gelmediğinde), yeni bir seçim başlatmak için aday durumuna geçer.
-
Kendine Oy Verme: Bir aday
current term'ini artırır, kendisine oy verir ve kümedeki diğer tüm sunucularaRequestVoteRPC'leri gönderir. - Seçimi Kazanma: Bir aday, aynı dönem için kümedeki sunucuların çoğunluğundan oy alırsa, lider durumuna geçer.
- Geri Çekilme: Bir aday, daha yüksek bir döneme sahip başka bir sunucu keşfederse veya geçerli bir liderden bir AppendEntries RPC alırsa, takipçi durumuna döner.
3. Lider
- Tek Yetki: Herhangi bir zamanda (belirli bir dönem için) bir Raft kümesinde yalnızca bir lider bulunur. Lider, tüm istemci etkileşimlerinden, günlük çoğaltmasından ve tutarlılığın sağlanmasından sorumludur.
-
Heartbeat Gönderme: Lider, otoritesini sürdürmek ve yeni seçimleri önlemek için tüm takipçilere periyodik olarak
AppendEntriesRPC'leri (heartbeat'ler) gönderir. - Günlük Yönetimi: Lider, istemci isteklerini kabul eder, yeni günlük girdilerini yerel günlüğüne ekler ve ardından bu girdileri tüm takipçilere çoğaltır.
- İşleme: Lider, bir girdinin çoğunluk sunucusuna güvenli bir şekilde çoğaltıldığını ve durum makinesine işlenebileceğini belirler.
-
Geri Çekilme: Lider, daha yüksek bir
term'e sahip bir sunucu keşfederse, hemen geri çekilir ve takipçi durumuna döner. Bu, sistemin her zaman bilinen en yüksek dönemle ilerlemesini sağlar.
Raft'ın Operasyonel Aşamaları: Ayrıntılı Bir Yürüyüş
Raft, lider seçimi ve günlük çoğaltmanın sürekli bir döngüsü aracılığıyla çalışır. Bu ikiincil mekanizma, kritik güvenlik özellikleri ile birlikte, kümenin tutarlılığı ve hata toleransını sürdürmesini sağlar.
1. Lider Seçimi
Lider seçimi süreci, Raft'ın operasyonunun temelidir ve kümenin eylemleri koordine etmek için her zaman tek, yetkili bir düğüme sahip olmasını sağlar.
-
Seçim Zaman Aşımı: Her takipçi rastgeleleştirilmiş bir
election timeout(tipik olarak 150-300ms) tutar. Bir takipçi, bu zaman aşımı süresi içinde mevcut liderden herhangi bir iletişim (heartbeat veya AppendEntries RPC) almazsa, liderin arızalandığını veya bir ağ bölümünün meydana geldiğini varsayar. -
Aday'a Geçiş: Zaman aşımında, takipçi yeni bir seçim başlatmak için
Candidatedurumuna geçer.current term'ini artırır, kendisine oy verir ve seçim zamanlayıcısını sıfırlar. -
RequestVote RPC: Aday daha sonra kümedeki diğer tüm sunuculara
RequestVoteRPC'leri gönderir. Bu RPC, adayıncurrent term'ini,candidateId'sini velast log indexvelast log termhakkındaki bilgilerini içerir (neden bunun güvenlik için kritik olduğu daha sonra ele alınacaktır). -
Oylama Kuralları: Bir sunucu, aşağıdaki durumlarda bir adaya oy verecektir:
-
current term'i, adayın döneminden küçük veya ona eşittir. - Mevcut dönemde henüz başka bir adaya oy vermemiştir.
-
Adayın günlüğü kendisininki kadar günceldir. Bu, önce
last log term, ardından dönemler aynıysalast log indexkarşılaştırılarak belirlenir. Bir aday, günlüğünde seçmeninkinde bulunan tüm işlenmiş girdileri içeriyorsa "günceldir". Bu, seçim kısıtlaması olarak bilinir ve güvenlik için kritiktir.
-
-
Seçimi Kazanma: Bir aday, aynı dönem için kümedeki sunucuların çoğunluğundan oy alırsa yeni lider olur. Seçildikten sonra, yeni lider derhal otoritesini kurmak ve yeni seçimleri önlemek için diğer tüm sunuculara
AppendEntriesRPC'leri (heartbeat'ler) gönderir. - Oyların Bölünmesi ve Yeniden Denemeler: Birden fazla adayın eşzamanlı olarak ortaya çıkması mümkündür, bu da hiçbir adayın çoğunluğu elde edemediği bir oyların bölünmesine yol açar. Bunu çözmek için her adayın rastgeleleştirilmiş bir seçim zaman aşımı vardır. Bir adayın seçim süresi dolmadan veya yeni bir liderden haber almadan zaman aşımı dolarsa, dönemini artırır ve yeni bir seçim başlatır. Rastgeleleştirme, oyların bölünmesinin nadir olmasını ve çabuk çözülmesini sağlamaya yardımcı olur.
-
Daha Yüksek Dönemleri Keşfetme: Bir aday (veya herhangi bir sunucu), kendi
current term'inden daha yüksek birtermiçeren bir RPC alırsa, hemen kendicurrent term'ini daha yüksek değere günceller vefollowerdurumuna döner. Bu, eski bilgilere sahip bir sunucunun asla lider olmaya çalışmamasını veya geçerli bir lideri bozmasını sağlar.
2. Günlük Çoğaltma
Bir lider seçildikten sonra, birincil sorumluluğu çoğaltılmış günlüğü yönetmek ve küme genelinde tutarlılığı sağlamaktır. Bu, istemci komutlarını kabul etmeyi, bunları günlüğüne eklemeyi ve bunları takipçilere çoğaltmayı içerir.
- İstemci İstekleri: Tüm istemci istekleri (durum makinesi tarafından yürütülecek komutlar) lidere yönlendirilir. Bir istemci bir takipçiye başvurursa, takipçi isteği mevcut lidere yönlendirir.
-
Liderin Günlüğüne Ekleme: Lider bir istemci komutu aldığında, komutu yerel günlüğüne yeni bir
log entryolarak ekler. Her günlük girdisi, komutun kendisini, alındığıterm'i velog index'ini içerir. -
AppendEntries RPC: Lider daha sonra tüm takipçilere
AppendEntriesRPC'leri göndererek, yeni günlük girdisini (veya bir dizi girdiyi) kendi günlüklerine eklemelerini ister. Bu RPC'ler şunları içerir:-
term: Liderin mevcut dönemi. -
leaderId: Liderin kimliği (takipçilerin istemcileri yönlendirmesi için). -
prevLogIndex: Yeni girdilerden hemen önceki günlük girdisinin indeksi. -
prevLogTerm:prevLogIndexgirdisinin dönemi. Bu ikisi (prevLogIndex,prevLogTerm) günlük eşleştirme özelliği için kritiktir. -
entries[]: Saklanacak günlük girdileri (heartbeat'ler için boş). -
leaderCommit: LiderincommitIndex'i (işlendiği bilinen en yüksek günlük girdisinin indeksi).
-
-
Tutarlılık Kontrolü (Günlük Eşleştirme Özelliği): Bir takipçi bir
AppendEntriesRPC aldığında, bir tutarlılık kontrolü yapar. GünlüğününprevLogIndex'teprevLogTermile eşleşen bir döneme sahip bir girdisi olup olmadığını doğrular. Bu kontrol başarısız olursa, takipçiAppendEntriesRPC'sini reddeder ve günlüğünün tutarsız olduğunu lidere bildirir. -
Tutarsızlıkları Çözme: Bir takipçi bir
AppendEntriesRPC'sini reddederse, lider o takipçi içinnextIndex'i azaltır veAppendEntriesRPC'sini yeniden dener.nextIndex, liderin belirli bir takipçiye göndereceği bir sonraki günlük girdisinin indeksidir. Bu işlem,nextIndexlider ve takipçinin günlüklerinin eşleştiği bir noktaya ulaşana kadar devam eder. Eşleşme bulunduktan sonra, takipçi sonraki günlük girdilerini kabul edebilir ve sonunda kendi günlüğünü liderinkine uygun hale getirebilir. -
Girdileri İşleme: Bir girdi, lider tarafından çoğunluk sunucusuna (kendisi dahil) başarıyla çoğaltıldığında işlenmiş kabul edilir. İşlendikten sonra, yerel durum makinesine uygulanabilir. Lider
commitIndex'ini günceller ve bunu sonrakiAppendEntriesRPC'lerine dahil ederek takipçileri işlenmiş girdiler hakkında bilgilendirir. Takipçiler, liderinleaderCommit'ine dayanarakcommitIndex'lerini günceller ve bu indekse kadar olan girdileri durum makinelerine uygularlar. - Lider Tamamlama Özelliği: Raft, belirli bir dönemde işlenmiş bir günlük girdisi varsa, sonraki tüm liderlerin de bu günlük girdisine sahip olacağını garanti eder. Bu özellik, işlenmiş verilerin kaybolmasını önlemek için kritiktir ve öncelikle seçim kısıtlaması tarafından sağlanır. Bu, bir liderin işlenmiş girdileri üzerine yazabilecek veya kaçırabilecek bir liderin seçilmesini önler.
3. Güvenlik Özellikleri ve Garantiler
Raft'ın sağlamlığı, tutarsızlıkları önleyen ve veri bütünlüğünü sağlayan dikkatlice tasarlanmış birkaç güvenlik özelliğinden kaynaklanır:
- Seçim Güvenliği: Belirli bir dönemde en fazla bir lider seçilebilir. Bu, bir takipçinin dönem başına en fazla bir oy verdiği oylama mekanizması ve bir adayın çoğunluk oyuna ihtiyaç duyması ile sağlanır.
- Lider Tamamlama: Bir günlük girdisi belirli bir dönemde işlenmişse, o girdi sonraki tüm liderlerin günlüklerinde bulunacaktır. Bu, işlenmiş verilerin kaybını önlemek için kritiktir ve öncelikli olarak seçim kısıtlaması tarafından sağlanır.
- Günlük Eşleştirme Özelliği: İki günlük aynı indekse ve döneme sahip bir girdi içeriyorsa, günlükler önceki tüm girdilerde özdeştir. Bu, günlük tutarlılık kontrollerini basitleştirir ve liderin takipçilerin günlüklerini verimli bir şekilde güncel tutmasını sağlar.
- İşleme Güvenliği: Bir girdi işlendikten sonra asla geri alınamaz veya üzerine yazılamaz. Bu, Lider Tamamlama ve Günlük Eşleştirme özelliklerinin doğrudan bir sonucudur. Bir girdi işlendikten sonra, kalıcı olarak saklandığı kabul edilir.
Raft'ta Anahtar Kavramlar ve Mekanizmalar
Roller ve operasyonel aşamaların ötesinde, Raft durumu yönetmek ve doğruluğu sağlamak için birkaç temel kavrama dayanır.
1. Dönemler
term, Raft'ta sürekli artan bir tamsayıdır. Küme için mantıksal bir saat görevi görür. Her dönem bir seçimle başlar ve bir seçim başarılı olursa, o dönem için tek bir lider seçilir. Dönemler, eski bilgileri belirlemek ve sunucuların her zaman en güncel bilgiyi kullanmasını sağlamak için kritiktir:
-
Sunucular, tüm RPC'lerde
current term'lerini değiş tokuş ederler. -
Bir sunucu başka bir sunucunun daha yüksek bir
term'e sahip olduğunu keşfederse, kendicurrent term'ini günceller vefollowerdurumuna döner. -
Bir aday veya lider,
term'inin eski olduğunu (başka bir sunucununterm'inden düşük olduğunu) keşfederse, hemen geri çekilir.
2. Günlük Girdileri
log, Raft'ın merkezi bileşenidir. Her log entry bir durum makinesi tarafından yürütülecek bir komutu temsil eden sıralı bir girdiler dizisidir. Her girdi şunları içerir:
- Komut: Gerçekleştirilecek işlem (örneğin, "x=5 olarak ayarla", "kullanıcı oluştur").
- Term: Girdinin liderde oluşturulduğu dönem.
- Indeks: Günlükteki girdinin konumu. Günlük girdileri indekse göre kesin olarak sıralanır.
Günlük kalıcıdır, yani girdiler, istemcilere yanıt vermeden önce kararlı depolamaya yazılır, çökmeler sırasında veri kaybını önler.
3. Durum Makinesi
Bir Raft kümesindeki her sunucu bir state machine (durum makinesi) tutar. Bu, işlenmiş günlük girdilerini işleyen uygulamaya özgü bir bileşendir. Tutarlılığı sağlamak için, durum makinesi deterministik olmalı (aynı başlangıç durumu ve komut dizisi verildiğinde her zaman aynı çıktıyı ve nihai durumu üretir) ve idempotent olmalıdır (aynı komutu birden çok kez uygulamak, tek bir kez uygulamakla aynı etkiye sahiptir; bu, Raft'ın günlük işleme işlemlerinin büyük ölçüde tek bir uygulama sağladığı göz önüne alındığında, yeniden denemeleri zarif bir şekilde ele almaya yardımcı olur).
4. Commit Index
commitIndex, işlendiği bilinen en yüksek günlük girdisi indeksidir. Bu, çoğunluk sunucusuna güvenli bir şekilde çoğaltıldığı ve durum makinesine uygulanabileceği anlamına gelir. Liderler commitIndex'i belirler ve takipçiler, liderin AppendEntries RPC'lerine dayanarak commitIndex'lerini güncellerler. commitIndex'e kadar olan tüm girdiler kalıcı kabul edilir ve geri alınamaz.
5. Snapshot'lar
Zamanla, çoğaltılmış günlük çok büyük büyüyebilir, önemli disk alanı tüketebilir ve günlük çoğaltma ve kurtarmayı yavaşlatabilir. Raft, snapshot'lar ile bunu ele alır. Bir snapshot, belirli bir anda durum makinesinin durumunun sıkıştırılmış bir temsilidir. Tam günlüğü tutmak yerine, sunucular periyodik olarak durumlarını "snapshot'layabilir", snapshot noktasına kadar olan tüm günlük girdilerini atabilir ve ardından snapshot'ı yeni veya geride kalan takipçilere çoğaltabilir. Bu işlem verimliliği önemli ölçüde artırır:
- Günlüğü Sıkıştır: Kalıcı günlük verilerinin miktarını azaltır.
- Daha Hızlı Kurtarma: Yeni veya çökmüş sunucular, tüm günlüğü baştan yeniden oynatmak yerine bir snapshot alabilir.
-
InstallSnapshot RPC: Raft, snapshot'ları liderden takipçilere aktarmak için bir
InstallSnapshotRPC tanımlar.
Etkili olmasına rağmen, snapshot'lar, özellikle eşzamanlı snapshot oluşturma, günlük kırpma ve iletimin yönetilmesinde uygulama karmaşıklığı ekler.
Raft'ı Uygulama: Küresel Dağıtım İçin Pratik Hususlar
Raft'ın zarif tasarımını sağlam, üretime hazır bir sisteme, özellikle küresel kitleler ve çeşitli altyapılar için çevirmek, bir dizi pratik mühendislik zorluğunu ele almayı içerir.
1. Küresel Bağlamda Ağ Gecikmesi ve Bölünmeleri
Küresel olarak dağıtılmış sistemler için ağ gecikmesi önemli bir faktördür. Bir Raft kümesi, tipik olarak, bir günlük girdisinin işlenmeden önce çoğunluk düğümünün üzerinde anlaşmasını gerektirir. Kıtalar boyunca yayılan bir kümede, düğümler arasındaki gecikme yüzlerce milisaniye olabilir. Bu doğrudan şunları etkiler:
- İşleme Gecikmesi: Bir istemci isteğinin işlenmesinin alabileceği süre, çoğunluğa olan en yavaş ağ bağlantısıyla darboğazlanabilir. Salt okunur takipçiler (bayat okumalar için lider etkileşimi gerektirmeyen) veya coğrafi olarak farkında olan çoğunluk yapılandırması (örneğin, 5 düğümlü bir küme için bir bölgede 3 düğüm, başka bir bölgede 2 düğüm; çoğunluk hızlı bir bölge içinde olabilir) gibi stratejiler bunu azaltabilir.
-
Lider Seçimi Hızı: Yüksek gecikme,
RequestVoteRPC'lerini geciktirebilir, bu da daha sık oyların bölünmesine veya daha uzun seçim sürelerine yol açabilir. Seçim zaman aşımlarını tipik düğümler arası gecikmeden önemli ölçüde daha büyük olacak şekilde ayarlamak kritiktir. - Ağ Bölünmesi İşlemi: Gerçek dünya ağları bölünmelere eğilimlidir. Raft, çoğunluk sunucusunu içeren bölümün yalnızca bir lider seçebileceği ve ilerleyebileceği konusunda ısrar ederek bölünmeleri doğru bir şekilde ele alır. Azınlık bölümü yeni girdileri işleyemez, böylece beyin ayrılması senaryolarını önler. Ancak, küresel bir kurulumda uzun süreli bölünmeler, belirli bölgelerde kullanılamazlığa yol açabilir, bu da çoğunluk yerleşimi hakkında dikkatli mimari kararlar gerektirir.
2. Kalıcı Depolama ve Dayanıklılık
Raft'ın doğruluğu, günlüğünün ve durumunun kalıcılığına büyük ölçüde bağlıdır. Bir sunucu bir RPC'ye yanıt vermeden veya bir girdiyi durum makinesine uygulamadan önce, ilgili verilerin (günlük girdileri, current term, votedFor) kararlı depolamaya yazıldığından ve fsync'lenmiş olduğundan (diske boşaltıldığından) emin olmalıdır. Bu, bir çökme durumunda veri kaybını önler. Hususlar şunları içerir:
- Performans: Sık disk yazımları performans darboğazı olabilir. Yazıları gruplandırmak ve yüksek performanslı SSD'ler kullanmak yaygın optimizasyonlardır.
- Güvenilirlik: Sağlam ve dayanıklı bir depolama çözümü (yerel disk, ağa bağlı depolama, bulut blok depolama) seçmek kritiktir.
- WAL (Write-Ahead Log): Genellikle, Raft uygulamaları, veritabanlarına benzer şekilde, değişikliklerin belleğe uygulanmadan önce diske yazılmasını sağlamak için WAL kullanır.
3. İstemci Etkileşimi ve Tutarlılık Modelleri
İstemciler, istekleri lidere göndererek Raft kümesiyle etkileşim kurar. İstemci isteklerini işlemek şunları içerir:
- Lider Keşfi: İstemcilerin mevcut lideri bulmak için bir mekanizmaya ihtiyacı vardır. Bu, bir hizmet keşif mekanizması, bir sabit uç nokta aracılığıyla yönlendirme veya bir sunucu lider olarak yanıt verene kadar deneme yoluyla olabilir.
- İstek Yeniden Denemeleri: Lider değişirse veya bir ağ hatası oluşursa istemciler istekleri yeniden denemeye hazır olmalıdır.
-
Okuma Tutarlılığı: Raft öncelikle yazmalar için güçlü tutarlılık garanti eder. Okumalar için birkaç model mümkündür:
- Güçlü Tutarlı Okumalar: Bir istemci, bir okumayı hizmet vermeden önce çoğunluk takipçilerine bir heartbeat göndererek durumunun güncel olduğundan emin olmasını liderden isteyebilir. Bu tazelik garanti eder ancak gecikme ekler.
- Lider Kirası Okumaları: Lider, birçoğuna kısa bir süre için "kira" alabilir, bu süre zarfında hala lider olduğunu bilir ve ek mutabakat gerektirmeden okumaları hizmet verebilir. Bu daha hızlıdır ancak zaman sınırlıdır.
- Bayat Okumalar (Takipçilerden): Doğrudan takipçilerden okumak daha düşük gecikme sağlayabilir ancak takipçinin günlüğü liderin gerisinde kalırsa bayat veriyi okuma riski vardır. Bu, sonuçsal tutarlılığın okumalar için yeterli olduğu uygulamalar için kabul edilebilirdir.
4. Yapılandırma Değişiklikleri (Küme Üyeliği)
Bir Raft kümesinin üyeliğini değiştirmek (sunucu eklemek veya kaldırmak), tutarsızlıkları veya beyin ayrılması senaryolarını önlemek için mutabakat yoluyla gerçekleştirilmesi gereken karmaşık bir işlemdir. Raft, Ortak Mutabakat adı verilen bir teknik önerir:
- İki Yapılandırma: Bir yapılandırma değişikliği sırasında, sistem geçici olarak iki örtüşen yapılandırmayla çalışır: eski yapılandırma (C_old) ve yeni yapılandırma (C_new).
- Ortak Mutabakat Durumu (C_old, C_new): Lider, ortak yapılandırmayı temsil eden özel bir günlük girdisi önerir. Bu girdi işlendikten sonra (hem C_old hem de C_new'den çoğunluk anlaşması gerektirir), sistem geçiş durumundadır. Şimdi kararlar her iki yapılandırmadan da çoğunluk gerektirir. Bu, geçiş sırasında eski veya yeni yapılandırmanın tek taraflı karar verememesini, sapmayı önlemesini sağlar.
- C_new'ye Geçiş: Ortak yapılandırma günlük girdisi işlendikten sonra, lider yalnızca yeni yapılandırmayı (C_new) temsil eden başka bir günlük girdisi önerir. Bu ikinci girdi işlendikten sonra, eski yapılandırma atılır ve sistem yalnızca C_new altında çalışır.
- Güvenlik: Bu iki aşamalı işlem gibi süreç, hiçbir noktada iki çelişkili liderin (biri C_old altında, diğeri C_new altında) seçilemeyeceğini ve sistemin değişiklik boyunca işlevsel kalacağını garanti eder.
Yapılandırma değişikliklerini doğru bir şekilde uygulamak, geçiş durumundaki sayısız uç nokta ve hata senaryosu nedeniyle Raft algoritmasının en karmaşık bölümlerinden biridir.
5. Dağıtık Sistemleri Test Etmek: Titiz Bir Yaklaşım
Raft gibi bir dağıtık mutabakat algoritmasını test etmek, belirtilemeyen doğası ve sayısız arıza modu nedeniyle son derece zordur. Basit birim testleri yetersizdir. Titiz testler şunları içerir:
- Hata Enjeksiyonu: Düğüm çökmeleri, ağ bölünmeleri, mesaj gecikmeleri ve mesaj yeniden sıralamaları gibi hataları sistematik olarak tanıtmak. Jepsen gibi araçlar özellikle bu amaç için tasarlanmıştır.
- Özellik Tabanlı Test: Değişmezleri ve güvenlik özelliklerini (örneğin, dönem başına en fazla bir lider, işlenmiş girdilerin asla kaybolmadığı) tanımlamak ve bu özelliklerin çeşitli koşullar altında uygulandığını test etmek.
- Model Kontrolü: Kritik algoritma parçaları için, doğruluğu kanıtlamak üzere biçimsel doğrulama teknikleri kullanılabilir, ancak bu son derece uzmanlaşmıştır.
- Simüle Edilmiş Ortamlar: Küresel dağıtımların tipik ağ koşullarını (gecikme, paket kaybı) simüle eden ortamlarda test çalıştırmak.
Kullanım Durumları ve Gerçek Dünya Uygulamaları
Raft'ın pratikliği ve anlaşılabilirliği, çeşitli kritik altyapı bileşenlerinde yaygın olarak benimsenmesine yol açmıştır:
1. Dağıtık Anahtar-Değer Depoları ve Veritabanı Çoğaltma
- etcd: Kubernetes'in temel bir bileşeni olan etcd, yapılandırma verilerini, hizmet keşif bilgilerini depolamak ve çoğaltmak ve kümenin durumunu yönetmek için Raft kullanır. Dayanıklılığı, Kubernetes'in doğru çalışması için çok önemlidir.
- Consul: HashiCorp tarafından geliştirilen Consul, hizmet keşfi, sağlık kontrolü ve dinamik altyapı ortamlarında yapılandırma yönetimi sağlayan dağıtık depolama arka ucu için Raft kullanır.
- TiKV: TiDB'nin (dağıtık bir SQL veritabanı) kullandığı dağıtık işlemsel anahtar-değer deposu, veri çoğaltma ve tutarlılık garantileri için Raft'ı uygular.
- CockroachDB: Bu küresel olarak dağıtılmış SQL veritabanı, bölge çapında hatalar karşısında bile yüksek kullanılabilirlik ve güçlü tutarlılık sağlayarak verileri birden fazla düğüme ve coğrafyaya çoğaltmak için Raft'ı yoğun olarak kullanır.
2. Hizmet Keşfi ve Yapılandırma Yönetimi
Raft, bir küme genelinde hizmetler ve yapılandırmalar hakkındaki kritik meta verileri depolaması ve dağıtması gereken sistemler için ideal bir temel sağlar. Bir hizmet kaydolduğunda veya yapılandırması değiştiğinde, Raft tüm düğümlerin yeni duruma sonunda anlaşmasını sağlayarak manuel müdahale olmadan dinamik güncellemeleri etkinleştirir.
3. Dağıtık İşlem Koordinatörleri
Birden fazla işlem veya hizmet arasında atomiklik gerektiren sistemler için Raft, katılımcılar arasında değişiklikleri işlemeden önce işlem günlüklerinin tutarlı bir şekilde çoğaltılmasını sağlayan dağıtık işlem koordinatörlerini destekleyebilir.
4. Diğer Sistemlerde Küme Koordinasyonu ve Lider Seçimi
Açık veritabanı veya anahtar-değer deposu kullanımının ötesinde, Raft genellikle koordinasyon görevlerini yönetmek, diğer dağıtık işlemler için lider seçmek veya daha büyük sistemlerde güvenilir bir kontrol düzlemi sağlamak için bir kitaplık veya çekirdek bileşen olarak yerleştirilir. Örneğin, birçok bulut yerel çözüm, kontrol düzlemi bileşenlerinin durumunu yönetmek için Raft kullanır.
Raft'ın Avantajları ve Dezavantajları
Raft önemli faydalar sunarken, takaslarını anlamak esastır.
Avantajları:
- Anlaşılabilirlik: Birincil tasarım hedefi, onu Paxos gibi eski mutabakat algoritmalarından daha kolay uygulamak, hata ayıklamak ve akıl yürütmek hale getirir.
- Güçlü Tutarlılık: İşlenmiş günlük girdileri için güçlü tutarlılık garantileri sunarak veri bütünlüğünü ve güvenilirliği sağlar.
-
Hata Toleransı: Azınlık düğümlerinin (
Ndüğümlü bir kümede(N-1)/2'ye kadar arıza) kullanılabilirlik veya tutarlılık kaybı olmadan arızasına tolerans gösterebilir. - Performans: Kararlı koşullarda (lider değişikliği yok), Raft yüksek verim elde edebilir çünkü lider tüm istekleri sıralı olarak işler ve paralel olarak çoğaltır, ağ bant genişliğini verimli kullanır.
- Tanımlanmış Roller: Net roller (Lider, Takipçi, Aday) ve durum geçişleri zihinsel modeli ve uygulamayı basitleştirir.
- Yapılandırma Değişiklikleri: Küme üyeliğini tutarlılığı tehlikeye atmadan güvenli bir şekilde eklemek veya kaldırmak için sağlam bir mekanizma (Ortak Mutabakat) sunar.
Dezavantajları:
- Lider Darboğazı: Tüm istemci yazma istekleri lider aracılığıyla gitmelidir. Son derece yüksek yazma verimliliği senaryolarında veya liderler istemcilerden coğrafi olarak uzak olduğunda, bu bir performans darboğazı haline gelebilir.
- Okuma Gecikmesi: Güçlü tutarlı okumalar elde etmek genellikle liderle iletişim gerektirir, potansiyel olarak gecikme ekler. Takipçilerden okumak bayat veri riski taşır.
- Çoğunluk Gereksinimi: Yeni girdileri işlemek için çoğunluk düğümünün kullanılabilirliğini gerektirir. 5 düğümlü bir kümede 2 arıza tolere edilebilir. 3 düğüm arızalanırsa, küme yazmalar için kullanılamaz hale gelir. Bu, bölgeler arasında çoğunluğu sürdürmenin zor olduğu yüksek oranda bölünmüş veya coğrafi olarak dağıtılmış ortamlarda zor olabilir.
- Ağ Hassasiyeti: Ağ gecikmesi ve bölünmelerine karşı son derece hassastır, bu da seçim sürelerini ve genel sistem verimliliğini, özellikle geniş çapta dağıtılmış dağıtımlarda etkileyebilir.
- Yapılandırma Değişikliklerinin Karmaşıklığı: Sağlam olmasına rağmen, Ortak Mutabakat mekanizması, doğru bir şekilde uygulamak ve kapsamlı bir şekilde test etmek için Raft algoritmasının en karmaşık bölümlerinden biridir.
- Tek Hata Noktası (Yazmalar İçin): Lider arızası için hata toleranslı olmasına rağmen, lider kalıcı olarak kapalıysa ve yeni bir lider seçilemiyorsa (örneğin, ağ bölünmeleri veya çok fazla arıza nedeniyle), sistem yazmalar üzerinde ilerleyemez.
Sonuç: Dayanıklı Küresel Sistemler İçin Dağıtık Mutabakatı Ustalaşmak
Raft algoritması, karmaşık sorunları basitleştirmede düşünülmüş tasarımın gücüne bir kanıttır. Anlaşılabilirliğe verdiği önem, dağıtık mutabakatı demokratikleştirdi ve daha geniş bir geliştirici ve kuruluş yelpazesinin, önceki yaklaşımların anlaşılmaz karmaşıklıklarına kapılmadan yüksek kullanılabilirlik ve hata toleranslı sistemler oluşturmasını sağladı.
Kubernetes (etcd aracılığıyla) ile konteyner kümelerini yönetmekten CockroachDB gibi küresel veritabanları için dayanıklı veri depolama sağlamaya kadar, Raft sessiz bir işçi atıdır ve dijital dünyamızın tutarlı ve işlevsel kalmasını sağlar. Raft'ı uygulamak önemsiz bir girişim değildir, ancak spesifikasyonunun netliği ve zengin ekosistemi, onu sağlam, ölçeklenebilir altyapının bir sonraki neslini oluşturmaya kararlı olanlar için ödüllendirici bir çaba haline getirir.
Geliştiriciler ve Mimarlar İçin Eyleme Geçirilebilir Öngörüler:
- Anlamaya Öncelik Verin: Bir uygulamayı denemeden önce, Raft'ın her kuralına ve durum geçişine iyice yatırım yapın. Orijinal makale ve görsel açıklamalar değerli kaynaklardır.
- Mevcut Kitaplıkları Kullanın: Çoğu uygulama için, gereksinimleriniz son derece özelse veya akademik araştırma yapmıyorsanız, baştan oluşturmak yerine iyi denenmiş mevcut Raft uygulamalarını (örneğin, etcd'den, HashiCorp'un Raft kitaplığından) kullanmayı düşünün.
- Titiz Test Pazarlık Edilemez: Hata enjeksiyonu, özellik tabanlı testler ve kapsamlı arıza senaryosu simülasyonları, herhangi bir dağıtık mutabakat sistemi için şarttır. "Çalışıyor" olduğunu, onu iyice bozmadan asla varsaymayın.
- Küresel Gecikme İçin Tasarlayın: Küresel olarak dağıtım yaparken, farklı coğrafi bölgelerdeki hem tutarlılık hem de performansı optimize etmek için çoğunluk yerleşimini, ağ topolojisini ve istemci okuma stratejilerini dikkatlice düşünün.
-
Kalıcılık ve Dayanıklılık: Temel depolama katmanınızın sağlam olduğundan emin olun ve çökme senaryolarında veri kaybını önlemek için
fsyncveya eşdeğer işlemlerin doğru kullanıldığından emin olun.
Dağıtık sistemler gelişmeye devam ettikçe, Raft tarafından somutlaştırılan ilkeler - netlik, sağlamlık ve hata toleransı - güvenilir yazılım mühendisliğinin temel taşları olmaya devam edecektir. Raft'ta ustalaşarak, dağıtık bilişimin kaçınılmaz kaosuna dayanabilecek, dayanıklı, küresel olarak ölçeklenebilir uygulamalar oluşturmak için güçlü bir araçla kendinizi donatırsınız.