ETCD ile Dağıtılmış Sistemlerde Güvenilir Lider Seçimi: Uygulamalarınızı Yönetmek İçin Etkili Bir Yaklaşım

Dilara SEREN
Turk Telekom Bulut Teknolojileri
9 min readMay 23, 2023

Günümüzün hızla büyüyen ve karmaşıklaşan teknoloji ekosistemlerinde, dağıtılmış sistemlerin etkin bir şekilde yönetilebilmesi ve düzgün çalışabilmesi büyük önem taşımaktadır. Bu tür sistemlerde, birden fazla node’ın varlığı, lider seçimi gibi kritik bir sürecin başarılı bir şekilde yönetilmesini gerektirmektedir.

İşte bu noktada, ETCD adını verdiğimiz açık kaynaklı bir dağıtık (distributed key-value store) sisteminden yararlanmak oldukça faydalı olacaktır. ETCD, güvenilir lider seçimi için etkili bir araç sunmaktadır. Bu makalede, ETCD’nin ne olduğunu, nasıl kurulacağını ve uygulamalarda lider seçimi için nasıl kullanılabileceğini detaylı bir şekilde ele alacağız.

Peki ETCD nedir ?

“Etcd” adı, Linux dizin yapısındaki bir adlandırma kuralından gelir: UNIX’te, tek bir sistem için tüm sistem yapılandırma dosyaları “/etc” adlı bir klasörde bulunur. “d”, “dağıtılmış” anlamına gelir.

etcd, dağıtılmış bir anahtar-değer depolama sistemi ve güçlü bir tutarlılık garantisi sağlayan bir dağıtılmış sistemdir. İkili verileri depolamak için kullanılır ve çoğunlukla Kubernetes gibi büyük ölçekli sistemlerde kullanılır.

etcd, basit bir API üzerinden etkileşim sağlayarak, istemcilerin yapılandırma verilerini, koordinasyon bilgilerini ve diğer küresel durum bilgilerini güvenli bir şekilde depolamasına olanak tanır.

etcd, bir “anahtar” ve buna karşılık gelen bir “değer” çifti olarak düşünülebilen bir veri modeline sahiptir. Anahtar-değer çiftleri hiyerarşik bir şekilde organize edilebilir ve istemciler, anahtarlar üzerinde okuma, yazma ve silme işlemleri gerçekleştirebilir. Bu, etcd’yi yapılandırma dosyaları, hizmet keşfi verileri, kilitleme bilgileri ve diğer ortak durum bilgileri gibi verileri depolamak için ideal kılar.

Neden ETCD tercih etmeliyiz ?

Dağıtılmış bir iş yükünü çalışır durumda tutan veri omurgası olarak hizmet etmek hiç de kolay bir iş değil. Ancak etcd, aşağıdaki nitelikler için sıfırdan tasarlanmış görev için oluşturulmuştur:

  • Tamamen çoğaltılmış: Bir etcd kümesindeki her node’un tam veri deposuna erişimi vardır.
  • Yüksek oranda kullanılabilir: etcd, tek bir arıza noktasına sahip olmayacak şekilde tasarlanmıştır ve donanım arızalarını ve ağ bölümlerini incelikle tolere eder.
  • Güvenilir şekilde tutarlı: “Okunan” her veri, tüm kümelerde en son “yazma” verilerini döndürür.
  • Hızlı: etcd, saniyede 10.000 yazma ile kıyaslanmıştır.
  • Güvenli: etcd, otomatik Aktarım Katmanı Güvenliğini (TLS) ve isteğe bağlı güvenli yuva katmanı (SSL) istemci sertifikası kimlik doğrulamasını destekler. etcd hayati ve oldukça hassas yapılandırma verilerini depoladığından, yöneticiler dağıtım içinde rol tabanlı erişim denetimleri uygulamalı ve etcd ile etkileşimde bulunan ekip üyelerinin işlerini gerçekleştirmek için gereken en az ayrıcalıklı erişim düzeyiyle sınırlandırılmasını sağlamalıdır.
  • Basit: Basit web uygulamalarından Kubernetes gibi oldukça karmaşık konteyner düzenleme motorlarına kadar herhangi bir uygulama, standart HTTP/JSON araçlarını kullanarak etcd’ye veri okuyabilir veya yazabilir.

Etcd’nin performansı büyük ölçüde depolama disk hızına bağlı olduğundan, etcd ortamlarında SSD’lerin kullanılması şiddetle tavsiye edilir.

ETCD Kullanım Senaryoları

1. Dağıtık Koordinasyon: ETCD, birden çok sunucunun birbiriyle iletişim kurması ve koordineli bir şekilde çalışması gereken sistemlerde kullanılabilir. Örneğin, bir bulut platformu düşünelim. ETCD, sunucuların kaynakları, durumları ve yapılandırmaları gibi bilgileri depolayarak sunucular arasındaki koordinasyonu sağlayabilir.

2. Servis Keşfi ve Konfigürasyon: Mikro servis mimarilerinde, servislerin birbirlerini bulması ve yapılandırma bilgilerini paylaşması önemlidir. ETCD, servislerin IP adresleri, port numaraları, yapılandırma anahtarları gibi bilgileri depolayarak servis keşfi ve yapılandırmasını kolaylaştırır. Bu sayede, bir servis hızlıca diğer servisleri bulabilir ve gerektiğinde yapılandırma bilgilerini güncelleyebilir.

3. Dağıtık Kilit Yönetimi: ETCD, dağıtık sistemlerde kilit yönetimi için kullanılabilir. Örneğin, birden çok sunucunun aynı anda bir kaynağa erişmesini önlemek için kilitler kullanılır. ETCD, kilitlerin güvenli bir şekilde tutulmasını sağlayarak sunucular arasında senkronizasyonu ve kilit yönetimini kolaylaştırır.

4. Yüksek Kullanılabilirlik: ETCD, yüksek kullanılabilirlik gerektiren sistemlerde kullanılabilir. ETCD, birden çok node üzerinde çalışabilir ve verileri bu node’lar arasında replike edebilir. Bu sayede, bir node’un başarısız olması durumunda diğer node’lar devam eder ve verilere hala erişilebilir.

ETCD’yi daha yakından incelemek için şimdi kurulum zamanı..

bulutbilisimciler.com : etcd kurulumu

Şimdi sizlerle etcd kurulumunu gerçekleştireceğiz. Adım adım ilerleyerek bulutbilisimciler.com üzerinde key-value (anahtar-değer) depolama yazılımını kuracak ve nedir,nasıl kullanılır ve diğer özelliklerini birlikte inceleyeceğiz.

https://bulutbilisimciler.com/

Adım 1: Hazırlık

İlk yapmamız gereken bulutbilisimciler.com üzerinde, kurslar bölümünden bir Linux kursu açıp, bir linux sunucu ayağa kaldırmak.

Linux sunucusu çalıştı.

Sonrasında paket yöneticimizi güncel tutmak, yeni güncellemeleri yükleyebilmek ve vim editörü kullanmak için:

apk get update
apk install vim

Adım 2: ETCD indirilmesi

Terminalde /home dizinine gelerek etcd’nin resmi GitHub deposundan en son sürümünü indirmeniz gerekmektedir. Aşağıdaki komutu kullanarak indirme işlemini gerçekleştirebilirsiniz:

wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz

Bu komut, etcd’nin Linux AMD64 için en son sürümünü indirecektir. İşletim sisteminiz veya mimariniz farklı ise, indirmek istediğiniz sürümü belirtmelisiniz.

Adım 3: etcd Dosyalarını Çıkartma

İndirilen sıkıştırılmış arşivi çıkartmanız gerekmektedir. Aşağıdaki komutu kullanarak bu işlemi gerçekleştirebilirsiniz:

tar -xzvf etcd-v3.5.0-linux-amd64.tar.gz

Adım 4: etcd Yürütülebilir Dosyalarının Hedef Dizine Taşınması

Çıkartılan arşiv, etcd’yi çalıştırmak için gereken yürütülebilir dosyaları içerir. Bu dosyaları hedef dizine taşımalısınız. Örneğin, /usr/local/bin dizinine taşımak isterseniz aşağıdaki komutu kullanabilirsiniz:

sudo mv etcd-v3.5.0-linux-amd64/etcd* /usr/local/bin

Bu komut, etcd ve etcdctl gibi yürütülebilir dosyaları /usr/local/bin dizinine taşıyacaktır. Dizine taşıdıktan sonra /usr/local/bin dosyasına geçiş yapabilirsiniz.

cd /usr/local/bin

Aşağıdaki komutlarla da etcd ve etcdctl versiyonlarını kontrol edebilirsiniz.

etcd --version
etcdctl version
versiyon kontrolu

etcdctl: etcd için bir komut satırı istemcisidir.

Adım 5: etcd Sunucusunun Yapılandırılması

etcd sunucusunu çalıştırmadan önce yapılandırmanız gerekmektedir. Yapılandırma dosyası, etcd’nin dinlemesi gereken IP adresi, port numarası, veri dizini ve diğer özellikler gibi bilgileri içerir. Bir metin düzenleyici kullanarak bir yapılandırma dosyası oluşturun. Örneğin, etcd.conf adında bir dosya oluşturabilirsiniz.

touch etcd.conf

etcd.conf dosyasını vim editoru ile açarak içini dolduralım.

Bu yapılandırma, etcd’nin localhost üzerinde 2379 portundan istemcilere hizmet verdiğini ve 2380 portundan diğer etcd node’ları ile iletişim kurduğunu belirtmektedir. Ayrıca, verilerin /var/lib/etcd dizininde saklanacağı belirtilmektedir.

Adım 6: etcd Sunucusunun Başlatılması

Yukarıdaki adımları tamamladıktan sonra etcd sunucusunun başlatılmak için aşağıdaki komutu kullanabilirsiniz.

etcd&

Yukarıdaki komut ile etcd sunucusunu başlattıktan sonra aşağıdaki çıktıları elde edebilirsiniz.

Adım 7: etcd İstemcisini Kullanma

etcd’yi kullanmak için etcd istemcisini (etcdctl) kullanabilirsiniz. Öncelikle, etcd sunucusunun çalıştığından emin olun ve ardından etcd istemcisini kullanarak anahtar-değer çiftleriyle etkileşim sağlayabilirsiniz.

Adım 7.1: Anahtar Oluşturma

 etcdctl put key1 value1

Bu, key1 olarak anahtar ve value1 olarak değer ile yeni bir anahtar çifti oluşturacaktır.

etcdctl put key2 value2

Bu, key2 olarak anahtar ve value2 olarak değer ile yeni bir anahtar çifti oluşturacaktır.

etcdctl put color blue

Bu, anahtarın rengi ve değerinin mavi olduğu başka bir anahtar çifti oluşturacaktır.

Adım 7.2: Anahtar Alma

etcdctl get key1
etcdctl get key2
etcdctl get color

Bu, key1,key2,color anahtarının anahtar-değer çiftini verecektir.

Yukarıda da görüldüğü gibi anahtar değer çiftini görüntülemiş olduk.

Adım 7.3: Anahtar Silme

etcdctl del color

Yukarıdaki komut ile oluşturulmuş olan anahtar-değer çiftini silebilirsiniz.

Adım 7.4: Ek olarak bakılabilecek komutlar

etcdctl get key1 --hex

Bu, anahtar/değer çiftini onaltılık biçimde döndürür.

etcdctl get key1 --print-value-only

Bu sadece key1'in değerini yazdıracaktır.

etcdctl get --prefix key

Bu, key1-value1 ve key2-value2 anahtar-değer çifti gibi değerleriyle birlikte anahtar olarak ön ekleri olan tüm anahtarları döndürür.

etcdctl lease grant <süre>

etcd’de bir kira (lease) oluşturmak için kullanılan bir komuttur. lease grant komutu, belirtilen süre (sn) boyunca geçerli olan bir kira oluşturur.

<süre>: Oluşturulacak kiranın süresini belirtir. Bu süre, saniye cinsinden ifade edilir.

8.Adım: Etcd Sunucusunu Durdurma

Etcd sunucusunu aşağıdaki komut sayesinde durdurabilirsiniz.

pkill etcd

ETCD nasıl Leader Election için kullanılır ?

etcd, RAFT Consensus algoritması kullanarak dağıtılmış sistemlerde lider seçimi için sıklıkla kullanılan bir veritabanıdır. Lider seçimi, birden fazla node’un arasında birincil liderin belirlenmesi sürecidir.

Peki nedir bu RAFT Consensus Algoritması ?

RAFT, güçlü bir konsensüs algoritmasıdır ve dağıtılmış sistemlerde tutarlılığı sağlamak için kullanılır. RAFT, lider seçimi, log replikasyonu ve güvenli bir konsensüs oluşturma süreci sağlar.

RAFT, bir dağıtılmış sistemdeki node’lar arasında lideri seçmek için lider seçimi adımını kullanır. Bu adımda, node’lar arasında bir liderin belirlenmesi, liderin kaybı durumunda yeni bir liderin seçilmesi gibi durumlar ele alınır.

Log replikasyonu, sistemin tutarlı bir günlüğe sahip olmasını sağlamak için kullanılır. Her node, günlük girişlerini diğer node’lara replike eder ve bu şekilde tutarlı bir günlük sırası korunur.

Bu şekilde, dağıtılmış sistemlerin oluşturulması ve yönetimi daha kolay hale gelir. RAFT, ölçeklenebilirlik, tutarlılık ve güvenilirlik gibi kritik özellikleri sağlayarak çeşitli uygulamalarda kullanılabilmektedir.

Şimdi ETCD nasıl Leader Election için kullanılır bunu inceleyelim..

etcd kümesi, bir lider seçer ve diğer node’larla iletişim kurarak konsensüs sağlar. Bu lider, etcd kümesindeki diğer node’lara komutları ileterek günlüklerin tutarlı bir şekilde replike edilmesini sağlar.

RAFT algoritması etcd tarafından sağlanan konsensüsü yönetir ve aşağıdaki adımları içerir:

  1. Küme Oluşturma: etcd kümesi, birkaç node’dan oluşur. Bu node’lar, etcd sunucusunu çalıştıran fiziksel veya sanal makinelerde barındırılabilir. Bir küme oluşturulduğunda, node’lar birbirleriyle iletişim kurabilecekleri bir ağ üzerinde konumlandırılır.
  2. Lider Seçimi: İlk başta, tüm node’lar takipçi rolünü alır. Bu durumda, bir lider seçilmemiştir. RAFT algoritması, node’lar arasında lider seçimini gerçekleştirir. Lider seçimi, node’ların birbirleriyle etkileşimleriyle belirlenir ve çoğunluğun onayını gerektirir.
  3. Log Replikasyonu: Lider seçildikten sonra, lider diğer node’lara komutları iletmek ve günlük girişlerini replike etmekle sorumludur. Lider, komutları günlüğe kaydeder ve günlük girişlerini takipçi node’lara replike eder. Bu, tutarlı bir günlük sırasının korunmasını sağlar.
  4. Konsensüs Oluşturma: etcd, günlük replikasyonu ve lider seçimi ile tutarlı bir konsensüs oluşturur. Lider, komutları alır, günlüğe kaydeder ve takipçi node’lara replike eder. Diğer node’lar, liderin komutlarından emin olmak için onaylama işlemini gerçekleştirir. Çoğunluk sağlandığında, konsensüs sağlanır ve komutlar uygulanır.
  5. Durum Güncellemesi: etcd kümesindeki durum sürekli olarak güncellenir. Yeni node’ların katılması, liderin kaybı durumunda yeni lider seçimi, node arızaları veya ağ gecikmeleri gibi durumlar yönetilir. RAFT algoritması, etcd’nin dağıtılmış sistemdeki güvenilirlik ve dayanıklılığı sağlamak için bu durumları ele alır.

etcd, bu RAFT algoritmasını kullanarak dağıtılmış bir konsensüs hizmeti sağlar. etcd kümesindeki her node, belirli bir RAFT rolünü (lider, takipçi veya aday) alır ve liderin kaybı durumunda yeni bir lider seçmek için aday olabilir.

etcd, dağıtılmış sistemlerde güvenilir bir konsensüs ve veri tutarlılığı sağlamak için RAFT algoritmasını etkin bir şekilde kullanır. Bu sayede etcd, yüksek kullanılabilirlik, dayanıklılık ve güvenlik gibi kritik özelliklere sahip dağıtılmış uygulamaların geliştirilmesini destekler.

etcd, RAFT algoritması sayesinde tutarlılık, güvenilirlik ve yüksek kullanılabilirlik gibi önemli özellikleri sunar.

Örnek kod üzerinden de leader election kullanımını inceleyelim..

Yukarıdaki kodları adım adım inceleyelim.

  1. etcd kütüphanesini içe aktarın: İlk adımda etcd kütüphanesini projenize dahil ediyoruz. Bu kütüphane, etcd sunucusu ile iletişim kurmamıza yardımcı olacak fonksiyonları sağlar.
  2. leader_election() fonksiyonunu tanımlayın: leader_election() fonksiyonu, lider seçimi sürecini yürütecek olan ana işlevi içerir.
  3. etcd istemci nesnesini oluşturun: etcd.Client() ile etcd sunucusuna bağlantı kurmak için bir istemci nesnesi oluşturulur. host parametresi, etcd sunucusunun adresini belirtirken, port parametresi etcd sunucusunun bağlantı noktasını belirtir. Burada örnek olarak localhost ve 2379 değerleri kullanılmıştır.
  4. Lider seçimi için kullanılacak anahtarın tanımlanması: election_key değişkeni, lider seçimi için kullanılacak etcd anahtarını temsil eder. Burada örnek olarak "/leader-election/" olarak tanımlanmıştır.
  5. Sonsuz döngü başlatılır: while True döngüsü, lider seçimi sürecini sürekli olarak tekrarlamak için kullanılır.
  6. Liderlik adaylığı için anahtar oluşturma: client.write() kullanarak liderlik adaylığı için anahtar oluşturulur. prevExist=False olarak belirttiğimiz için anahtarın zaten var olmadığından emin oluruz.
  7. Lider seçimini beklemek için anahtarın durumunu kontrol etme: while True döngüsü içinde client.read() kullanarak liderlik anahtarının durumunu kontrol ederiz. Eğer anahtarın değeri "leader" ise bu node’ın lider olduğunu belirtir ve liderlik görevlerini gerçekleştiririz.
  8. Liderlik için rekabet eden diğer node’ları takip etme: Lider değilsek, client.watch() ile liderlik anahtarını takip ederiz. Anahtarın durumunu izleyerek liderlik değişikliklerini algılar ve liderlik adaylığına devam ederiz.
  9. Liderlik anahtarının sona erdiği durumu kontrol etme: response.action değeri "expire" ise liderlik anahtarının sona erdiği anlamına gelir. Bu durumda lider seçimi yapmaya devam etmek yerine döngüyü kırarak baştan başlarız.
  10. Hataları yönetme: etcd.EtcdAlreadyExist hatası, başka bir node’un liderlik adayı olduğunda ortaya çıkar. Bu durumda liderlik adayı olmaya devam etmek için hatayı görmezden geliriz. etcd.EtcdKeyNotFound hatası, liderlik anahtarının oluşturulmadığı durumda ortaya çıkar. Bu durumda lider seçimi yapmaya devam etmek için hatayı görmezden geliriz.
  11. Ana fonksiyonu çağırma: if __name__ == "__main__" bloğunda leader_election() fonksiyonunu çağırarak lider seçimi sürecini başlatırız.

--

--