מדריך מהיר ל- Apache Geode

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

אפאצ'י גאודה הוא רשת נתונים מבוזרת בזיכרון התומכת במטמון ובחישוב נתונים.

במדריך זה נסקור את מושגי המפתח של Geode ונעבור דרך כמה דוגמאות קוד באמצעות לקוח Java שלה.

2. התקנה

ראשית, עלינו להוריד ולהתקין את Apache Geode ולהגדיר את ה- gfsh סביבה. לשם כך, אנו יכולים לעקוב אחר ההוראות במדריך הרשמי של Geode.

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

2.1. התקנה ותצורה

מהספרייה הזמנית שלנו, עלינו להתחיל a איתור למשל:

gfsh> התחל איתור - שם = איתור - bind-address = localhost

איתור אחראים על התיאום בין חברים שונים בגיאודה אֶשׁכּוֹל, שנוכל לנהל עוד באמצעות JMX.

לאחר מכן, בואו נתחיל א שרת למשל לארח נתונים אחד או יותר אזורs:

gfsh> שרת התחל - שם = שרת 1 - שרת-יציאה = 0

הגדרנו את - יציאת שרת אפשרות ל- 0 כך שג'אוד יבחר כל יציאה זמינה. אם כי אם נשאיר את זה בחוץ, השרת ישתמש ביציאת ברירת המחדל 40404. שרת הוא חבר הניתן להגדרה אֶשׁכּוֹל שמתנהל כתהליך ארוך טווח ואחראי על ניהול הנתונים אזורים.

ולבסוף, אנחנו צריכים אזור:

gfsh> צור אזור - name = baeldung --type = REPLICATE

ה אזור בסופו של דבר זה המקום בו נאחסן את הנתונים שלנו.

2.2. אימות

בואו נוודא שיש לנו הכל עובד לפני שנמשיך הלאה.

ראשית, בואו לבדוק אם יש לנו את זה שרת ושלנו איתור:

gfsh> רשימת חברים שם | מזהה ------- | -------------------------------------------------- -------- שרת 1 | 192.168.0.105 (server1: 6119): 1024 איתור | 127.0.0.1 (מאתר: 5996: מאתר): 1024 [רכז]

והבא, שיש לנו את שלנו אזור:

gfsh> לתאר אזור - שם = baeldung ......................................... ................. שם: baeldung מדיניות נתונים: שכפול חברי אירוח: server1 תכונות שאינן ברירת מחדל משותפות על ידי אירוח חברים סוג | שם | ערך ------ | ----------- | --------------- אזור | מדיניות נתונים | שכפול | גודל | 0 | היקף | מופץ- ack

כמו כן, עלינו להחזיק כמה ספריות במערכת הקבצים בספריה הזמנית שלנו הנקראת "locator" ו- "server1".

עם תפוקה זו אנו יודעים שאנו מוכנים להמשיך הלאה.

3. תלות של Maven

עכשיו שיש לנו Geode פועל, נתחיל לבדוק את קוד הלקוח.

כדי לעבוד עם Geode בקוד ה- Java שלנו, נצטרך להוסיף את ספריית הלקוחות של Apache Geode Java ל- שלנו פום:

 org.apache.geode geode-core 1.6.0 

נתחיל פשוט באחסון נתונים ושחזורם בכמה אזורים.

4. אחסון ושליפה פשוטים

בואו נדגים כיצד לאחסן ערכים בודדים, קבוצות ערכים וכן אובייקטים מותאמים אישית.

כדי להתחיל לאחסן נתונים באזור "baeldung" שלנו, בואו נתחבר אליו באמצעות האיתור:

@ לפני חיבור בטל ציבורי () {this.cache = ClientCacheFactory חדש () .addPoolLocator ("localhost", 10334) .create (); this.region = מטמון. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung"); }

4.1. שמירת ערכים בודדים

כעת אנו יכולים פשוט לאחסן ולאחזר נתונים באזורנו:

@ מבחן ציבורי בטל כאשר SendMessageToRegion_thenMessageSavedSuccessfully () {this.region.put ("A", "Hello"); this.region.put ("B", "Baeldung"); assertEquals ("שלום", region.get ("A")); assertEquals ("Baeldung", region.get ("B")); }

4.2. שמירת ערכים מרובים בבת אחת

אנו יכולים גם לשמור מספר ערכים בו זמנית, למשל כשמנסים להפחית את זמן ההשהיה ברשת:

@Test הציבור בטל כאשר PutMultipleValuesAtOnce_thenValuesSavedSuccessfully () {ספק מקשים = () -> Stream.of ("A", "B", "C", "D", "E"); ערכי מפה = keys.get () .collect (Collectors.toMap (Function.identity (), מחרוזת :: toLowerCase)); this.region.putAll (ערכים); keys.get () .forEach (k -> assertEquals (k.toLowerCase (), this.region.get (k))); }

4.3. שמירת אובייקטים מותאמים אישית

מיתרים שימושיים, אך במוקדם ולא במאוחר נצטרך לאחסן אובייקטים מותאמים אישית.

בואו נדמיין שיש לנו רשומה של לקוחות שאנחנו רוצים לאחסן באמצעות סוג המפתח הבא:

CustomerKey ממחלק ציבורי מיישם Serializable {מזהה ארוך פרטי; מדינה מחרוזת פרטית; // גטרים וקובעים // שווה ו- hashcode}

וסוג הערך הבא:

לקוח בכיתה ציבורית מיישם {מפתח CustomerKey פרטי; פרטי מחרוזת firstName; שם משפחה פרטי מחרוזת; גיל שלם פרטי; // גטרים וקובעים}

יש כמה צעדים נוספים כדי לאחסן אותם:

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

שְׁנִיָה, הם צריכים להיות על מסלול הכיתה של היישום שלנו כמו גם על מסלול הכיתה של הגאודה שלנו שרת.

כדי להביא אותם למסלול הכיתה של השרת, בואו לארוז אותם, נגיד באמצעות חבילה נקייה mvn.

ואז נוכל להתייחס לצנצנת שהתקבלה בכלי חדש התחל שרת פקודה:

gfsh> עצור שרת - שם = שרת 1 gfsh> שרת התחל - שם = שרת 1 - classpath = .. / lib / apache-geode-1.0-SNAPSHOT.jar - server-port = 0

שוב, עלינו להפעיל פקודות אלה מהספריה הזמנית.

לבסוף, בואו ניצור חדש אזור נקרא "לקוחות ביילדונג" על שרת באמצעות אותה פקודה בה השתמשנו ליצירת אזור "baeldung":

gfsh> צור אזור - שם = לקוחות baeldung - סוג = REPLICATE

בקוד נגיע לאיתור כמו בעבר, תוך ציון הסוג המותאם אישית:

@ לפני התחברות הריק הציבורי () {// ... התחבר באמצעות האיתור this.customerRegion = this.cache. createClientRegionFactory (ClientRegionShortcut.CACHING_PROXY) .create ("baeldung-clients"); }

ואז נוכל לאחסן את הלקוחות שלנו כמו בעבר:

@ מבחן ציבורי בטל כאשר PutCustomKey_thenValuesSavedSuccessfully () {מפתח KeyKey = חדש CustomerKey (123); לקוח לקוח = לקוח חדש (מפתח, "ויליאם", "ראסל", 35); this.customerRegion.put (מפתח, לקוח); לקוח storeCustomer = this.customerRegion.get (מפתח); assertEquals ("ויליאם", storeCustomer.getFirstName ()); assertEquals ("ראסל", storeCustomer.getLastName ()); }

5. סוגי אזורים

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

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

5.1. אזור משוכפל

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

מ ה gfsh מסוף בספריית העבודה, בואו נוסיף עוד אחד שרת נקרא שרת 2 לאשכול:

gfsh> שרת התחל - שם = server2 - classpath = .. / lib / apache-geode-1.0-SNAPSHOT.jar - server-port = 0

זכור שכאשר הכנו "baeldung", השתמשנו –סוג = REPLICATE. בגלל זה, Geode ישכפל את הנתונים שלנו באופן אוטומטי לשרת החדש.

בואו נאמת זאת על ידי עצירה server1:

gfsh> עצור שרת - שם = שרת 1

ואז בואו ונבצע שאילתה מהירה באזור "באלדונג".

אם הנתונים שוחזרו בהצלחה, נקבל תוצאות בחזרה:

gfsh> שאילתה - query = 'בחר e.key מ /baeldung.entries e' תוצאה: true מגבלה: 100 שורות: 5 תוצאה ------ C B A E D

אז נראה שהשכפול הצליח!

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

אבל, מה אם שניהם יתרסקו? מכיוון שמדובר באזורים בזיכרון, הנתונים יאבדו.לשם כך נוכל להשתמש במקום זאת –סוג = REPLICATE_PERSISTENT המאחסן גם את הנתונים בדיסק בזמן שכפול.

5.2. אזור מחולק

עם מערכי נתונים גדולים יותר, אנו יכולים לשנות את גודל המערכת בצורה טובה יותר על ידי הגדרת תצורה של Geode לפיצול אזור למחיצות נפרדות, או דליים.

בואו ליצור מחיצה אחת אזור בשם "baeldung-partitioned":

gfsh> צור אזור - שם = baeldung מחולק - סוג = PARTITION

הוסף נתונים:

gfsh> put --region = baeldung-partitioned --key = "1" --value = "one" gfsh> put --region = baeldung-partitioned --key = "2" --value = "two" gfsh> put --region = baeldung-partitioned --key = "3" --value = "three"

ואמת במהירות:

gfsh> query --query = 'בחר e.key, e.value from /baeldung-partitioned.entries e' תוצאה: true הגבלה: 100 שורות: 3 מקשים | ערך --- | ----- 2 | שניים 1 | אחד 3 | שְׁלוֹשָׁה

ואז, כדי לאמת את חלוקת הנתונים, בואו נעצור שרת 1 שוב ושאל שוב:

gfsh> עצור שרת - שם = server1 gfsh> שאילתה - query = 'בחר e.key, e.value מ /baeldung-partitioned.entries e' תוצאה: true מגבלה: 100 שורות: 1 מקש | ערך --- | ----- 2 | שתיים

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

אבל מה אם אנו זקוקים לחלוקה וליתירות? Geode תומך גם במספר סוגים אחרים. השלושה הבאים שימושיים:

  • PARTITION_REDUNDANT מחיצות ו משכפל את הנתונים שלנו על פני חברים שונים באשכול
  • PARTITION_PERSISTENT מחיצה את הנתונים כמו חֲלוּקָה, אבל לדיסק, ו
  • PARTITION_REDUNDANT_PERSISTENT נותן לנו את כל שלוש ההתנהגויות.

6. שפת שאילתת אובייקטים

Geode תומך גם בשפת Query Object, או OQL, שיכולה להיות חזקה יותר מחיפוש מפתח פשוט. זה קצת כמו SQL.

לדוגמא זו, בואו נשתמש באזור "לקוח baeldung" שבנינו קודם.

אם נוסיף עוד כמה לקוחות:

נתוני מפה = HashMap חדש (); data.put (חדש CustomerKey (1), לקוח חדש ("Gheorge", "Manuc", 36)); data.put (CustomerKey חדש (2), לקוח חדש ("Allan", "McDowell", 43)); this.customerRegion.putAll (נתונים);

אז נוכל להשתמש QueryService למצוא לקוחות ששמם הפרטי הוא "אלן":

QueryService queryService = this.cache.getQueryService (); שאילתת מחרוזת = "בחר * מ- / baeldung-clients c איפה c.firstName = 'אלן'"; תוצאות תוצאות SelectResults = (SelectResults) queryService.newQuery (שאילתה). Execute (); assertEquals (1, results.size ());

7. פונקציה

אחד הרעיונות החזקים יותר של רשתות נתונים בזיכרון הוא הרעיון של "לקחת את החישובים לנתונים".

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

זה עשוי להזכיר לנו את הרעיון של סיומות SQL כמו PL-SQL או Transact-SQL.

7.1. הגדרת פונקציה

להגדרת יחידת עבודה עבור Geode לעשות,אנו מיישמים את Geode פוּנקצִיָה מִמְשָׁק.

לדוגמא, בואו נדמיין שעלינו לשנות את כל שמות הלקוחות לאותיות רישיות.

במקום לבצע שאילתות על הנתונים ולהגיש את היישום שלנו, נוכל פשוט ליישם פוּנקצִיָה:

המעמד הציבורי UpperCaseNames מיישם פונקציה {@Override public void run (FunctionContext context) {RegionFunctionContext regionContext = (RegionFunctionContext) הקשר; אזור אזור = regionContext.getDataSet (); עבור (Map.Entry entry: region.entrySet ()) {לקוח לקוח = entry.getValue (); customer.setFirstName (customer.getFirstName (). toUpperCase ()); } context.getResultSender (). lastResult (נכון); } @Override מחרוזת ציבורית getId () {להחזיר getClass (). GetName (); }}

ציין זאת getId חייב להחזיר ערך ייחודי, ולכן שם הכיתה הוא בדרך כלל בחירה טובה.

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

וגם פוּנקצִיָה יש הרבה יותר כוח מזה, אז עיין במדריך הרשמי, במיוחד ב- getResultSender שיטה.

7.2. פריסת פונקציה

עלינו להפוך את Geode למודע לפונקציה שלנו כדי להיות מסוגל להריץ אותו. כמו שעשינו עם סוגי הנתונים המותאמים אישית שלנו, נארוז את הצנצנת.

אבל הפעם נוכל פשוט להשתמש ב- לפרוס פקודה:

gfsh> deploy --jar =. / lib / apache-geode-1.0-SNAPSHOT.jar

7.3. פונקציית ביצוע

כעת, אנו יכולים לבצע את פוּנקצִיָה מהאפליקציה באמצעות פונקציית שירות:

@Test ציבורי בטל כאשרExecuteUppercaseNames_thenCustomerNamesAreUppercased () {ביצוע ביצוע = FunctionService.onRegion (this.customerRegion); ביצוע.execute (UpperCaseNames.class.getName ()); לקוח לקוח = this.customerRegion.get (CustomerKey חדש (1)); assertEquals ("GHEORGE", customer.getFirstName ()); }

8. מסקנה

במאמר זה למדנו את המושגים הבסיסיים של אפאצ'י גאודה מערכת אקולוגית. בדקנו משימות פשוטות עם סוגים סטנדרטיים ומותאמים אישית, אזורים משוכפלים ומחולקים ותמיכה ב- oql and function.

וכמו תמיד, כל הדוגמאות הללו זמינות ב- GitHub.


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