Kami menggunakan versi java 3.4.6 dalam contoh ini. Contohnya nyaman bagi semua orang untuk berdiskusi jika Anda tidak mengerti setelah mempelajarinya.
Ikatan Java Zookeeper untuk mengembangkan aplikasi terutama terdiri dari dua paket Java:
org.apache.zookeeper
org.apache.zookeeper.data
Paket org.apache.zooKeeper terdiri dari definisi antarmuka yang dipantau oleh Zookeeper dan berbagai penangan callback untuk Zookeeper. Ini mendefinisikan kelas -kelas utama perpustakaan kelas klien zookeeper serta definisi statis dari banyak jenis dan negara bagian zookeeper. Paket org.apache.zookeeper.data mendefinisikan fitur yang terkait dengan register data (juga dikenal sebagai Znodes), seperti daftar kontrol akses (ACL), ID, statistik, dll.
Org.apache.zooKeeper.server, org.apache.zookeepereper.server.quorum dan org.apache.zookeeper.server.Upgrade Paket di Zookeeper Java API adalah bagian dari implementasi server. Paket org.apache.zookeeper.client digunakan untuk menanyakan status server Zookeeper.
Bersiaplah untuk Lingkungan Pengembangan
Apache Zookeeper adalah perangkat lunak yang kompleks, sehingga membutuhkan banyak perpustakaan kelas lainnya. Perpustakaan ketergantungan termasuk dalam direktori LIB sebagai file jar dalam distribusi zookeeper. Nama file Jar Inti ZooKeeper adalah ZooKeeper-3.4.6.jar, yang terletak di direktori Home.
Untuk mengembangkan aplikasi Java ZooKeeper, kita harus mengatur Classpath ke Jar Zookeeper, dan semua perpustakaan pihak ketiga yang diandalkan ZooKeeper. Ada file zkenv.sh di direktori bin, yang dapat digunakan untuk mengatur classpath.
Kita perlu mengatur skrip sebagai berikut dan menjalankan pernyataan berikut pada baris perintah:
$ Zoobindir = $ {zk_home}/bin $ source $ {zoobindir} /zkenv.shVariabel shell ZK_HOME diatur ke jalur untuk menginstal Zookeeper, dalam pengaturan saya adalah/usr/share/zookeeper. Setelah itu, variabel ClassPath diatur dengan benar, dalam sistem saya seperti ini:
$ echo $ classpath /usr/share/zookeeperperer-3.4.6/bin/..build/classes: /usr/share/zookeeper-3.4.6/bin /../ build/lib/*. Jar: /usr/share/zookokeeper-3.4.4.6/bin/slb/slog/lib/slog/lib/slfar4jar4 : /usr/share/zooKeeper-3.4.6/bin /../ lib/slf4j-api-1.6.1.jar: /usr/share/zookeeper-3.4.6/bin /../ lib/netty-3.7.0.final.jar: /usr/share/zookeeper : /usr/share/zooKeeper-3.4.6/bin /../ lib/jline-0.9.94.jar: /usr/share/zooKeeper-3.4.6/bin /../ zooKeeper-3.4.6.jar: /usry/jo/libereperperer-3.4.6.6/bin : /usr/share/zookeeper-3.4.6/bin /../ conf:
Di Sistem Operasi Windows, Anda perlu menjalankan skrip ZKENV.CMD. Anda sekarang dapat menggunakan variabel ClassPath untuk mengkompilasi dan menjalankan program Java yang ditulis menggunakan Zookeeper API. Skrip zKenv.sh dapat ditemukan di file .bashrc dari direktori home di uni/linux untuk menghindari menggunakannya setiap kali sesi shell dimulai.
Program ZooKeeper pertama kedua
Untuk memperkenalkan ZooKeeper Java API, mari kita mulai dengan program yang sangat sederhana yang dapat terhubung ke instance ZooKeeper di LocalHost dan jika koneksi berhasil, itu akan mencetak daftar Znodes di bawah jalur akar namespace Zookeeper.
Kode untuk program ini adalah sebagai berikut:
/*Program ZooKeeper pertama kami*/impor java.io.ioException; impor java.util.arraylist; impor java.util.list; org.apache.zooKeeperer. {String hostport = "localhost: 2181"; string zpath = "/"; Daftar <string> zoochildren = new ArrayList <String> (); zooKeeper zk = new ZooKeeper (hostport, 2000, null); if (zk! = Null) {try {zooChilren = zk. false);System.out.println("Znodes of '/': ");for (String child: zooChildren) {//print the childrenSystem.out.println(child);}} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}Sebelum membangun dan menjalankan cuplikan kode sebelumnya, mari kita lihat apa yang dilakukannya secara khusus. Kode dimulai dengan pernyataan impor. Dengan menggunakan pernyataan ini, kami mengimpor paket yang diperlukan oleh setiap komponen program. Seperti yang disebutkan sebelumnya, paket org.apache.zooKeeper berisi semua kelas dan antarmuka yang diperlukan oleh klien untuk berinteraksi dengan server Zookeeper. Setelah mengimpor paket, kelas bernama Hellozookeeper didefinisikan. Karena kami menghubungkan ke instance Zookeeper yang berjalan dalam sistem yang sama, tentukan host dan string port sebagai localhost: 2181 dalam metode utama. Garis kode ZK = New ZooKeeper (Hostport, 2000, null) memanggil konstruktor ZooKeeper, yang berupaya terhubung ke server Zookeeper dan mengembalikan referensi. Untuk program klien yang terhubung ke instance Server Zookeeper dan mempertahankan koneksi itu, diperlukan sesi real-time. Dalam contoh ini, referensi yang dikembalikan oleh objek ZK yang dipakai oleh konstruktor mewakili sesi. API Zookeeper dibangun di sekitar referensi ini, dan setiap panggilan metode memerlukan referensi untuk dieksekusi.
Konstruktor kelas ZooKeeper menggunakan kode berikut untuk membuat referensi ke instance Zookeeper:
Zookeeper (String ConnectString, int sessionTimeout, Watcher Watcher)
Parameter yang digunakan adalah sebagai berikut:
ConnectString: Host yang dipisahkan koma: Daftar nomor port, masing-masing sesuai dengan server Zookeeper. Misalnya, 10.0.0.1:2001, 10.0.0.2:2002 dan 10.0.0.3:2003 mewakili host yang valid: pasangan pencocokan port untuk ansambel zookeeper dari tiga node. sessionTimeout: Ini adalah batas waktu sesi dalam milidetik. Ini adalah waktu ketika Zookeeper tidak mendapatkan detak jantung dari klien sebelum mengumumkan akhir sesi. Watcher: Objek Watcher yang diberitahukan jika dibuat ketika keadaan berubah dan peristiwa simpul terjadi. Objek Watcher ini perlu dibuat secara terpisah melalui kelas yang ditentukan pengguna, yang mengimplementasikan antarmuka pengamat dan meneruskan objek instantiated ke konstruktor zookeeper. Aplikasi klien dapat menerima pemberitahuan tentang berbagai jenis acara, seperti koneksi yang hilang, kedaluwarsa sesi, dll.
Zookeeper Java API mendefinisikan konstruktor tambahan dengan tiga parameter untuk menentukan operasi yang lebih maju. Kodenya adalah sebagai berikut:
Zookeeper (String ConnectString, int sessionTimeout, Watcher Watcher, Boolean Canbereadonly)
Pada konstruktor di atas kelas Zookeeper, jika diatur ke True, parameter Boolean CanbereAdonly memungkinkan klien yang dibuat untuk memasukkan mode baca-saja dalam hal partisi jaringan. Mode Read-only adalah skenario di mana klien tidak dapat menemukan mayoritas server, tetapi ada server partisi yang dapat diakses untuk terhubung ke dalam mode read-only, yang memungkinkan permintaan baca ke server, sementara permintaan menulis tidak diizinkan. Klien terus mencoba terhubung ke sebagian besar server di latar belakang sambil tetap tetap hanya membaca. Server partisi hanyalah subset dari grup Zookeeper, yang dibentuk karena alokasi jaringan di cluster. Sebagian besar server membentuk sebagian besar kuorum dalam ansambel.
Konstruktor berikut menunjukkan definisi dua parameter tambahan:
Zookeeper (String ConnectString, int sessionTimeout, Watcher Watcher, Long SessionID, Byte [] sessionPassWD)
Konstruktor ini memungkinkan objek klien Zookeeper untuk membuat dua parameter tambahan:
SessionID: Dalam kasus di mana klien terhubung kembali ke server zookeeper, ID sesi tertentu dapat digunakan untuk merujuk ke session Sesi yang sebelumnya terhubung: Jika sesi yang ditentukan memerlukan kata sandi, Anda dapat menentukannya di sini
Konstruktor berikut adalah kombinasi dari dua panggilan pertama:
Zookeeper (String ConnectString, int sessionTimeout, Watcher Watcher, Long SessionID, byte [] sessionPasswd, Boolean Canbereadonly)
Konstruktor ini adalah kombinasi dari dua panggilan pertama, yang memungkinkan penyambungan kembali ke sesi yang ditentukan dengan mode baca-hanya diaktifkan.
Catatan
Dokumentasi API Java terperinci untuk kelas Zookeeper dapat ditanya di http://zookeeper.apache.org/doc/r3.4.6/api/index.html.
Sekarang, kembali ke program Zookeeper kami. Setelah menelepon konstruktor, jika koneksi berhasil, kami akan mendapatkan referensi ke server Zookeeper. Kami meneruskan referensi ke metode getchildren melalui kode berikut:
zoochildren = zk.getchildren (zpath, false)
Metode GetChildren (String Path, Boolean Watch) dari kelas Zookeeper mengembalikan daftar anak -anak Znode di jalur yang diberikan. Kami hanya mengulangi daftar yang dikembalikan dengan metode ini dan mencetak string ke konsol.
Sebutkan program Hellozookeeper.java dan kompilasi program kami sebagai berikut:
$ javac -cp $ classpath hellozooKeeper.java
Sebelum kita menjalankan program, kita perlu memulai instance Server Zookeeper menggunakan perintah berikut:
$ $ {Zk_home} /bin/zkserver.sh startJalankan program sebagai berikut:
$ java -cp $ classpath hellozooKeeper
Eksekutor akan mencetak pesan log di konsol, menampilkan versi Zookeeper, versi java, java classpath, arsitektur server, dll. Berikut beberapa pesan log ini:
Pesan log yang dihasilkan oleh Zookeeper Java API sangat berguna untuk debugging. Ini memberi kami informasi tentang klien yang terhubung ke server ZooKeeper, membuat sesi dan latar belakang lainnya. Tiga pesan log terakhir yang ditampilkan di atas memberi tahu kami bagaimana klien memulai koneksi menggunakan parameter yang ditentukan dalam program, dan bagaimana server menetapkan ID sesi ke klien setelah koneksi yang berhasil.
Akhirnya, eksekusi program akhirnya menghasilkan yang berikut di konsol:
Kita dapat menggunakan shell zooKeeper untuk memverifikasi kebenaran program:
$ $ Zk_home/bin/zkcli.sh -server localhost
Selamat! Kami baru saja berhasil menulis program klien Zookeeper pertama kami.
Kedua, terapkan antarmuka pengamat
Pemantauan Watcher Zookeeper memungkinkan klien untuk menerima pemberitahuan dari server Zookeeper dan menangani acara ini saat terjadi. Zookeeper Java API menyediakan antarmuka publik yang disebut Watcher yang harus diterapkan oleh kelas penangan acara klien untuk menerima pemberitahuan acara tentang acara dari server Zookeeper. Secara terprogram, aplikasi yang menggunakan klien tersebut menangani acara ini dengan mendaftarkan objek panggilan balik dengan klien.
Kami akan menerapkan antarmuka Watcher untuk menangani acara yang dihasilkan oleh Zookeeper ketika data yang terkait dengan Znode diubah.
Antarmuka pengamat dinyatakan sebagai berikut dalam paket org.apache.zookeeper:
Public Interface Watcher {void Process (WatchedEvent Event);}Untuk menunjukkan monitor data Znode (Watcher), ada dua kelas Java: DataWatcher dan DataUpdater. DataWatcher akan berjalan sepanjang waktu dan mendengarkan acara NodedataChange dari server Zookeeper di /myConfig Jalur Znode yang ditentukan. Kelas DataUpdater secara berkala akan memperbarui bidang data di jalur Znode ini, yang akan menghasilkan acara, dan setelah menerima acara ini, kelas DataWatcher akan mencetak data yang diubah ke konsol.
Berikut ini adalah kode dari kelas DataWatcher.java:
Impor java.io.ioException; impor org.apache.zookeeper.createMode; impor org.apache.zookeeper.keepeerexception; impor org.apache.zookeeperer.watchedevent; impor org.apache.zookeeper.watcher; impor org.apache.zooke.apaceeperepereper.watcher; import org.apache.zooke.apaceeper.zookeeper. org.apache.zookeeper.ZooKeeper;public class DataWatcher implements Watcher, Runnable {private static String hostPort = "localhost:2181";private static String zooDataPath = "/MyConfig";byte zoo_data[] = null;ZooKeeper zk;public DataWatcher() {try {zk = new ZooKeeper(hostPort, 2000, ini); if (zk! = Null) {coba {// Buat znode jika tidak ada, dengan kode berikut: if (zk.exists (zoodatapath, this) == null) {zk.create (zoodatapath, "" .getbytes (), zoodefs.ids.open_acl_acl_acl_cafe); (KeepeRexception | InterruptedException e) {e.printstacktrace ();}}} catch (ioException e) {e.printstacktrace ();} public void printData () Lempar ke -interruptException, kiperseption {Zoo_data = zk.get. String (zoo_data); // Kode berikut mencetak konten saat ini dari Znode ke konsol: System.out.printf ("/NCurrent Data @ ZK Path %S: %S", Zoodatapath, ZString);} @ overridepublic void Proses (WatchedEvent event) {out.out.printf ("overridepublic void ( %soeDevent event) {out.out.printf event.toString());//We will process only events of type NodeDataChangedif (event.getType() == Event.EventType.NodeDataChanged) {try {printData();} catch (InterruptedException e) {e.printStackTrace();} catch (KeeperException e) {e.printStackTrace();}}} public static void main (string [] args) melempar interruptedException, KeeperException {dataWatcher dataWatcher = new DataWatcher (); DataWatcher.printData (); DataWatcher.run (true);} public run () {try {Synchronized (this) {true) {true) {true) {) {try) {try {) {try) {try {try) {try {try) {try {try) {try {try) {try {try) {try {try) {try {try) {try {try) {try {try) {E.PrintStackTrace (); thread.currentThread (). Interrupt ();}}}Mari kita lihat kode kelas DataWatcher.java untuk memahami implementasi monitor Zookeeper. Kelas publik DataWatcher mengimplementasikan antarmuka Watcher dan antarmuka yang dapat dilalui, dan bermaksud untuk menjalankan monitor sebagai utas. Metode utama membuat instance dari kelas DataWatcher. Dalam kode sebelumnya, konstruktor DataWatcher mencoba untuk terhubung ke instance Zookeeper yang berjalan di LocalHost. Jika koneksi berhasil, kami menggunakan kode berikut untuk memeriksa apakah Znode Path/MyConfig ada:
if (zk.exists (zoodatapath, ini) == null) {Jika Znode tidak ada di namespace zookeeper, panggilan metode ada kembali nol dan mencoba membuatnya sebagai znode persisten menggunakan kode sebagai berikut:
zk.create (zoodatapath, "" .getbytes (), zoodefs.ids.open_acl_unsafe, createMode.persistent);
Berikutnya adalah metode proses, yang dideklarasikan dalam antarmuka pengamat org.apache.zookeeper dan diimplementasikan oleh kelas DataWatcher menggunakan kode berikut:
Public Void Process (WatchedEvent Event) {Untuk kesederhanaan, dalam metode proses, peristiwa yang diterima dari instance zookeeper dicetak dan hanya peristiwa tipe nodedatachanged yang diproses lebih lanjut sebagai berikut:
if (event.getType () == event.eventtype.nodedatachanged)
Ketika ada pembaruan atau perubahan yang terjadi di bidang data Path Znode/MyConfig dan peristiwa tipe nodedatachanged diterima, metode printData dipanggil untuk mencetak konten Znode saat ini. Saat menjalankan panggilan getData di Znode, kami mengatur monitor lagi, yang merupakan parameter kedua dari metode ini, seperti yang ditunjukkan pada kode berikut:
zoo_data = zk.getData (zoodatapath, this, null);
Acara pemantauan adalah pemicu satu kali yang dikirim ke klien yang menetapkan pemantauan. Untuk terus menerima pemberitahuan acara lebih lanjut, klien harus mengatur ulang monitor.
DataUpdater.java adalah kelas sederhana yang terhubung ke instance ZooKeeper yang menjalankan LocalHost dan memperbarui bidang data jalur Znode/myConfig dengan string acak. Di sini kami memilih untuk memperbarui Znode dengan string universal unik pengidentifikasi (UUID), karena panggilan generator UUID berikutnya akan menjamin pembuatan string unik.
Kode kelas dataupdater.java adalah sebagai berikut:
Impor java.io.ioException; impor java.util.uuid; impor org.apache.zookeeper.keepeerexception; impor org.apache.zookeepereper.watchedevent; import org.apaeperepers oaftor.zooKements; impor org.apache.zooKeeper.zookeeper; wordery; impor org.apache.zoooke.zooEper "LocalHost: 2181"; string statis pribadi zoodatapath = "/myconfig"; zooKeeper zk; dataupdater publik () melempar ioException {coba {zk = new zooKeeper (hostport, 2000, this);} catch (ioException e) {e.printsport, this);} catch (ioException e) {e.printsport, this);} catch (ioException e) {e.printSport, this);} {ioException E) {e.printSpacker/This); detik dengan string UUID baru.public void run () melempar interruptedException, KeeperException {while (true) {string uuid = uuid.randomuuid (). Tostring (); byte zoo_data [] = uuid.getbytes (); zk.setDAData (zoOODAPA (ZOOODA (ZOOODAID (ZOODETA (ZOODEAT (ZOODETA (ZOODETA (ZOODETA (ZOODETA (ZOODETA (ZOODETA (ZOODAID (zOODETA (ZOODETA (ZOODETA (zOODETA (zOODAID (zOODAID (zOODETA (zOODETA (zOODEAT (); {Thread.sleep (5000); // tidur selama 5 detik} catch (interruptedException e) {thread.currentThread (). Interrupt ();}}} public static void main (string [] args) throwsioException, interruptException, KeepeRexception {dataupdater dataupdater = dataupdater baru (); EverureOblater. Proses (Acara WatchedEvent) {System.out.printf ("/nevent diterima: %s", event.toString ());}}Kode di atas menyebabkan server Zookeeper memicu peristiwa nodedatachanged. Karena DataWatcher menetapkan pemantauan untuk jalur Znode ini, ia menerima pemberitahuan peristiwa perubahan data. Kemudian mengambil data yang diperbarui, mengatur ulang pemantauan, dan mencetak data pada konsol.
Gunakan perintah berikut untuk mengkompilasi kelas DataWatcher dan DataUpdater:
$ javac cp $ classpath datacatcher.java $ javac cp $ classpath dataupdater.java
Untuk menjalankan program monitor dan perbarui, dua jendela terminal perlu dibuka. Saya ingin menjalankan monitor terlebih dahulu karena menciptakan znode /myConfig (jika belum dibuat di namespace zookeeper). Sebelum menjalankan monitor, pastikan server Zookeeper berjalan pada host lokal.
Di salah satu jendela terminal, jalankan kelas Watcher dengan menjalankan perintah berikut:
$ java cp $ classpath dataWatcher
Output pesan yang mirip dengan yang ditampilkan di tangkapan layar berikut:
Seperti yang ditunjukkan pada tangkapan layar sebelumnya, Znode Path/MyConfig dibuat oleh kelas DataWatcher. Ini juga mencetak isi Znode, tetapi tidak di konsol, karena kami tidak mengatur data apa pun saat membuat Znode. Ketika Znode dibuat, monitor di kelas menerima pemberitahuan acara tipe nodecreated, yang dicetak di konsol. Kelas DataWatcher terus berjalan dan mendengarkan acara pada simpul /myConfig dari server Zookeeper.
Mari kita jalankan kelas DataUpdater di jendela terminal lain:
$ java -cp $ classpath dataupdater
Setelah mencatat pesan log spesifik zookeeper awal ke konsol, kelas DataUpdater berjalan tanpa meminta. Ini menetapkan string UUID baru ke dalam bidang data dari Path/MyConfig Zookeeper. Jadi, lihat bahwa setiap 5 detik, output yang ditampilkan di tangkapan layar di bawah ini dicetak di jendela terminal yang menjalankan dataWatch:
DataWatcher juga dapat diuji menggunakan shell ZooKeeper. Lanjutkan untuk menjalankan kelas DataWatcher di terminal seperti sebelumnya, dan hubungi shell ZooKeeper di terminal lain dan jalankan perintah yang ditunjukkan pada tangkapan layar berikut:
Di terminal tempat DataWatcher berjalan, pesan berikut dicetak:
Tiga contoh - monitor cluster
Layanan populer yang disediakan melalui Internet, seperti email, platform layanan file, game online, dll., Dilayani oleh ratusan atau ribuan server yang sangat tersedia di berbagai pusat data, yang sering dipisahkan secara geografis. Dalam kelompok seperti itu, beberapa node server khusus diatur untuk memantau aktivitas server yang di -host layanan atau aplikasi di jaringan produksi. Dalam lingkungan komputasi awan, node pemantauan seperti itu yang juga digunakan untuk mengelola lingkungan cloud disebut pengontrol cloud. Pekerjaan penting dari node pengontrol ini adalah untuk mendeteksi kegagalan di server produksi secara real time dan memberi tahu administrator yang sesuai, dan mengambil tindakan yang diperlukan seperti gagal atas aplikasi pada server yang gagal ke server lain, memastikan toleransi kesalahan dan ketersediaan tinggi.
Di bagian ini, kami akan menggunakan Zookeeper Java Client API untuk mengembangkan model monitor cluster terdistribusi minimalis. Menggunakan konsep Zookeeper's Fechemeral Znode untuk membangun model pemantauan ini cukup sederhana dan elegan, seperti yang dijelaskan dalam langkah -langkah berikut:
Setiap server produksi menjalankan klien Zookeeper sebagai daemon. Proses ini terhubung ke server Zookeeper dan membuat znode fana dengan nama (lebih disukai nama jaringan atau nama host) di bawah jalur yang telah ditentukan dari namespace /zookeeper (seperti /anggota). Node cloud controller menjalankan proses monitor zookeeper, yang memantau jalur/anggota dan mendengarkan peristiwa tipe nodechildrenchanged. Proses monitor ini berjalan sebagai layanan atau daemon, dan menetapkan atau mengatur ulang pemantauan di jalur, dan mengimplementasikan logikanya untuk memanggil modul yang sesuai untuk mengambil tindakan yang diperlukan untuk memantau peristiwa. Sekarang, jika server produksi ditutup karena kegagalan perangkat keras atau kerusakan perangkat lunak, proses klien Zookeeper diakhiri, menyebabkan sesi antara server dan layanan Zookeeper akan diakhiri. Karena properti Znode fana adalah unik, layanan Zookeeper akan secara otomatis menghapus Znode di jalur/anggota setiap kali koneksi klien ditutup. Penghapusan Znode di jalur meningkatkan peristiwa nodechildrenchanged, sehingga proses pengamat di cloud controller diberitahu. Dengan memanggil metode getchildren di jalur/anggota, Anda dapat menentukan simpul server mana yang telah ditutup. Node pengontrol kemudian dapat mengambil langkah -langkah yang tepat, seperti melakukan logika pemulihan untuk memulai kembali layanan yang gagal di server lain. Logika ini dapat dibangun untuk bekerja secara real time, memastikan hampir nol downtime dan layanan yang sangat tersedia.
Untuk mengimplementasikan model pemantauan cluster ini, kami akan mengembangkan dua kelas Java. Kelas clustermonitor akan terus menjalankan monitor untuk memantau jalur/anggota di pohon zookeeper. Setelah memproses acara yang diangkat, kami akan mencetak daftar Znode di konsol dan mengatur ulang pemantauan. Clusterclient kelas lain akan memulai koneksi ke server ZooKeeper dan membuat znode fana di bawah /anggota.
Untuk mensimulasikan cluster dengan beberapa node, kami memulai banyak klien di komputer yang sama dan membuat znode fana menggunakan ID proses proses klien. Dengan melihat identitas proses, kelas clusterMonitor dapat menentukan proses klien mana yang telah ditutup dan proses mana yang masih ada. Dalam kasus praktis, proses klien biasanya membuat znode fana menggunakan nama host dari server yang sedang berjalan. Kode sumber untuk kedua kelas ini ditunjukkan di bawah ini.
Kelas clustermonitor.java didefinisikan sebagai berikut:
impor java.io.ioException; impor java.util.list; impor org.apache.zookeeper.createMode; impor org.apache.zookeperer.keafeerexception; import org.apachepereper.watchedevent; impor org.apache.zoooke.watcher.zooDer.watchedEvent; impor org.apache.zoooke.watcher.zooKache; org.apache.zookeeper.ZooKeeper;public class ClusterMonitor implements Runnable {private static String membershipRoot = "/Members";private final Watcher connectionWatcher;private final Watcher childrenWatcher;private ZooKeeper zk;boolean alive=true;public ClusterMonitor(String HostPort) throws IOException, InterruptedException, KeeperException {connectionWatcher = new Watcher() {@Overridepublic void process(WatchedEvent event) {if(event.getType()==Watcher.Event.EventType.None && event.getState() == Watcher.Event.KeeperState.SyncConnected) {System.out.printf("/nEvent Received: %s", event.toString());}}};childrenWatcher = Watcher baru () {@OverridEpublic void Process (WatchEdEvent Event) {System.out.printf ("/nevent diterima: %s", event.toString ()); if (event.getType () == event.eventtype.nodechildrenchanged) {try {// get of chands.eventtype.nodechildrenDanged) {try {/GET get of childing zk.getChildren (pengursaan, ini); wall ("!! Perubahan keanggotaan cluster !!!"); wall ("anggota:" + anak -anak);} catch (KeepeRexception e) {lempar runtimeException baru (e);} catch (interruptedException e) {thread.currentThread (). RunTimeException (e);}}}}; zk = ZooKeeper baru (hostport, 2000, connectionWatcher); // Pastikan induk Znode ada (zk.exists (keanggotaan, false) == null) {zk.create (anggotaan, "clustermonitorrroot" .gete (zk.create (neatpreate, "clustermonitorroot" .gete (zk.create (zk. CreateMode.persistent);} // Atur arloji pada orang tua Znodelist <String> anak -anak = zk.getchildren (anggota keanggotaan, anak -anak watcher); System.err.println ("Anggota:" + anak -anak);} public yang disinkronkan void close () {try {zk.close ();} Catching Public EXTERRUCE () {try {ZK.CLOSE ();} Catching Public () {try {ZK.CLOSE ();} Catching Publik) {e.printstacktrace ();}} public void wall (pesan string) {System.out.printf ("/nMessage: %s", pesan);} public void run () {coba {disinkronkan (ini) {while (Alive) {tunggu ();}}} catch (interruprEcception e) {wait {E.PrintStackTrace (); thread.currentThread (). Interrupt ();} akhirnya {this.close ();}} public static void main (string [] args) melempar ioException, interruptException, kiperseption {if (args.length! = 1) {System.err.err.r. <Host: port> "); system.exit (0);} string hostport = args [0]; clustermonitor baru (hostport) .run ();}}Kelas clusterclient.java didefinisikan sebagai berikut:
Impor java.io.ioException; impor java.lang.management.ManagementFactory; impor org.apache.zookeeper.createMode; impor org.apache.zookePer.keafeerexception; impor org.apache.zooKeeper.watchedevent; impor org.apache.zooker.zookeeper.watchedevent; impor org.apache.zookepereperepereper.watchent; impor org.apache.zooker.zookeeper ;watchent; impor org.apache.zooker.zooker.watchereperepereper ;watchent; impor org.apache.zooker.zooker.watchereper ;watched; org.apache.zookeeper.ZooDefs.Ids;import org.apache.zookeeper.ZooKeeper;public class ClusterClient implements Watcher, Runnable {private static String membershipRoot = "/Members";ZooKeeper zk;public ClusterClient(String hostPort, Long pid) {String processId = pid.toString();try {zk = new ZooKeeper (hostport, 2000, this);} catch (ioException e) {e.printstacktrace ();} if (zk! = Null) {coba {zk.create (keanggotaan + '/' + processid, processid.getbytes (), ids.open_aCl_Acl_Acl_Acl_aCafe, InterruptedException e) {E.PrintStackTrace ();}}} public disinkronkan void close () {coba {zk.close ();} catch (interruptedException e) {e.printStackTrace ();}@overridepublic Process (Watchedevent Event. event.toString ());} public void run () {coba {disinkronkan (this) {while (true) {wait ();}}} catch (interruptedException e) {e.printStackTrace (); thread.currentThread (). interrupt ();} akhirnya {this.close (); (args.length! = 1) {System.err.println ("Penggunaan: ClusterClient <host: port>"); System.exit (0);} String hostport = args [0]; // Dapatkan proses idtring nama = name.indexor.index. Long.parselong (name.substring (0, index)); clusterclient baru (hostport, processId) .run ();}}Gunakan perintah berikut untuk mengkompilasi kedua kelas ini:
$ javac -cp $ classpath clustermonitor.java $ javac -cp $ classpath clusterclient.java
Untuk menjalankan model pemantauan cluster, buka dua terminal. Di salah satu terminal, jalankan kelas clustermonitor. Di terminal lain, beberapa contoh dieksekusi dengan menjalankan kelas clusterclient di latar belakang.
Di terminal pertama, jalankan kelas clustermonitor:
$ java -cp $ classpath clustermonitorlocalhost: 2181
Seperti yang ditunjukkan pada contoh sebelumnya, Anda melihat pesan log debug dari API klien. Akhirnya, kelas clustermonitor mulai memantau acara dan memasukkan konten berikut:
Sekarang jalankan lima contoh kelas clusterclient untuk mensimulasikan lima node dari sebuah cluster. ClusterClient menciptakan znode fana menggunakan ID prosesnya sendiri di jalur /anggota pohon zookeeper:
$ java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [1] 4028 $ java -cp $ classpath clusterclient localhost: 2181 2>/1>/dev/null & [2] 24045 $ Java -Cp $ classpath clusterpath clusterhliam java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [4] 4072 $ java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [5] 4084
Sesuai dengan ini, akan diamati bahwa kelas clustermonitor mendeteksi instance kelas clusterclient baru ini, karena memantau peristiwa di jalur /anggota pohon zookeeper. Ini mensimulasikan acara gabungan simpul di sebuah cluster nyata. Output dapat dilihat di terminal kelas clustermonitor, yang mirip dengan apa yang ditunjukkan pada tangkapan layar di bawah ini:
Sekarang, jika proses clusterclient.java terbunuh, sesi yang dipertahankannya dengan server Zookeeper akan diakhiri. Oleh karena itu, znode fana yang dibuat oleh klien akan dihapus. Penghapusan akan memicu peristiwa nodechildrenchanged, yang akan ditangkap oleh kelas clustermonitor. Ini mensimulasikan skenario di mana simpul pergi di cluster.
Mari kita hentikan proses clusterclient dengan ID 4084:
$ kill -9 4084
Tangkapan layar berikut menunjukkan output di terminal kelas clustermonitor. Ini mencantumkan proses yang tersedia saat ini dan ID prosesnya yang meniru server real-time:
Contoh implementasi model pemantauan kluster sederhana dan elegan di atas menunjukkan kekuatan sejati Zookeeper. Tanpa Zookeeper, mengembangkan model seperti itu yang dapat memantau aktivitas simpul secara real time akan menjadi tugas yang sangat menakutkan.