JavaRush /בלוג Java /Random-HE /שומר גן חיות או איך החיים של שומר גן חיות
Viacheslav
רָמָה

שומר גן חיות או איך החיים של שומר גן חיות

פורסם בקבוצה
שומר גן חיות או איך עובד גן חיות חי - 1

מבוא

לרוב, ליישומי Java יש תצורות שונות. לדוגמה, כתובת ויציאת חיבור. לדוגמה, זה עשוי להיראות כך אם השתמשנו במחלקה Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
ונראה שזה מספיק, כי... נוכל לקבל מאפיינים מהקובץ. ונראה שהכל מסתדר איתנו במכונה אחת. אבל תארו לעצמכם שהמערכת שלנו מתחילה להיות מורכבת ממערכות שונות המופרדות זו מזו? מערכת כזו נקראת גם מערכות מבוזרות. בויקיפדיה ניתן למצוא את ההגדרה הבאה: מערכות מבוזרות הן מערכות שרכיביהן ממוקמים על מחשבי רשת שונים המתקשרים זה עם זה ומתאמים את פעולותיהם על ידי החלפת מסרים זה עם זה. אתה יכול להסתכל בתרשים הבא:
שומר גן חיות או איך עובד גן חיות חי - 2
בגישה זו, מערכת אחת מחולקת לרכיבים. תצורה היא רכיב נפוץ נפרד. כל אחד מהרכיבים האחרים פועל כלקוח עבור רכיב התצורה. מקרה זה נקרא " תצורה מבוזרת ". ישנם יישומים רבים ושונים של תצורה מבוזרת. ובסקירה של היום אני מציע להכיר את אחד מהם, שנקרא Zookeeper.
שומר גן חיות או איך עובד גן חיות חי - 3

שומר גן החיות

הדרך להיכרות עם Zookeeper מתחילה באתר הרשמי שלהם: zookeeper.apache.org באתר הרשמי עליך לעבור לקטע " הורדה " . בחלק זה, הורד את הארכיון בפורמט ‎.tar.gz, למשל "zookeeper-3.4.13.tar.gz". tar הוא פורמט ארכיון מסורתי עבור מערכות יחידה. gz - פירושו ש-gzip משמש לדחיסת הארכיון. אם אנחנו עובדים על מחשב Windows, אז זה לא אמור להפריע לנו. רוב הארכיונים המודרניים (לדוגמה, 7-zip ) יכולים לעבוד איתם בצורה מושלמת ב-Windows. בואו נחלץ את התוכן לתוך ספרייה כלשהי. יחד עם זאת, נראה את ההבדל - על הדיסק במצב חילוץ הוא יתפוס כ-60 מגה-בייט, והורדנו ארכיון בגודל של כ-35 מגה-בייט. כפי שאתה יכול לראות, דחיסה באמת עובדת. עכשיו אתה צריך להפעיל את Zookeeper. באופן כללי, Zookeeper הוא סוג של שרת. ניתן להפעיל את Zookeeper באחד משני מצבים: עצמאי או משוכפל . בואו נשקול את האפשרות הפשוטה ביותר, הידועה גם בתור האפשרות הראשונה - מצב עצמאי. כדי ש-Zookeper יפעל, הוא צריך קובץ תצורה. לכן, בואו ניצור אותו כאן: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. עבור Windows, נשתמש בהמלצה של Medium: " התקנת Apache ZooKeeper ב-Windows ". התוכן של קובץ התצורה יהיה בערך כך:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
בואו נוסיף את משתנה הסביבה ZOOKEEPER_HOME המכיל את הנתיב לספריית השורש של zookeper (כמו בהוראות על המדיום), ונוסיף גם את הפרגמנט הבא למשתנה הסביבה PATH: ;%ZOOKEEPER_HOME%\bin; כמו כן, הספרייה שצוינה ב-dataDir חייבת להתקיים, אחרת Zookeeper לא תהיה מסוגל להפעיל את השרת. כעת נוכל להפעיל את השרת בבטחה באמצעות הפקודה: zkServer. הודות לעובדה שספריית Zookeeper נוספה למשתנה סביבת הנתיב, אנו יכולים לקרוא לפקודות Zookeper מכל מקום, לא רק מספריית bin.
שומר גן החיות או איך עובד גן חיות חי - 4

ZNode

כפי שצוין ב"סקירה כללית של שומר גן החיות ", הנתונים ב-Zookeper מיוצגים בצורה של ZNodes (צמתים) המאורגנים במבנה עץ. כלומר, כל ZNode יכול להכיל נתונים ולהכיל ZNodes צאצאים. מידע נוסף על ארגון ZNode ניתן למצוא בתיעוד Zookeeper: " מודל נתונים ומרחב השמות ההיררכי ". כדי לעבוד עם Zookeeper ו-ZNode נשתמש ב- Zookeeper CLI (ממשק שורת הפקודה). בעבר, התחלנו את השרת באמצעות הפקודה zkServer. כעת, כדי להתחבר, בואו נבצע. zkCli.cmd -server 127.0.0.1:2181 אם יצליח, תיווצר הפעלת חיבור ל-Zookeeper ונראה בערך את הפלט הבא:
שומר גן חיות או איך עובד גן חיות חי - 5
מעניין שגם מיד לאחר ההתקנה, ל-Zookeeper כבר יש ZNode. יש לו את הנתיב הבא:/zookeeper/quota
שומר גן חיות או איך עובד גן חיות חי - 6
אלו הן מה שנקרא " מכסות ". כפי שצוין ב" Apache ZooKeeper Essentials ", לכל ZNode יכולה להיות מכסה המשויכת אליו, מה שמגביל את הנתונים שהוא יכול לאחסן. ניתן לציין הגבלה על מספר ה-Znodes וכמות הנתונים המאוחסנים. יתרה מכך, אם חריגה ממגבלה זו, הפעולה עם ZNode לא תבוטל, אלא תתקבל אזהרה על חריגה מהמגבלה. מומלץ לקרוא על ZNode ב"מדריך למתכנת ZooKeeper: ZNodes ". כמה דוגמאות משם איך אתה יכול לעבוד עם ZNode:
שומר גן חיות או איך עובד גן חיות חי - 7
אני רוצה גם לציין ש-ZNodes שונים. ZNodes רגילים (אלא אם תציין דגלים נוספים) הם מסוג " persistent ". קיים ZNode מסוג " צומת ארעית ". ZNodes כאלה קיימים רק למשך הפעלת החיבור של Zookeeper שבתוכה הם נוצרו. יש ZNode מסוג " Sequence Node ". ZNodes אלה מצורפים עם מספר מהרצף כדי להבטיח ייחודיות. צומת רצף יכול להיות מתמשך או חולף. קצת מידע רקע על ZNode מומלץ גם כאן: " ZNodes של שומר גן החיות - מאפיינים ודוגמא ".
שומר גן חיות או איך עובד גן חיות חי - 8

ZNode Watcher

אני רוצה לדבר גם על צופים. פרטים עליהם כתובים בתיעוד של Zookeeper: " ZooKeeper Watches ". בקיצור, צופה הוא טריגר חד פעמי שמופעל על ידי אירוע כלשהו. על ידי אחזור נתונים על ידי ביצוע הפעולות getData(), getChildren() או exists(), נוכל ליצור טריגר כפעולה נוספת. שומר גן החיות מבטיח את סדר עיבוד האירוע. בנוסף, התיעוד מציין שלפני שנוכל לראות את הערך החדש של ZNode, נראה אירוע על שינוי הערך הישן לחדש. אתה יכול לקרוא עוד על Watchers כאן: " שעוני ZooKeeper - תכונות וערבויות ". כדי לנסות זאת, בוא נשתמש שוב ב-CLI : נניח שיש לנו איזה ZNode עם ערך שבו אנו מאחסנים את הסטטוס של שירות כלשהו:
[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
כעת, אם הנתונים /services/service1/statusמשתנים, הטריגר החד-פעמי שלנו יופעל:
שומר גן חיות או איך עובד גן חיות חי - 9
מעניין שכאשר מתחברים ל-Zookeeper, אנו רואים גם איך הצופה עובד:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected הוא אחד מאירועי Zookeper האפשריים. פרטים נוספים עליו ניתן למצוא בתיאור ה-API.
שומר גן חיות או איך עובד גן חיות חי - 10

שומר גן החיות וג'אווה

כעת יש לנו הבנה בסיסית של מה Zookeeper יכול לעשות. בוא נעבוד איתו עכשיו דרך Java, ולא דרך ה-CLI. ולשם כך נזדקק לאפליקציית Java, בה נראה איך עובדים עם Zookeeper. כדי ליצור את האפליקציה, נשתמש במערכת בניית הפרויקט Gradle . באמצעות " תוסף Gradle Build Init " ניצור את הפרויקט. לשם כך, הבה נפעיל את הפקודה: gradle init --type java-application אם Gradle מבקש מאיתנו שאלות הבהרה, נשאיר את ערכי ברירת המחדל (פשוט הקש Enter). עכשיו בואו נפתח את סקריפט הבנייה, כלומר. קובץ build.gradle. הוא מכיל תיאור ממה מורכב הפרויקט שלנו ובאילו חפצים (ספריות, מסגרות) הוא תלוי. כי אנחנו רוצים להשתמש ב-Zookeeper, אז אנחנו צריכים להוסיף אותו. לכן, בואו נוסיף תלות ב-Zookeeper לבלוק התלות:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
אתה יכול לקרוא עוד על Gradle בסקירה: " A Brief Introduction to Gradle ". אז, יש לנו פרויקט Java, חיברנו אליו את ספריית Zookeeper. בוא נכתוב משהו עכשיו. כזכור, באמצעות ה-CLI חיברנו משהו כזה: zkCli.cmd -server 127.0.0.1:2181 בואו נצהיר על תכונת "שרת" במחלקה App בשיטה הראשית:
String server = "127.0.0.1:2181";
חיבור אינו פעולה מיידית. נצטרך איכשהו לחכות בשרשור הראשי של הפעלת התוכנית עד שהחיבור יתרחש. לכן, אנחנו צריכים מנעול. בואו נכריז על זה להלן:
Object lock = new Object();
עכשיו אנחנו צריכים מישהו שיגיד שהחיבור נוצר. כזכור, כשעשינו זאת דרך ה-CLI, הצופה עבד בשבילנו. אז בקוד ג'אווה הכל בדיוק אותו דבר. הצופה שלנו יציג הודעה על סיום מוצלח ויודיע לכל הממתינים על כך באמצעות נעילה. בוא נכתוב צופה:
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();
            }
		}
	}
};
כעת נוסיף את החיבור לשרת zooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
הכל פשוט כאן. בעת ביצוע השיטה הראשית בשרשור הראשי של התוכנית, אנו תופסים את המנעול ומבקשים חיבור לשומר גן החיות. במקביל, אנחנו משחררים את המנעול ומחכים עד שמישהו אחר יתפוס את המנעול ויודיע לנו שאנחנו יכולים להמשיך. כאשר החיבור נוצר, הצופה יפעל. הוא יבדוק שהאירוע SyncConnected הגיע (כזכור, זה מה שהצופה קלט דרך ה-CLI), ואז יכתוב הודעה. לאחר מכן, אנו תופסים את המנעול (מכיוון שהשרשור הראשי שחרר אותו בעבר) ומודיעים לכל השרשורים שמחכים לנעילה שנוכל להמשיך. שרשור עיבוד האירועים יוצא מהגוש המסונכרן, ובכך משחרר את הנעילה. השרשור הראשי קיבל הודעה ולאחר המתנה לשחרור המנעול, ממשיך בביצוע, מכיוון עד שהוא לא יקבל את המנעול, הוא לא יוכל לצאת מהבלוק המסונכרן ולהמשיך לעבוד. כך, באמצעות ריבוי הליכי שרשור וממשק ה-API של Zookeeper, אנו יכולים לבצע פעולות שונות. ה-API של Zookeeper רחב הרבה יותר ממה שה-CLI מאפשר. לדוגמה:
// 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"));
כפי שאתה יכול לראות, בעת יצירת צומת אנו יכולים להגדיר ACL. זוהי תכונה חשובה נוספת. ACLs הן הרשאות החלות על פעולות עם ZNode. יש הרבה הגדרות, אז אני ממליץ לך לעיין בתיעוד הרשמי לפרטים: " הרשאות שומרי גן חיות ".
שומר גן חיות או איך עובד גן חיות חי - 11

סיכום

למה קראנו את זה? כי Zookeeper משמש בטכנולוגיות פופולריות אחרות. לדוגמה, Apache Kafka דורש Zookeeper, עליו תוכלו לקרוא ב"מדריך קפקא להתחלה מהירה ". הוא משמש גם במסד הנתונים HBase של NOSQL, עליו תוכלו לקרוא עוד ב"מדריך ההתחלה המהיר של HBase ". למעשה, פרויקטים רבים אחרים משתמשים ב-Zookeeper. כמה מהם מופיעים ב"שימוש בשומר גן חיות בעולם האמיתי ". אני מקווה שעניתי על השאלה "למה". השאלה החשובה ביותר כעת היא: "מה הלאה?" ראשית, אתה יכול לקרוא את הספרים הבאים בנושא של Apache Zookeeper: שנית, יש דיווחי וידאו מצוינים על Zookeeper. צפייה מומלצת: שלישית, ישנם מספר מאמרים שימושיים שישלימו את תמונת העולם: זוהי סקירה קצרה מאוד, אבל בתור מילת מבוא, אני מקווה שהיא תהיה שימושית. #ויאצ'סלב
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION