תחילת העבודה עם Java ו- Zookeeper

1. סקירה כללית

גן החיות של אפאצ'י הוא שירות תיאום מבוזר מה שמקל על פיתוח יישומים מבוזרים. הוא משמש פרויקטים כמו Apache Hadoop, HBase ואחרים למקרי שימוש שונים כמו בחירת מנהיגים, ניהול תצורה, תיאום צומת, ניהול חכירת שרתים וכו '.

צמתים בתוך אשכול ZooKeeper מאחסנים את הנתונים שלהם במרחב שמות היררכי משותף הדומה למערכת קבצים רגילה או למבנה נתוני עץ.

במאמר זה נחקור כיצד להשתמש ב- Java API של Apache Zookeeper לאחסון, עדכון ומחיקה של מידע המאוחסן ב- ZooKeeper.

2. להכין

הגרסה האחרונה של ספריית Java של Apache ZooKeeper נמצאת כאן:

 org.apache.zookeeper גן החיות 3.4.11 

3. מודל נתונים של ZooKeeper - ZNode

ל- ZooKeeper יש מרחב שמות היררכי, בדומה למערכת קבצים מבוזרת שבה הוא מאחסן נתוני תיאום כמו מידע על מצב, מידע על תיאום, מידע על מיקום וכו '. מידע זה נשמר בצמתים שונים.

כל צומת בעץ ZooKeeper מכונה ZNode.

כל ZNode שומר על מספרי גרסאות וחותמות זמן לכל נתונים או שינוי ACL. כמו כן, הדבר מאפשר ל- ZooKeeper לאמת את המטמון ולתאם עדכונים.

4. התקנה

4.1. הַתקָנָה

המהדורה האחרונה של ZooKeeper ניתן להוריד מכאן. לפני שנעשה זאת עלינו לוודא כי אנו עומדים בדרישות המערכת המתוארות כאן.

4.2. מצב עצמאי

עבור מאמר זה, נפעיל את ZooKeeper במצב עצמאי מכיוון שהוא דורש תצורה מינימלית. בצע את השלבים המתוארים בתיעוד כאן.

הערה: במצב עצמאי, אין שכפול, כך שאם תהליך ZooKeeper נכשל, השירות יירד.

5. דוגמאות ל- ZooKeeper CLI

כעת נשתמש בממשק שורת הפקודה ZooKeeper (CLI) כדי לקיים אינטראקציה עם ZooKeeper:

bin / zkCli.sh-server 127.0.0.1:2181

מעל הפקודה מתחיל מופע עצמאי באופן מקומי. בואו נבחן כעת כיצד ליצור ZNode ולאחסן מידע בתוך ZooKeeper:

[zk: localhost: 2181 (CONNECTED) 0] create / MyFirstZNode ZNodeVal נוצר / FirstZnode

בדיוק יצרנו ZNode 'MyFirstZNode' בשורש מרחב השמות ההיררכי של ZooKeeper ונכתב 'ZNodeVal' לזה.

מכיוון שלא העברנו שום דגל, ZNode שנוצר יהיה קבוע.

בואו ניפק עכשיו א 'לקבל' פקודה להביא את הנתונים כמו גם מטא נתונים המשויכים ל- ZNode:

[zk: localhost: 2181 (CONNECTED) 1] get / FirstZnode "Myfirstzookeeper-app" cZxid = 0x7f ctime = יום ראשון 18 בפברואר 16:15:47 IST 2018 mZxid = 0x7f mtime = ראשון פברואר 18 16:15:47 IST 2018 pZxid = 0x7f המרה = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 22 numChildren = 0

אנו יכולים לעדכן את הנתונים של הקיים ZNode משתמש ב מַעֲרֶכֶת מבצע.

לדוגמה:

set / MyFirstZNode ZNodeValUpdated

זה יעדכן את הנתונים בכתובת MyFirstZNode מ ZNodeVal ל ZNodeVal עודכן.

6. דוגמה ל- ZooKeeper Java API

בואו נסתכל על Zookeeper Java API וליצור צומת, לעדכן את הצומת ולאחזר כמה נתונים.

6.1. חבילות Java

הכריכות של JavaKeeper Java מורכבות בעיקר משתי חבילות Java:

  1. org.apache.zookeeper: המגדיר את המעמד הראשי של ספריית הלקוחות של ZooKeeper יחד עם הגדרות סטטיות רבות של סוגי האירועים ZooKeeper.
  2. org.apache.zookeeper.data: המגדיר את המאפיינים המשויכים ל- ZNodes, כגון רשימות בקרת גישה (ACL), מזהים, נתונים סטטיסטיים וכן הלאה.

יש גם ZooKeeper Java APIs המשמשים ליישום שרתים כגון org.apache.zookeeper.server, org.apache.zookeeper.server.quorum, ו org.apache.zookeeper.server.upgrad.

עם זאת, הם מחוץ לתחום המאמר הזה.

6.2. חיבור למופע ZooKeeper

בואו ניצור עכשיו ZK חיבור מחלקה אשר תשמש לחיבור והתנתקות מ ZooKeeper שכבר פועל:

מחלקה ציבורית ZKConnection {גן חיות פרטי של ZooKeeper; CountDownLatch connectionLatch = CountDownLatch חדש (1); // ... חיבור ZooKeeper ציבורי (מארח מחרוזת) זורק IOException, InterruptedException {zoo = new ZooKeeper (host, 2000, new Watcher () {public void process (WatchedEvent we) {if (we.getState () == KeeperState. SyncConnected) {connectionLatch.countDown ();}}}); connectionLatch.await (); גן חיות חזרה; } ריק ריק () זורק את InterruptedException {zoo.close (); }}

כדי להשתמש בשירות ZooKeeper, אפליקציה חייבת להקים תחילה אובייקט של ZooKeeper class, שהיא המחלקה העיקרית של ספריית הלקוחות של ZooKeeper.

ב לְחַבֵּר בשיטה, אנו מייצרים מופע של ZooKeeper מעמד. כמו כן, רשמנו שיטת התקשרות חוזרת לעיבוד ה- צפה באירוע מ ZooKeeper לקבלת חיבור ובהתאם לסיים את לְחַבֵּר באמצעות שיטה ספירה לאחור שיטה של CountDownLatch.

לאחר יצירת חיבור לשרת, מזהה הפעלה מוקצה ללקוח. כדי לשמור על תוקף ההפעלה, הלקוח צריך לשלוח מעת לעת פעימות לב לשרת.

יישום הלקוח יכול להתקשר ל- API של ZooKeeper כל עוד מזהה ההפעלה שלו נשאר בתוקף.

6.3. פעולות לקוח

כעת ניצור ZKManager ממשק החושף פעולות שונות כמו יצירת ZNode ושמירת נתונים, אחזור ועדכון נתוני ZNode:

ממשק ציבורי ZKManager {ציבורי ריק ליצור (נתיב מחרוזת, בתים [] נתונים) זורק KeeperException, InterruptedException; אובייקט ציבורי getZNodeData (נתיב מחרוזת, שעון בוליאני); עדכון חלל ציבורי (נתיב מחרוזת, נתוני בייט []) זורק את KeeperException, InterruptedException; }

בואו נסתכל כעת על יישום הממשק הנ"ל:

מחלקה ציבורית ZKManagerImpl מיישמת את ZKManager {פרטית ZooKeeper zkeeper פרטית; ZKConnection סטטי פרטי zkConnection; ציבורי ZKManagerImpl () {initialize (); } החלל פרטי ריק () {zkConnection = ZKConnection חדש (); zkeeper = zkConnection.connect ("localhost"); } חלל ציבורי closeConnection () {zkConnection.close (); } יצירת חלל ציבורי (נתיב מחרוזת, בתים [] נתונים) זורק KeeperException, InterruptedException {zkeeper.create (נתיב, נתונים, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } אובייקט ציבורי getZNodeData (נתיב מחרוזת, watchFlag בוליאני) זורק את KeeperException, InterruptedException {byte [] b = null; b = zkeeper.getData (נתיב, null, null); להחזיר מחרוזת חדשה (b, "UTF-8"); } עדכון חלל ציבורי (נתיב מחרוזת, נתוני בייט []) זורק את KeeperException, InterruptedException {int version = zkeeper.exists (path, true) .getVersion (); zkeeper.setData (נתיב, נתונים, גרסה); }}

בקוד לעיל, לְחַבֵּר ו לְנַתֵק שיחות מועברות למוקדם שנוצר ZK חיבור מעמד. שֶׁלָנוּ לִיצוֹר השיטה משמשת ליצירת ZNode בנתיב נתון מנתוני מערך הבתים. למטרת הדגמה בלבד, שמרנו על ACL פתוח לחלוטין.

לאחר היצירה, ZNode הוא קבוע ולא נמחק כאשר הלקוח מתנתק.

ההיגיון להביא נתוני ZNode מ- ZooKeeper אצלנו getZNodeData השיטה היא די פשוטה. לבסוף, עם עדכון שיטה, אנו בודקים את נוכחותו של ZNode בנתיב נתון ומביא אותו אם הוא קיים.

מעבר לכך, לצורך עדכון הנתונים, ראשית אנו בודקים אם קיימת ZNode ומקבלים את הגרסה הנוכחית. ואז, אנו קוראים את setData שיטה עם נתיב ה- ZNode, הנתונים והגרסה הנוכחית כפרמטרים. ZooKeeper יעדכן את הנתונים רק אם הגרסה שעברה תואמת את הגרסה האחרונה.

7. מסקנה

בעת פיתוח יישומים מבוזרים, Apache ZooKeeper ממלא תפקיד קריטי כשירות תיאום מבוזר. באופן ספציפי למקרי שימוש כמו אחסון תצורה משותפת, בחירת צומת הראשי וכן הלאה.

ZooKeeper מספק גם ממשקי API אלגנטיים מבוססי Java המשמשים בקוד יישום בצד הלקוח לתקשורת חלקה עם ZooKeeper ZNodes.

וכמו תמיד, ניתן למצוא את כל המקורות להדרכה זו באתר Github.


$config[zx-auto] not found$config[zx-overlay] not found