# CONSENSUS ALGORITHM AND RAFT
Bu algoritmalar network üzerinden birbirine bağlı node'ların anlaşmalar yapması için yapılmıştır. Böylelike network'teki birçok node sanki bize tek bir node gibi davranır.
Diyelim ki bir servisimiz var. Bir sunucuda çalıştırdık. Ancak bu sunucu kapanırsa servisimizde kapanır. Peki ne yapmamız lazım. Bu servisimizi başka bir sunucuda daha çalıştırırsak toplamda 2 sunucuda aynı servis çalışmış olacak. Bir sunucu gider ise diğer sunucu da servisimiz çalışmaya devam edecek. Ancak burada bu iki sunucunun birbirinden haberi yok. Bu sunucuları birbirleriyle haberleştirmemiz gerekiyor. Peki ne konuşacaklar. Aralarında anlaşmaları gerekiyor. Bazı soruları var.
1-) Bir sunucu der ki bana istek geldiğinde bu isteği yerine getirecek kaynaklara erişmem lazım, sende aynı kaynaklara erişmek istersen ne olacak?
2-) Bize gelen istekleri nasıl birbirimize paslayacağız?
3-) Birimize birşey olduğunda diğerimiz nasıl anlayacak?
4-) Anlaşmayı terk eden taraf tekrar anlaşmak isterse ne yapmalıyız.
5-) Ortak kullandığımız verileri nasıl eşit tutmalıyız?
Yukarıdaki gibi birçok soru sorulacaktır
Diyelim ki client sunuculardan birine erişti ve birşey okumak/yazmak istedi. Bu client komutu öncelikle tüm sunuculara yazılırsa (replicated log) şunu kontrol edebiliriz. Replicated log yazıldımı herkese. Diyelim ki evet yazıldı ise her sunucu kendi bu komutu çalıştırdı diyelim. En son isteği alan sunucu çalıştırdığı komutun sonucunu client'a gönderdi.
## RAFT
RAFT için 3 temel konu vardır.
1. Leader election
* Select one server to act as leader
* Detect crashes, choose new leader
Her node için 3 role vardır. Bunlar Leader,Candidate,Followers'dır. İlk başta leader olmadığından herkes candidate'dir.
Term: Election sayısı
Election Timeout(150ms-300ms): Bu süre içinde leader'den haber almayan follower kendini candidate yapar ve election başlatır.
İki tane RPC aksiyonu yapılır. Bir tanesi Request Vote diğeri AppendEntries.
AppendEntries: Son gelen komutu ve heartbeat'i içerir.
RequestVote: Adı üzerinde oy isteğidir.
Candidate önce kendine oy verir:) Sonra diğerlerinden oy ister. Diğerleri hangi seçim diye Term'e bakar, Örneğin seçim 1. Sonrada Election Timeout'larını sıfırlarlar. Oylarını vererek seçimi tamamlarlar. Burada ilgili seçim için (Örneğin 1.seçim) oy verirken oy isteğini ilk kimden aldılarsa ona oylarını verirler. Leader daha sonra AppendEntries mesajları ile liderliğini korur. Heartbeat'i zamanında alamayan node tekrar seçim başlatır. Seçim numarası kontrol edilir. Leader seçimi için herkes random bir süre içerisinde geri sayım yapar. Geri sayım süresince ençok oy alan ben leader'im diye anons eder. Leader olmayanlara followers diyoruz. Followers'lar leader'ın isteği dışında birşey yapmazlar.
2. Log replication (normal operation)
* Leader accepts commands from clients, appends to its log
* Leader replicates its log to other servers (overwrites inconsistencies)
server'a bir mesaj/request geldiğinde leader olarak seçilen server bu request'i karşılar, replication log unu oluşturur ve bu log'un diğer server'larda da oluşturulmasını sağlar. Diğer server'lardan request'in replica log'unun oluştugu bilgisini alır. Sonra leader işlemi gerçekleştirir.
Leader log'u herzaman doğru kabul edilir.
3. Safety
* Keep logs consistent
* Only servers with up-to-date logs can become leader
*
## Split Brain
Dağıtık Sistemlerde ortaya çıkan bir durumdur. Örneğin 3 tane node dan oluşan bir clusteriniz var. Bunlardan biri leader seçildi ve diğerleri followers oldu. Aniden bir nodun diğerleri ile bağlantısi kesildi. Diğerleri ile bağlantısı kesildiği için kendini leader yapti. Bu durumda ortamda iki lider olacaktır. Veri işleme isteği bu noda gelirse veriyi isleyecek ama replica edemeyecektir.
## Split Vote
Split Vote oyların eşit çıkması durumudur. Lider seçimi için random bir süre başlatılır. Random süresi ilk biten aday kendine oy verdikten sonra diğerlerinden oy ister. En fazla oyu aldıktan sonra lider seçilir.
## QUORUM
RAFT içindeki quorum algoritması ile oyların ne kadarını en az almak gerektiği belirtilebilir. Etcd cluster'i RAFT kullanır. Örneğin 3 node bir etcd clusterinda quorum(N/2+1) 2 dir. Yani bir node en az bir diğer ile çalışmalıdır. Eğer bu mümkün degilse servis dışı olur. Başka bir değişle oyların 3'de 2'sini alması gerekir. Böylelikle bir node herhangi bir sebeple(networksel sorun gibi) tek başına leader olamaz ve servis veremez.