ZooKeeper, dağıtık uygulamalar geliştirilmesine izin veren, dağıtık bir koordinasyon servisi olarak tanımlanabilir [1, 2]. İlk olarak Yahoo’da şirket uygulamalarının, konfigürasyon bilgilerine hataya dayanıklı ve kolay bir şekilde ulaşabilmesini sağlamak için geliştirilmeye başlanmıştır [3]. Önceden Hadoop içerisinde bir alt proje olan ZooKeeper, zamanla üst seviye bir Apache projesi haline gelmiştir. ZooKeeper’a dağıtık sunucu kümeleri üzerindeki işleri koordine etmeye yardımcı olacak çeşitli özellikler eklenmiştir. ZooKeeper, kullanıcılarına yüksek erişilebilirlik ve yüksek performans özellikleri sağlar. Aynı zamanda, geliştiricilere açık kaynak gerçekleştirimler içeren bir kütüphane sunar.

ZooKeeper özelliklerini öğrenmek ve denemek için öncelikle tek bir makine üzerinde kurulabilir. Kurulum, Java 6 veya üzeri bir Java versiyonu gerektirir. Kurulum için öncelikle, ZooKeeper’ın kararlı bir sürümü ilgili internet sitesinden indirilir (http://zookeeper.apache.org/releases.html) ve içeriği çıkartılır. Ardından, ZooKeeper kurulum dizininde (ZOOKEEPER_INSTALL) yer alan bin dizini komut satırı yoluna eklenebilir.

$ tar xzf zookeeper-x.y.z.tar.gz
$ export ZOOKEEPER_INSTALL=/abc/xyz/zookeeper-x.y.z
$ export PATH=$PATH:$ZOOKEEPER_INSTALL/bin

ZooKeeper hizmeti başlatılmadan önce konfigürasyon dosyasının hazırlanması gerekir. Bu amaçla, conf dizininde zoo.cfg isimli bir dosya oluşturulur. Aynı dizinde tanımlı olan zoo_sample.cfg dosyasından örnek olarak faydalanılabilir. ZooKeeper’ın tek sunucu üzerinde çalıştırılabilmesi için en az üç parametre tanımlanmalıdır:

  • tickTime: ZooKeeper’daki temel zaman birimidir. Milisaniye cinsinden tanımlanır.
  • dataDir: ZooKeeper’ın verileri sakladığı dizindir.
  • clientPort: ZooKeeper’ın istemci bağlantılarını dinlediği bağlantı noktasıdır.

Örnek olarak şu konfigürasyon verilebilir:

tickTime=2000
dataDir=/users/xyz/zookeeper
clientPort=2181

Bunun ardından, yerel ZooKeeper sunucusu şu komutla başlatılır:

$ zkServer.sh start

ZooKeeper’ın çalışıp çalışmadığının kontrol edilmesi için ruok (“Are you OK?”, “İyi misin?”) komutu nc (veya telnet) ile gönderilebilir. Buna karşılık olarak imok (“I’m OK.”, “İyiyim.”) yanıtının gelmesi beklenir. Tablo 1’de, ruok komutunun yanı sıra, ZooKeeper ile haberleşmede kullanılabilecek diğer komutlar listelenmiştir.

$ echo ruok | nc localhost 2181

imok

Tablo 1. ZooKeeper ile haberleşmede kullanılabilecek komutlar

Komut
Açıklama
conf Konfigürasyonla ilgili detayları yazdırır.
cons Bu sunucuya bağlı tüm istemcilerin bağlantı / oturum detaylarını listeler.
crst Tüm bağlantılar için bağlantı / oturum istatistiklerinin sıfırlanmasını sağlar.
dump Oturum ve geçici düğümleri listeler. Bu komut, sadece ZooKeeper protokolüne göre belirlenmiş “lider” sunucu üzerinde çalışır.
envi Sunucu çevresi ile ilgili detayları yazdırır.
ruok Sunucunun hatasız bir şekilde çalışıp çalışmadığını test eder.
srst Sunucu istatistiklerinin sıfırlanmasını sağlar.
srvr Sunucu hakkında detaylı bilgi verir.
stat Sunucu ve sunucuya bağlı istemciler hakkında kısa bilgiler verir.
wchs Sunucudaki izleme özellikleri hakkında kısa bilgi verir.
wchc Sunucudaki izleme özellikleri hakkında oturum bazında detaylı bilgi verir.
wchp Sunucudaki izleme özellikleri hakkında yol bazında detaylı bilgi verir.
mntr Kümenin sağlığını sorgulamak için kullanılabilecek değişkenleri listeler.

ZooKeeper’ın çalışma mantığı, znode olarak adlandırılan düğüm kavramına dayanır. ZooKeeper, işlevini gerçekleştirmek için gerekli bilgileri znode düğümleri vasıtası ile tutar. ZooKeeper ile hiyerarşik ve yüksek erişilebilirliğe (high availability) sahip bir dosya sistemi sağlanabilir (Şekil 1). Bir znode düğümü, veri tutmak için (bir dosya gibi) veya başka znode düğümlerini tutmak için (dizin gibi) kullanılabilir. Örneğin Şekil 1’de, arama znode düğümünün altında, indeks1, yedek1, indeks2 veyedek2 znode düğümleri yer almaktadır. Bir znode düğümü, geçici (ephemeral) veya kalıcı (persistent) tipte tanımlanabilir. Geçici znode düğümü, kendisini oluşturan istemcinin bağlantısı kesildiğinde ZooKeeper hizmeti tarafından silinir. Kalıcı znode düğümü, istemcinin bağlantısı kesildiğinde silinmez.

Zookeeper Nedir
Şekil 1. Örnek znode hiyerarşisi

ZooKeeper ile geliştirilebilecek örnek bir uygulama, grup üyeliği gerçekleştirimidir [2]. Burada amaç, istemcilere belli bir hizmet (örneğin arama hizmeti) sağlayan sunucuların listesinin, ZooKeeper ile tutulmasıdır. Böylece istemciler, ilgili hizmeti sağlayan ve çalışır durumdaki sunucuları ZooKeeper vasıtasıyla öğrenebilecek ve hizmeti alabileceklerdir. Bu ise, ilgili hizmeti sağlayan sunucuların “hizmet sağlayıcılar” grubuna üyeliği şeklinde gerçekleştirilir. Üretim ortamında, böyle bir hizmet sağlayıcılar listesinin tek bir sunucuda tutulması hataya dayanıklı değildir, çünkü listenin tutulduğu sunucuda yaşanacak bir aksama, tüm sistemin çalışmaz hale gelmesi anlamına gelecektir. Ele alınması gereken bir diğer konu da, devre dışı kalan hizmet sağlayıcı makinelerin grup üyeliği listesinden çıkarılmasıdır.

Bahsedilen grup üyeliği örneğinin gerçekleştiriminde, bir üst (parent) znode düğümü ile grubun ismi, alt znode düğümleri ile de grup üyeleri, yani sunucular tutulur. Şekil 1’deki örnekte, arama hizmeti veren sunuculara (indeks1, yedek1, indeks2,yedek2) karşılık gelen znode düğümleri, “arama” isimli znode altında yer almaktadır. Alt düğümlerde, ilgili sunucuların IP adresleri gibi ek bilgiler de tutulabilir.

Grup üyeliği örneği, ZooKeeper’ın sağladığı uygulama programlama arayüzü ile gerçekleştirilebilir. ZooKeeper istemci kütüphaneleri, Java ve C programlama dilleri için mevcuttur. Grup üyeliği gerçekleştiriminde, grup (örneğin arama hizmeti veren sunucular grubu), bir znode olarak tanımlanır. Grubun her bir üyesi yani her bir sunucu (indeks1yedek1indeks2yedek2), grup znode düğümü altında geçici bir znode düğümü oluşturarak gruba katılır. Znode düğümlerinden birinde bir aksama gerçekleşirse (örneğin arama hizmeti veren sunuculardan biri çalışmaz hale geldiğinde), ZooKeeper bunu farkettiği anda, ilgili znode, hiyerarşiden otomatik olarak silinir.

ZooKeeper ile birlikte zkCli.sh isimli bir komut satırı aracı gelir. Bu araç, parametre verilmeden çalıştırıldığında, kullanım şekilleri listelenir. Aşağıdaki örnekteki gibi “ls” parametresi ile çalıştırıldığında ise verilen bir düğüm (örneğin “/arama”) altındaki düğümler listelenir:

$ zkCli.sh localhost ls /arama

Znode düğümlerine, Unix işletim sistemindeki dosya yollarına benzer şekilde “/” karakteri ile ayrılmış bir karakter dizisi ile erişilir; örneğin /arama/indeks1 gibi. Bir znode düğümünde tutulabilecek veri miktarı sınırlıdır; varsayılan olarak en fazla 1 MB büyüklüğünde veri tutulabilir. Ayrıca, bir znode düğümünde erişim denetim listesi (access control list, ACL) bilgisi tutulabilir. Bu sayede, düğüm üzerinde oluşturma, okuma, yazma gibi belli işlemleri kimin yapabileceği ile ilgili yetkilendirmeler tanımlanabilir.

ZooKeeper ile gerçekleştirilebilecek temel işlemler arasında, düğüm oluşturma (create), düğüm silme (delete), bir düğümün mevcut olup olmadığını tespit etme (exists), ACL bilgisi alma ya da değiştirme (getACL, setACL), alt düğüm listesinin alınması (getChildren), verilerin alınması ya da değiştirilmesi (getData, setData) sayılabilir.

Bir znode düğümüne izleme (watch) özelliği eklenerek, düğümde belli tipte bir değişiklik olduğunda istemcilerin haberdar edilmesi sağlanabilir. Örneğin, bir düğüm üzerinde exists yani bir düğümün mevcut olup olmadığını tespit etme işlemi, izleme özelliği eklenerek çalıştırılırsa, eğer düğüm o an mevcut değilse, daha sonra oluşturulduğunda, istemci bu durumdan haberdar edilir.

Örnek kurulum, ZooKeeper’ın tek bir sunucuda çalıştırılmasını içerse de, üretim ortamında birden fazla ZooKeeper sunucusundan oluşan bir küme (ensemble) kullanılmalıdır. ZooKeeper kümesinde yüksek erişilebilirlik, Zab adı verilen bir protokol ile sağlanır. Bu protokolde, bir lider sunucu (leader) seçilir ve geriye kalan sunucular onu takip eder (follower). Protokol, “çoğunluk” prensibine dayalıdır. Örneğin 5 sunucudan oluşan bir kümede iki sunucuda aksaklık oluşsa da, geriye kalan üç sunucu ile çoğunluk sağlandığı için ZooKeeper hizmeti çalışmaya devam eder. ZooKeeper kümeleri, genelde tek sayıda makineden oluşur.

ZooKeeper sunucuları, makine ve ağdaki hataların etkisini en aza indirmek için farklı raf (rack), güç kaynağı ve ağ anahtarlarına (switch) dağıtılmalıdır. Ayrıca, ZooKeeper’ın, performans açısından, sadece ZooKeeper için ayrılmış makinelerde çalıştırılması önerilir. ZooKeeper’ın dağıtık kurulumunda kümedeki her bir sunucuya, 1 ile 255 arasında bir kimlik numarası verilir. Bu bilgi, sunucuda dataDir parametresi ile belirtilen dizindeki myid isimli dosyada tutulur. ZooKeeper konfigürasyon dosyası, her bir ZooKeeper sunucusu için şu formatta bir satır içerir:

server.n=makine_adı:bağlantı_noktası_1:bağlantı_noktası_2

Her bir sunucu için ZooKeeper protokolü tarafından kullanılmak üzere iki farklı bağlantı noktası tanımlanır. Bağlantı noktalarından ilki, ZooKeeper makinelerinin lider sunucu ile bağlantı kurabilmesi için, ikincisi ise lider sunucu seçiminde kullanılır. ZooKeeper’ın üç sunucu ile dağıtık modda kurulumu için aşağıdaki örnektekine benzer bir konfigürasyon dosyası kullanılabilir:

tickTime=2000
dataDir=/disk1/zookeeper
dataLogDir=/disk2/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

Dağıtık modda, ZooKeeper protokolünde kullanılacak zaman miktarlarıyla ilgili initLimit ve syncLimit parametrelerinin tanımlanması zorunludur. initLimit, ZooKeeper sunucularının lider sunucuya bağlanmaları için izin verilen en fazla süreye karşılık gelir. syncLimit ise, bir ZooKeeper sunucusunun lider sunucudan ne kadar eski bilgiye sahip olabileceğini sınırlayan süredir. Bu parametreler, tickTime parametresi cinsinden tanımlanır. Bir ZooKeeper istemcisi, kümedeki sunucuların listesiyle konfigüre edilir. Konfigürasyon parametreleriyle ilgili daha detaylı bilgi için, ZooKeeper yönetici rehberine (ZooKeeper Administrator’s Guide) başvurulabilir [4].

ZooKeeper ile geliştirilebilecek diğer bazı uygulamalar arasında, bir sunucu kümesi için konfigürasyon bilgilerinin paylaşılmasını sağlayan bir konfigürasyon hizmeti ile bir işlem kümesi için dağıtık bir kilit (lock) hizmeti sayılabilir. ZooKeeper pek çok uygulama tarafından kullanılmaktadır. Bunlardan en bilinenlerinden iki tanesi, Solr arama altyapısı ile HBase NoSQL veritabanıdır. Örneğin Solr, ZooKeeper servisini, Solr konfigürasyon bilgilerini tutmak için kullanır. Dağıtık bir ZooKeeper kurulumunun sağladığı temel avantaj, bu bilgilerin yüksek erişilebilirlikle tutulması ve istemcilere yüksek performanslı olarak sunulmasıdır.

Kaynaklar

[1] Apache ZooKeeper Wiki, https://cwiki.apache.org/confluence/display/ZOOKEEPER/Index
[2] Hadoop - The Definitive Guide
[3] Big Data Glossary
[4] ZooKeeper Administrator's Guide, http://zookeeper.apache.org/doc/current/zookeeperAdmin.html
PAYLAŞ

YORUM YOK