JavaRush /Java Blogu /Random-AZ /Zookeper və ya bir zookeper üçün həyat necədir
Viacheslav
Səviyyə

Zookeper və ya bir zookeper üçün həyat necədir

Qrupda dərc edilmişdir
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 1

Giriş

Java proqramları çox vaxt müxtəlif konfiqurasiyalara malikdir. Məsələn, ünvan və əlaqə portu. Məsələn, Properties sinfindən istifadə etsək, bu belə görünə bilər :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Və bu kifayət qədər görünür, çünki... fayldan Properties əldə edə bilərik. Və bir maşında hər şey bizimlə yaxşı gedir. Bəs təsəvvür edin ki, sistemimiz bir-birindən ayrılmış müxtəlif sistemlərdən ibarət olmağa başlayır? Belə sistemə paylanmış sistemlər də deyilir. Vikipediyada aşağıdakı tərifi tapa bilərsiniz: Paylanmış sistemlər komponentləri bir-biri ilə əlaqə saxlayan və bir-biri ilə mesaj mübadiləsi edərək öz hərəkətlərini koordinasiya edən müxtəlif şəbəkə kompüterlərində yerləşən sistemlərdir. Aşağıdakı diaqrama baxa bilərsiniz:
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 2
Bu yanaşma ilə vahid sistem komponentlərə bölünür. Konfiqurasiya ayrıca ümumi komponentdir. Digər komponentlərin hər biri konfiqurasiya komponenti üçün müştəri kimi çıxış edir. Bu hal " Paylanmış konfiqurasiya " adlanır . Paylanmış konfiqurasiyanın çoxlu müxtəlif tətbiqləri var. Və bugünkü icmalda onlardan biri Zookeeper adlı biri ilə tanış olmağı təklif edirəm.
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 3

Zoopark işçisi

Zookeeper ilə tanış olmağın yolu onların rəsmi saytından başlayır: zookeeper.apache.org Rəsmi internet saytında siz “ Yükləmə ” bölməsinə keçməlisiniz . Bu bölmədə arxivi .tar.gz formatında yükləyin, məsələn, “zookeeper-3.4.13.tar.gz”. tar vahid sistemləri üçün ənənəvi arxiv formatıdır. gz - o deməkdir ki, gzip arxivi sıxışdırmaq üçün istifadə olunur. Əgər biz Windows maşınında işləyiriksə, bu bizi narahat etməməlidir. Müasir arxivçilərin əksəriyyəti (məsələn, 7-zip ) Windows-da onlarla mükəmməl işləyə bilər. Gəlin məzmunu bəzi qovluğa çıxaraq. Eyni zamanda, fərqi görəcəyik - çıxarılan vəziyyətdə diskdə təxminən 60 meqabayt tutacaq və biz təxminən 35 meqabaytlıq bir arxivi yüklədik. Gördüyünüz kimi, sıxılma həqiqətən işləyir. İndi Zookeeper-i işə salmalısınız. Ümumiyyətlə, Zookeeper bir növ serverdir. Zookeeper iki rejimdən birində işlədilə bilər: Müstəqil və ya Təkrarlanan . İlk seçim olaraq da bilinən ən sadə variantı nəzərdən keçirək - Bağımsız rejim. Zookeper-in işləməsi üçün ona konfiqurasiya faylı lazımdır. Ona görə də onu burada yaradaq: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Windows üçün biz Medium-dan tövsiyədən istifadə edəcəyik: “ Windows-da Apache ZooKeeper quraşdırmaq ”. Konfiqurasiya faylının məzmunu belə olacaq:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Gəlin zookeper kök qovluğuna gedən yolu ehtiva edən ZOOKEEPER_HOME mühit dəyişənini əlavə edək (mühitdəki təlimatlarda olduğu kimi) və həmçinin PATH mühit dəyişəninə aşağıdakı fraqmenti əlavə edək: Həmçinin ;%ZOOKEEPER_HOME%\bin; dataDir-də göstərilən kataloq mövcud olmalıdır, əks halda Zookeeper olmayacaq. serveri işə sala bilir. İndi zkServer əmrindən istifadə edərək serveri təhlükəsiz şəkildə işə sala bilərik. Zookeeper qovluğunun yol mühiti dəyişəninə əlavə edilməsi sayəsində biz Zookeper əmrlərini sadəcə bin kataloqundan deyil, hər yerdən çağıra bilərik.
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 4

ZNode

" Zookeper İcmalında " qeyd edildiyi kimi , Zookeper-dəki məlumatlar ağac strukturunda təşkil edilmiş ZNodlar (qovşaqlar) şəklində təmsil olunur . Yəni, hər bir ZNode məlumat ehtiva edə bilər və uşaq ZNodları ola bilər. ZNode təşkilatı haqqında daha çox məlumatı Zookeeper sənədlərində tapa bilərsiniz: " Data modeli və iyerarxik ad sahəsi ". Zookeeper və ZNode ilə işləmək üçün Zookeeper CLI (Command Line interfeysi) istifadə edəcəyik . Əvvəllər biz zkServer əmrindən istifadə edərək serveri işə salmışdıq. İndi qoşulmaq üçün yerinə yetirək. zkCli.cmd -server 127.0.0.1:2181 Əgər uğurlu olarsa, Zookeeper ilə əlaqə seansı yaradılacaq və biz təxminən aşağıdakı çıxışı görəcəyik:
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 5
Maraqlıdır ki, hətta quraşdırmadan dərhal sonra Zookeeper-də artıq ZNode var. Onun aşağıdakı yolu var:/zookeeper/quota
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 6
Bunlar “ kvota ” deyilənlərdir . " Apache ZooKeeper Essentials " da deyildiyi kimi , hər bir ZNode-un saxlaya biləcəyi məlumatları məhdudlaşdıran onunla əlaqəli kvota ola bilər. Znodların sayına və saxlanılan məlumatların miqdarına məhdudiyyət müəyyən edilə bilər. Üstəlik, bu həddi keçərsə, ZNode ilə əməliyyat ləğv edilmir, lakin limiti aşmaq barədə xəbərdarlıq alınacaq. ZNode haqqında " ZooKeeper Proqramçı Bələdçisi: ZNodes " kitabında oxumaq tövsiyə olunur . Oradan ZNode ilə necə işləyə biləcəyinizə dair bir neçə nümunə:
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 7
Onu da qeyd edim ki, ZNodes fərqlidir. Daimi ZNodları (əlavə bayraqlar göstərmədiyiniz halda) " davamlı " tiplidir . " Efemer Node " tipli bir ZNode var . Belə ZNodlar yalnız yaradıldıqları Zookeeper əlaqə sessiyasının müddəti ərzində mövcuddur. " Sequence Node " tipli bir ZNode var . Bu ZNodlara unikallığı təmin etmək üçün ardıcıllıqdan bir nömrə əlavə olunur. Sequence Node ya davamlı, ya da efemer ola bilər. Burada ZNode haqqında kiçik məlumat da tövsiyə olunur: “ Zookeeper ZNodes – Xarakteristikalar və Nümunə ”.
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 8

ZNode İzləyicisi

Mən də müşahidəçilər haqqında danışmaq istərdim. Onlar haqqında təfərrüatlar Zookeeper sənədlərində yazılıb: " ZooKeeper Watches ". Qısacası, müşahidəçi hansısa hadisə tərəfindən tetiklenen birdəfəlik tetikleyicidir. getData(), getChildren() və ya exists() əməliyyatlarını yerinə yetirməklə məlumatları əldə etməklə biz əlavə fəaliyyət kimi tətik yarada bilərik. Zookeeper hadisənin hansı ardıcıllıqla işlənməsini təmin edir. Bundan əlavə, sənədlərdə deyilir ki, yeni ZNode dəyərini görməmişdən əvvəl köhnə dəyərin yenisinə dəyişdirilməsi ilə bağlı bir hadisə görəcəyik. Müşahidəçilər haqqında daha ətraflı burada oxuya bilərsiniz: “ ZooKeeper Saatları – Xüsusiyyətlər və Zəmanətlər ”. Bunu sınamaq üçün yenidən CLI-dən istifadə edək : Tutaq ki, bəzi xidmətin statusunu saxladığımız dəyəri olan bir neçə ZNode var:
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
İndi məlumat /services/service1/statusdəyişərsə, birdəfəlik tetikleyicimiz işə düşəcək:
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 9
Maraqlıdır ki, Zookeeper-ə qoşulduqda müşahidəçinin necə işlədiyini də görürük:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected mümkün Zookeper hadisələrindən biridir. Bu barədə daha ətraflı məlumatı API təsvirində tapa bilərsiniz.
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 10

Zookeeper və Java

İndi Zookeeperin nə edə biləcəyi ilə bağlı bəzi əsas anlayışımız var. İndi onunla CLI vasitəsilə deyil, Java vasitəsilə işləyək. Bunun üçün bizə Java proqramı lazım olacaq, orada Zookeeper ilə necə işləyəcəyimizi görəcəyik. Tətbiqi yaratmaq üçün biz Gradle layihə qurma sistemindən istifadə edəcəyik . " Gradle Build Init plaginindən " istifadə edərək layihəni yaradacağıq. Bunu etmək üçün əmri yerinə yetirək: gradle init --type java-application Əgər Gradle bizdən aydınlaşdırıcı suallar istəsə, o zaman biz standart dəyərləri tərk edəcəyik (sadəcə Enter düyməsini basın). İndi qurma skriptini açaq, yəni. build.gradle faylı. Bu, layihəmizin nədən hazırlandığını və hansı artefaktlardan (kitabxanalar, çərçivələrdən) asılı olduğunu təsvir edir. Çünki Zookeeper istifadə etmək istəyirik, sonra onu əlavə etməliyik. Beləliklə, asılılıqlar blokuna Zookeeper-dən asılılıq əlavə edək:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Siz Gradle haqqında daha ətraflı icmalda oxuya bilərsiniz: " Gradle-a Qısa Giriş ". Beləliklə, bizim Java layihəmiz var, ona Zookeeper kitabxanasını bağladıq. İndi bir şey yazaq. Xatırladığımız kimi, CLI-dən istifadə edərək belə bir şey bağladıq: zkCli.cmd -server 127.0.0.1:2181 Əsas metodda App sinifində “server” atributunu elan edək:
String server = "127.0.0.1:2181";
Bağlantı ani bir hərəkət deyil. Bağlantının baş verməsi üçün proqramın icrasının əsas hissəsində birtəhər gözləməli olacağıq. Buna görə də bizə bir kilid lazımdır. Aşağıda bunu elan edək:
Object lock = new Object();
İndi bizə kimsə lazımdır ki, əlaqə qurulub. Xatırladığımız kimi, bunu CLI vasitəsilə etdiyimiz zaman müşahidəçi bizim üçün işləyirdi. Beləliklə, Java kodunda hər şey tam olaraq eynidir. Müşahidəçimiz müvəffəqiyyətlə tamamlanma haqqında mesaj göstərəcək və bu barədə gözləyən hər kəsə kilid vasitəsilə məlumat verəcəkdir. İzləyici yazaq:
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
İndi zooKeeper serverinə əlaqə əlavə edək:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Burada hər şey sadədir. Proqramın əsas ipində əsas metodu icra edərkən, kilidi tuturuq və zookeeper ilə əlaqə tələb edirik. Eyni zamanda, biz kilidi buraxırıq və başqası kiliddən tutub davam edə biləcəyimizi bildirənə qədər gözləyirik. Bağlantı qurulduqda, müşahidəçi işləyəcək. O, SyncConnected hadisəsinin gəlib çatdığını yoxlayacaq (xatırladığımız kimi, izləyicinin CLI vasitəsilə tutduğu budur) və sonra mesaj yazacaq. Sonra, kilidi tuturuq (əsas mövzu əvvəllər buraxdığı üçün) və kilidi gözləyən bütün mövzulara davam edə biləcəyimiz barədə xəbərdar edirik. Hadisə emal mövzusu sinxronlaşdırılmış blokdan çıxır və bununla da kilidi buraxır. Əsas mövzu bildiriş aldı və kilidin buraxılmasını gözlədikdən sonra icraya davam edir, çünki kilidi alana qədər o, sinxronlaşdırılmış blokdan çıxa və işləməyə davam edə bilməyəcək. Beləliklə, multithreading və Zookeeper API istifadə edərək, biz müxtəlif hərəkətlər edə bilərik. Zookeeper API CLI-nin icazə verdiyindən daha genişdir. Misal üçün:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
Gördüyünüz kimi, qovşaq yaratarkən biz ACL-ni konfiqurasiya edə bilərik. Bu başqa bir vacib xüsusiyyətdir. ACL-lər ZNode ilə fəaliyyətlərə tətbiq edilən icazələrdir. Çox parametrlər var, ona görə də ətraflı məlumat üçün rəsmi sənədlərə müraciət etməyi məsləhət görürəm: “ Zookeeper ACL İcazələri ”.
Zoopark işçisi və ya zoopark işçisi necə yaşayır - 11

Nəticə

Bunu niyə oxuduq? Çünki Zookeeper digər məşhur texnologiyalarda istifadə olunur. Məsələn, Apache Kafka Zookeeper tələb edir, bu barədə " Kafka Tez Başlanğıc Bələdçisi "ndə oxuya bilərsiniz. O, həmçinin NOSQL verilənlər bazası HBase-də istifadə olunur, bu barədə onların " HBase Quickstart Guide " bölməsində oxuya bilərsiniz . Əslində bir çox başqa layihələr Zookeeper-dən istifadə edir. Onlardan bəziləri " Zookeeperdən Real Dünyada İstifadə " siyahısında verilmişdir. Ümid edirəm ki, “niyə” sualına cavab verdim. İndi ən vacib sual: "Sonra nə olacaq?" Əvvəlcə Apache Zookeeper mövzusunda aşağıdakı kitabları oxuya bilərsiniz: İkincisi, Zookeeper haqqında əla video reportajlar var. Tövsiyə olunan baxış: Üçüncüsü, dünyanın mənzərəsini tamamlayacaq bir neçə faydalı məqalə var: Bu, çox qısa bir baxışdır, amma giriş sözü olaraq, faydalı olacağına ümid edirəm. #Viaçeslav
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION