Dağıtık sistemler dünyasında anlaşma (consensus) elde etmek kutsal kase gibidir. Ağ bölünmeleri, düğüm hataları ve mesaj gecikmeleri kaçınılmazken, birden fazla düğüm tek bir veri durumuna nasıl anlaşır? Cevap anlaşma algoritmalarında yatmaktadır. Sistem mimarları ve kıdemli mühendisler için bu protokolleri anlamak sadece akademik bir ilgi değil; dayanıklı, ölçeklenebilir ve hata toleranslı uygulamalar oluşturmak için hayati öneme sahiptir. Bugün, en etkili iki algoritmayı inceleyeceğiz: Paxos ve Raft.
Dağıtık Anlaşmanın Zorluğu
Belirli algoritmalara dalmadan önce, problem alanını anlamak kritik öneme sahiptir. Tek düğümlü bir sistemde veritabanına yazmak basittir. Ancak dağıtık bir kümede, CAP teoremi ödüllerıyla (trade-offs) karşı karşıyasınız. Tutarlılığı ve kullanılabilirliği korumak için, tüm kopyaların (replica) işlemlerin sırasına nasıl katılacağını garanti etmenin bir yoluna ihtiyacımız var. İşte burada anlaşma devreye girer. Amaç basittir: Bir girdi kümesi verildiğinde, hatalı olmayan tüm düğümler nihayetinde aynı çıktıya karar vermelidir.
Paxos: Teorik Temel
Leslie Lamport tarafından önerilen Paxos, dağıtık anlaşma için temel algoritmadır. Son derece karmaşık olduğu bilinir ve genellikle "kimse anlamayan algoritma" olarak tanımlanır. Karmaşıklığına rağmen, kısmi senkroni ve çökme hataları altında güçlü garantiler sağlar.
Paxos iki aşamada çalışır: Hazırlık (Prepare) aşaması ve Kabul (Accept) aşaması. Hazırlık aşamasında, bir önerici (aday lider), düğümlerden daha düşük öncelikli kimliklere sahip önerileri kabul etmemeleri için söz istenir. Kabul aşamasında, bir çoğunluk onaylarsa, önerici bir değer önerir. Bir çoğunluk kabul ederse, değer seçilmiş olur.
Güçlü olmasına rağmen, Paxos; önerici kimliklerinin ve değer seçiminin ince detaylı yönetimi nedeniyle doğru şekilde implemente edilmesi zordur. Aşağıda, temel mantığın sahte kod (pseudo-code) temsili yer almaktadır:
// Lider Seçimi Aşaması
on START_ELECTION(node_id):
ballot_id = generate_unique_ballot()
wait_for_majority(reply):
if reply.promises_to(node_id, ballot_id):
move_to_proposal_phase(ballot_id)
// Öneri Aşaması
on move_to_proposal_phase(ballot_id):
value = select_value() // Genellikle son yazılan veya yeni değer
broadcast_proposal(ballot_id, value)
wait_for_majority(acceptance):
if accepted:
leader_status = ACTIVE
persist_value(value)
Raft: İnsanlar İçin Anlaşma
Paxos'un implementasyon zorluklarını fark eden Diego Ongaro ve John Ousterhout, 2014 yılında Raft'ı tasarladı. Raft, anlaşılabilirlik için tasarlanmıştır. Anlaşmayı üç alt probleme ayırır: lider seçimi, günlük çoğaltma (log replication) ve güvenlik. Güçlü bir lider modeli tanıtarak, her düğümün gerektirdiği durum makinesini basitleştirir.
Raft'ta düğümler üç durumdan birinde bulunur: Takipçi (Follower), Aday (Candidate) veya Lider (Leader). Zaman terimlere bölünür. Bir takipçi liderin başarısız olduğunu şüphelendiğinde seçimler gerçekleşir (seçim zaman aşımı). Aday oyları ister; bir çoğunluk alırsa lider olur ve günlük girdilerini eklemeye başlar.
// Raft'ta Durum Makinesi Geçişleri
function on_message(node, msg):
if msg.type == HEARTBEAT:
update_last_seen(msg.leader_id)
reset_election_timeout()
if msg.type == REQUEST_VOTE:
if msg.term >= current_term:
current_term = msg.term
vote_for = msg.candidate_id
send(VOTE_GRANTED, msg.candidate_id)
if msg.type == APPEND_ENTRIES:
if msg.term >= current_term:
append_log(msg.entries)
send(APPEND_RESPONSE, success=true)
Raft vs. Paxos: Hangisini Ne Zaman Seçmeli?
Her iki algoritma da aynı temel sorunu çözer, ancak pratik uygulamaları farklılık gösterir. Paxos, teorik sağlamlığın ön planda olduğu ve implementasyon karmaşıklığının kütüphaneler aracılığıyla soyutlanabildiği sistemlerde (Google'ın Chubby'si veya Paxos varyantı kullanan ZooKeeper gibi) sıklıkla kullanılır. Raft ise etcd ve Consul gibi yeni sistemler için tercih edilir çünkü implementasyonu, hata ayıklaması ve genişletilmesi daha kolaydır. Açık lider modeli, günlük sıkıştırma ve üyelik değişiklikleri gibi işlemleri daha sezgisel hale getirir.
Sonuç
Anlaşma algoritmaları, modern dağıtık altyapının omurgasıdır. Bir veritabanı, mesaj kuyruğu veya yapılandırma servisi tasarlıyor olun, Paxos ve Raft arasındaki ödüllerleri (trade-offs) anlamak kritik öneme sahiptir. Raft, çoğu güncel mühendislik zorluğu için daha pragmatik bir yaklaşım sunar; güvenilirlikten ödün vermeden netlik sağlar. Bir sonraki dağıtık sisteminizi tasarlarken, unutmayın ki anlaşma sadece veri üzerinde hemfikir olmakla ilgili değildir; belirsiz bir ortamda güven inşa etmekle de ilgilidir.