JavaRush /Java Blog /Random-TL /Zookeeper o kung ano ang buhay para sa isang zookeeper

Zookeeper o kung ano ang buhay para sa isang zookeeper

Nai-publish sa grupo
Zookeeper o kung paano nakatira ang isang zoo worker - 1

Panimula

Ang mga application ng Java ay madalas na may iba't ibang mga pagsasaayos. Halimbawa, address at port ng koneksyon. Halimbawa, maaaring ganito ang hitsura kung ginamit namin ang klase ng Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
At ito ay tila sapat na, dahil... makakakuha tayo ng Properties mula sa file. At ang lahat ay tila maayos sa amin sa isang makina. Ngunit isipin na ang aming sistema ay nagsisimulang binubuo ng iba't ibang mga sistema na hiwalay sa isa't isa? Ang ganitong sistema ay tinatawag ding mga distributed system. Sa Wikipedia mahahanap mo ang sumusunod na kahulugan: Ang mga distributed system ay mga system na ang mga bahagi ay matatagpuan sa iba't ibang network computer na nakikipag-ugnayan sa isa't isa at nag-uugnay sa kanilang mga aksyon sa pamamagitan ng pagpapalitan ng mga mensahe sa isa't isa. Maaari mong tingnan ang sumusunod na diagram:
Zookeeper o kung paano nakatira ang isang zoo worker - 2
Sa pamamaraang ito, ang isang solong sistema ay nahahati sa mga bahagi. Ang configuration ay isang hiwalay na karaniwang bahagi. Ang bawat isa sa iba pang mga bahagi ay gumaganap bilang isang kliyente para sa bahagi ng pagsasaayos. Ang kasong ito ay tinatawag na " Distributed configuration ". Mayroong maraming iba't ibang mga pagpapatupad ng distributed configuration. At sa pagsusuri ngayon, ipinapanukala kong kilalanin ang isa sa kanila, na tinatawag na Zookeeper.
Zookeeper o kung paano nabubuhay ang isang zoo worker - 3

Zookeeper

Ang landas para makilala ang Zookeeper ay nagsisimula sa kanilang opisyal na website: zookeeper.apache.org Sa opisyal na website kailangan mong pumunta sa seksyong " I-download . Sa seksyong ito, i-download ang archive sa .tar.gz na format, halimbawa "zookeeper-3.4.13.tar.gz". Ang tar ay isang tradisyonal na format ng archive para sa mga sistema ng Unit. gz - nangangahulugan na ang gzip ay ginagamit upang i-compress ang archive. Kung nagtatrabaho kami sa isang Windows machine, hindi ito dapat mag-abala sa amin. Karamihan sa mga modernong archiver (halimbawa, 7-zip ) ay maaaring gumana nang perpekto sa kanila sa Windows. Kunin natin ang mga nilalaman sa ilang direktoryo. Kasabay nito, makikita natin ang pagkakaiba - sa disk sa na-extract na estado ay sasakupin nito ang humigit-kumulang 60 megabytes, at nag-download kami ng isang archive na halos 35 megabytes ang laki. Tulad ng nakikita mo, talagang gumagana ang compression. Ngayon ay kailangan mong ilunsad ang Zookeeper. Sa pangkalahatan, ang Zookeeper ay isang uri ng server. Maaaring patakbuhin ang Zookeeper sa isa sa dalawang mode: Standalone o Replicated . Isaalang-alang natin ang pinakasimpleng opsyon, na kilala rin bilang unang opsyon - Standalone mode. Para tumakbo ang Zookeper, kailangan nito ng configuration file. Samakatuwid, likhain natin ito dito: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Para sa Windows, gagamitin namin ang rekomendasyon mula sa Medium: " Pag-install ng Apache ZooKeeper sa Windows ". Ang mga nilalaman ng file ng pagsasaayos ay magiging katulad nito:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Idagdag natin ang ZOOKEEPER_HOME environment variable na naglalaman ng path sa zookeper root directory (tulad ng sa mga tagubilin sa medium), at idagdag din ang sumusunod na fragment sa PATH environment variable: ;%ZOOKEEPER_HOME%\bin; Gayundin, ang direktoryo na tinukoy sa dataDir ay dapat umiral, kung hindi, Zookeeper ay hindi magiging kayang simulan ang server. Ngayon ay ligtas na nating simulan ang server gamit ang command na: zkServer. Salamat sa katotohanan na ang direktoryo ng Zookeeper ay naidagdag sa variable ng kapaligiran ng landas, maaari naming tawagan ang mga utos ng Zookeper mula sa kahit saan, hindi lamang mula sa direktoryo ng bin.
Zookeeper o kung paano nakatira ang isang zoo worker - 4

ZNode

Gaya ng nakasaad sa " Pangkalahatang-ideya ng Zookeeper ", ang data sa Zookeper ay kinakatawan sa anyo ng mga ZNode (node) na nakaayos sa isang istraktura ng puno. Iyon ay, ang bawat ZNode ay maaaring maglaman ng data at magkaroon ng anak na ZNode. Ang higit pang impormasyon tungkol sa organisasyon ng ZNode ay matatagpuan sa dokumentasyon ng Zookeeper: " Modelo ng data at ang hierarchical namespace ". Upang magtrabaho kasama ang Zookeeper at ZNode gagamitin namin ang Zookeeper CLI (Command Line interface). Noong nakaraan, sinimulan namin ang server gamit ang zkServer command. Ngayon, para kumonekta, i-execute natin. zkCli.cmd -server 127.0.0.1:2181 Kung matagumpay, gagawa ng session ng koneksyon sa Zookeeper at makikita natin ang humigit-kumulang sumusunod na output:
Zookeeper o kung paano nakatira ang isang zoo worker - 5
Kapansin-pansin, kahit kaagad pagkatapos ng pag-install, ang Zookeeper ay mayroon nang ZNode. Mayroon itong sumusunod na landas:/zookeeper/quota
Zookeeper o kung paano nakatira ang isang zoo worker - 6
Ito ang mga tinatawag na " quota ". Gaya ng nakasaad sa " Apache ZooKeeper Essentials ", ang bawat ZNode ay maaaring magkaroon ng quota na nauugnay dito, na nililimitahan ang data na maiimbak nito. Maaaring tukuyin ang limitasyon sa bilang ng mga znode at ang dami ng nakaimbak na data. Bukod dito, kung lumampas ang limitasyong ito, hindi nakansela ang operasyon sa ZNode, ngunit makakatanggap ng babala tungkol sa paglampas sa limitasyon. Inirerekomendang basahin ang tungkol sa ZNode sa " ZooKeeper Programmer's Guide: ZNodes ". Ang ilang mga halimbawa mula doon kung paano ka makakapagtrabaho sa ZNode:
Zookeeper o kung paano nakatira ang isang zoo worker - 7
Gusto ko ring tandaan na ang ZNodes ay iba. Ang mga regular na ZNode (maliban kung tinukoy mo ang mga karagdagang flag) ay may uri na " persistent ". Mayroong isang ZNode ng uri ng " Ephemeral Node ". Ang mga naturang ZNode ay umiiral lamang sa tagal ng session ng koneksyon ng Zookeeper kung saan sila nilikha. Mayroong isang ZNode na uri ng " Sequence Node ". Ang mga ZNode na ito ay idinagdag ng isang numero mula sa pagkakasunud-sunod upang matiyak ang pagiging natatangi. Ang Sequence Node ay maaaring maging persistent o ephemeral. Tungkol sa ZNode inirerekumenda din namin ang kaunting impormasyon sa background dito: " Zookeeper ZNodes - Mga Katangian at Halimbawa ".
Zookeeper o kung paano nakatira ang isang zoo worker - 8

ZNode Watcher

Gusto ko ring makipag-usap tungkol sa mga tagamasid. Ang mga detalye tungkol sa mga ito ay nakasulat sa dokumentasyon ng Zookeeper: " Mga Relo ng ZooKeeper ". Sa madaling salita, ang tagamasid ay isang minsanang trigger na na-trigger ng ilang kaganapan. Sa pamamagitan ng pagkuha ng data sa pamamagitan ng pagsasagawa ng getData(), getChildren() o exists() na mga operasyon, makakagawa tayo ng trigger bilang karagdagang pagkilos. Tinitiyak ng Zookeeper ang pagkakasunud-sunod kung saan pinoproseso ang kaganapan. Bilang karagdagan, ang dokumentasyon ay nagsasaad na bago natin makita ang bagong halaga ng ZNode, makakakita tayo ng isang kaganapan tungkol sa pagpapalit ng lumang halaga sa bago. Maaari kang magbasa ng higit pa tungkol sa Mga Tagamasid dito: " Mga Relo ng ZooKeeper - Mga Tampok at Garantiya ". Upang subukan ito, muli nating gamitin ang CLI : Ipagpalagay natin na mayroon tayong ZNode na may halaga kung saan iniimbak natin ang katayuan ng ilang serbisyo:
[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
Ngayon, kung magbabago ang data /services/service1/status, gagana ang aming isang beses na trigger:
Zookeeper o kung paano nakatira ang isang zoo worker - 9
Nakakatuwang kapag kumokonekta sa Zookeeper, nakikita rin natin kung paano gumagana ang tagamasid:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
Ang SyncConnected ay isa sa mga posibleng kaganapan sa Zookeper. Higit pang mga detalye tungkol dito ay matatagpuan sa paglalarawan ng API.
Zookeeper o kung paano nakatira ang isang zoo worker - 10

Zookeeper at Java

Mayroon na kaming ilang pangunahing pag-unawa sa kung ano ang maaaring gawin ng Zookeeper. Gawin natin ito ngayon sa pamamagitan ng Java, at hindi sa pamamagitan ng CLI. At para dito kakailanganin namin ang isang Java application, kung saan makikita namin kung paano magtrabaho kasama ang Zookeeper. Upang gawin ang application, gagamitin namin ang Gradle project build system . Gamit ang " Gradle Build Init plugin " lilikha kami ng proyekto. Upang gawin ito, patakbuhin natin ang utos: gradle init --type java-application Kung tatanungin tayo ni Gradle para sa paglilinaw ng mga tanong, iiwan natin ang mga default na halaga (pindutin lang ang Enter). Ngayon buksan natin ang build script, i.e. build.gradle file. Naglalaman ito ng isang paglalarawan ng kung saan ginawa ang aming proyekto at kung ano ang mga artifact (mga aklatan, mga framework) na nakasalalay dito. kasi gusto naming gumamit ng Zookeeper, pagkatapos ay kailangan namin itong idagdag. Samakatuwid, magdagdag tayo ng dependency sa Zookeeper sa block ng dependencies:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Maaari kang magbasa nang higit pa tungkol sa Gradle sa pagsusuri: " Isang Maikling Panimula sa Gradle ". Kaya, mayroon kaming isang proyekto sa Java, ikinonekta namin ang library ng Zookeeper dito. Sumulat tayo ngayon. Tulad ng natatandaan namin, gamit ang CLI, ikinonekta namin ang isang bagay na tulad nito: zkCli.cmd -server 127.0.0.1:2181 Ideklara natin ang attribute na "server" sa klase ng App sa pangunahing pamamaraan:
String server = "127.0.0.1:2181";
Ang koneksyon ay hindi isang instant na aksyon. Kailangan nating maghintay sa pangunahing thread ng pagpapatupad ng programa para mangyari ang koneksyon. Samakatuwid, kailangan namin ng lock. Ipahayag natin ito sa ibaba:
Object lock = new Object();
Ngayon kailangan namin ng isang tao upang sabihin na ang koneksyon ay naitatag. Tulad ng naaalala namin, noong ginawa namin ito sa pamamagitan ng CLI, nagtrabaho ang tagamasid para sa amin. Kaya sa Java code ang lahat ay eksaktong pareho. Magpapakita ang aming tagamasid ng mensahe tungkol sa matagumpay na pagkumpleto at aabisuhan ang lahat ng naghihintay tungkol dito sa pamamagitan ng lock. Sumulat tayo ng isang tagamasid:
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();
            }
		}
	}
};
Ngayon, idagdag natin ang koneksyon sa server ng zooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Simple lang ang lahat dito. Kapag isinasagawa ang pangunahing pamamaraan sa pangunahing thread ng programa, kinukuha namin ang lock at humiling ng koneksyon sa zookeeper. Kasabay nito, binitawan namin ang lock at naghihintay hanggang sa may ibang humawak sa lock at aabisuhan kami na maaari kaming magpatuloy. Kapag naitatag ang koneksyon, gagana ang tagamasid. Susuriin niya kung dumating na ang kaganapan ng SyncConnected (tulad ng naaalala namin, ito ang nahuli ng tagamasid sa pamamagitan ng CLI), at pagkatapos ay magsulat ng isang mensahe. Susunod, kinuha namin ang lock (dahil ang pangunahing thread ay inilabas ito dati) at ipaalam sa lahat ng mga thread na naghihintay para sa lock na maaari naming ipagpatuloy. Ang thread processing ng kaganapan ay lumabas sa naka-synchronize na bloke, at sa gayon ay ilalabas ang lock. Ang pangunahing thread ay nakatanggap ng isang abiso at, pagkatapos maghintay para sa lock na ilabas, ay nagpapatuloy sa pagpapatupad, dahil hanggang sa matanggap nito ang lock, hindi nito magagawang lumabas sa naka-synchronize na bloke at magpatuloy sa pagtatrabaho. Kaya, gamit ang multithreading at ang Zookeeper API, makakagawa tayo ng iba't ibang aksyon. Ang Zookeeper API ay mas malawak kaysa sa pinapayagan ng CLI. Halimbawa:
// 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"));
Tulad ng nakikita mo, kapag lumilikha ng isang node maaari naming i-configure ang isang ACL. Ito ay isa pang mahalagang tampok. Ang mga ACL ay mga pahintulot na nalalapat sa mga aksyon na may ZNode. Mayroong maraming mga setting, kaya inirerekomenda ko na sumangguni ka sa opisyal na dokumentasyon para sa mga detalye: " Zookeeper ACL Permissions ".
Zookeeper o kung paano nakatira ang isang zoo worker - 11

Konklusyon

Bakit natin ito binasa? Dahil ang Zookeeper ay ginagamit sa iba pang mga sikat na teknolohiya. Halimbawa, ang Apache Kafka ay nangangailangan ng Zookeeper, na maaari mong basahin sa " Gabay sa Mabilis na Pagsisimula ng Kafka ". Ginagamit din ito sa NOSQL database HBase, na maaari mong basahin nang higit pa tungkol sa kanilang " HBase Quickstart Guide ". Sa katunayan, maraming iba pang mga proyekto ang gumagamit ng Zookeeper. Ang ilan sa mga ito ay nakalista sa " Paggamit ng Zookeeper sa Tunay na Mundo ". Sana nasagot ko ang tanong na "bakit". Ang pinakamahalagang tanong ngayon ay: "Ano ang susunod?" Una, maaari mong basahin ang mga sumusunod na libro sa paksa ng Apache Zookeeper: Pangalawa, may mga mahuhusay na ulat sa video tungkol sa Zookeeper. Inirerekomendang panonood: Pangatlo, mayroong ilang mga kapaki-pakinabang na artikulo na makadagdag sa larawan ng mundo: Ito ay isang napakaikling pagsusuri, ngunit bilang isang panimulang salita, umaasa ako na ito ay magiging kapaki-pakinabang. #Viacheslav
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION