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

פותח על ידי Danga Interactive לשיפור ביצועי האתר ב- LiveJournal.com, הארכיטקטורה המבוזרת של Memcached תומכת כיום בהרחבה אקספוננציאלית של יישומי רשת חברתיים כמו טוויטר, פייסבוק וויקיפדיה. במדריך זה בן שני חלקים, Sunil Patil מציגה את ארכיטקטורת ה- hashtable המבוזרת של Memcached ותתחיל להשתמש בה למטמון נתונים עבור יישומי ארגוני Java מבוססי מסד נתונים משלך.

הדרכה זו מציגה בפניך את השימוש ב- Memcached לשיפור הביצועים של יישומי Java ארגוניים. המחצית הראשונה מתחילה בסקירה של ארכיטקטורות המטמון של Java במטמון, לעומת הארכיטקטורה של Memcached. אנו גם נתקין את Memcached במחשב שלך ואציג בפניך את ההתקנה ואת הפקודות לעבודה עם Memcached דרך Telnet. במחצית השנייה נפתח תוכנית לקוח "Hello Memcached" בג'אווה, בה נשתמש בכדי להסתכל מתחת למכסה המנוע של לקוח מסודר. תוכלו ללמוד גם על השימוש ב- Memcached כדי להפחית את העומס על שרת מסד הנתונים, ולהשתמש בו במטמון לסימון עמודים שנוצר באופן דינמי. לבסוף, נשקול כמה אפשרויות מתקדמות להגדרת תצורה של לקוחות ספיממט.

מידע נוסף על אחסון במטמון Java ב- JavaWorld

  • ראה "ארכיטקטורות איזון עומסי שרתים, חלק 1: איזון עומסים ברמת התחבורה" לדיון מעמיק יותר על מטמון מבוזר עם Memcached.
  • ראה גם "פרוייקטים של קוד פתוח של Java: Java Caching System" כדי ללמוד על מטמון Java מסורתי.

סקירה כללית של ארכיטקטורות המטמון של Memcached ו- Java

מסגרות מטמון של Java כמו EHCache ו- OSCache הן בעצם HashMapאובייקטים בקוד היישום שלך. בכל פעם שתוסיף אובייקט חדש למטמון הוא יישמר בזיכרון היישום שלך. אסטרטגיה זו עובדת מצוין לאחסון כמויות קטנות של נתונים, אך היא אינה עובדת במטמון של יותר ממספר ג'יגה-בתים (GB). מעצבי שרת Memcached נקטו בגישה ארכיטקטונית מבוזרת, המאפשרת יכולת הרחבה של המערכת. כתוצאה מכך, אתה יכול להשתמש ב- Memcached כדי לשמור במטמון כמות עצומה של נתונים.

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

אם יש לך ניסיון בעבודה על יישומי אינטרנט של Java EE, רוב הסיכויים שהשתמשת בעבר במסגרת קוד פתוח של מטמון Java כגון EHCache או OSCache. ייתכן שהשתמשת גם במסגרת מטמון מסחרית שנשלחה כחלק משרת היישומים שלך, כגון DynaCache (המשלח עם IBM WebSphere Application Server) או JBoss Cache (המשלח עם JBoss AS). לפני שנכנס לחלק הלמידה המעשי של מדריך זה, חשוב להבין במה Memcached שונה ממסגרות המטמון המסורתיות של Java.

שימוש במטמון Java מסורתי

השימוש במסגרת מטמון Java מסורתית הוא די קל, לא משנה אם תבחר באופציה קוד פתוח או מסחרי. עבור מסגרת קוד פתוח כגון EHCache או OSCache, יהיה עליך להוריד את הבינאריות ולהוסיף קבצי JAR נחוצים לשביל הכיתה של היישום שלך. ייתכן שיהיה עליך ליצור קובץ תצורה, שבו תשתמש כדי להגדיר את גודל המטמון, פריקת הדיסק וכן הלאה. עבור מסגרת מטמון שהגיעה יחד עם שרת יישומים, בדרך כלל לא תצטרך להוריד שום JAR נוספים מכיוון שהם ישולבו יחד עם התוכנה.

לאחר הוספת תמיכה למסגרת המטמון ביישום שלך, תוכל להתחיל להשתמש בה על ידי יצירת CacheManagerאובייקט וקבלת והגדרת ערכי מטמון בו. מתחת למכסה המנוע, מסגרת המטמון תיצור את CacheManagerהאובייקטים באותו JVM שבו היישום שלך פועל. בכל פעם שהוספת ערך מטמון, אובייקט זה יתווסף גם לסוג של hashtable שמתוחזק על ידי מסגרת המטמון.

אם שרת היישומים שלך פועל במספר צמתים, ייתכן שתרצה גם תמיכה במטמון מבוזר. במערכת מטמון מבוזרת, כאשר אתה מוסיף אובייקט במטמון ב- AppServer1, אובייקט זה זמין גם ב- AppServer2 וב- AppServer3. מטמונות Java מסורתיים משתמשים בשכפול לצורך אחסון במטמון מבוזר, כלומר כאשר אתה מוסיף ערך מטמון ב- AppServer1 הוא משוכפל אוטומטית לשרתי האפליקציות האחרים במערכת שלך. כתוצאה מכך, הערך יהיה זמין בכל הצמתים שלך.

באמצעות Memcached

על מנת להשתמש ב- Memcached לצורך אחסון במטמון עליך ראשית להוריד ולהתקין את שרת Memcached לפלטפורמה שבחרת. לאחר התקנת שרת Memcached הוא יקשיב ליציאת TCP או UDP לשיחות במטמון.

לאחר מכן, תוריד לקוח Java עבור Memcached ותוסיף את ה- JAR של הלקוח ליישום שלך. לאחר מכן, תוכל ליצור אובייקט לקוח Memcached ולהתחיל להתקשר לשיטה שלו כדי להשיג ולהגדיר ערכי מטמון. כאשר אתה מוסיף אובייקט למטמון, לקוח Memcached ייקח את האובייקט הזה, יסדר אותו בסידור, וישלח מערך בתים לשרת Memcached לאחסון. בנקודה זו, האובייקט במטמון עשוי להיות אשפה שנאספה מה- JVM שבו פועלת היישום שלך.

כאשר אתה זקוק לאובייקט השמור הזה, אתה יכול להתקשר get()לשיטת הלקוח Memcached . הלקוח ייקח את getהבקשה, יעבור סדרת סדר וישלח אותה לשרת Memcached. שרת Memcached ישתמש בבקשה לחיפוש האובייקט מהמטמון. ברגע שיש לו את האובייקט, הוא יחזיר את מערך הבתים ללקוח Memcached. אובייקט הלקוח Memcached ייקח את מערך הבתים ויבטל את הערעור מחדש כדי ליצור את האובייקט ולהחזיר אותו ליישום שלך.

גם אם היישום שלך פועל ביותר משרת יישומים אחד, כולם יכולים להצביע על אותו שרת Memcached ולהשתמש בו להשגה ולהגדרת ערכי מטמון. אם יש לך יותר משרת Memcached אחד, השרתים לא יידעו זה על זה. במקום זאת, תגדיר את לקוח ה- Memcached שלך כך שהוא מכיר את כל שרתי ה- Memcached הזמינים. לדוגמה, אם היישום שלך יוצר אובייקט Java ב- AppServer1 וקורא set()לשיטת Memcached, אז הלקוח Memcached יבין לאיזה שרת Memcached הערך עובר. לאחר מכן הוא יתחיל לתקשר עם שרת Memcached בלבד. כמו כן, כאשר הקוד שלך ב- AppServer2 או AppServer3 ינסה לערוך get, הלקוח Memcached יבין תחילה באיזה שרת הערך מאוחסן, ואז יתקשר עם השרת הזה בלבד.

לוגיקה של לקוח ממוחשב

בתצורת ברירת המחדל שלו, לקוח Memcached משתמש בהיגיון פשוט מאוד כדי לבחור את השרת לצורך פעולת get or set. כאשר אתה מבצע שיחה get()או set()שיחה, הלקוח לוקח את מקש המטמון ומתקשר hashCode()לשיטה שלו כדי לקבל מספר שלם כגון 11. ואז הוא לוקח את המספר הזה ומחלק אותו במספר שרתי Memcached הזמינים, נניח שניים. לאחר מכן לוקח את הערך של השאר, שהוא 1 במקרה זה. ערך המטמון יעבור לשרת Memcached 1. אלגוריתם פשוט זה מבטיח שלקוח Memcached בכל אחד משרתי היישומים שלך תמיד יבחר באותו שרת עבור מפתח מטמון נתון.

מתקין את Memcached

Memcached פועל ב- Unix, Linux, Windows ו- MacOSX. באפשרותך להוריד את המקור של Memcached ולקמפל אותו או להוריד את הבינאריות שערכו מישהו אחר ולהשתמש בהם להתקנת Memcached. כאן אעבור על תהליך הורדת הבינאריות לפלטפורמה שבחרת; ראה משאבים אם אתה מעדיף לקמפל ממקור.

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

  1. קוד Jellycan כולל גרסה שונה של Memcached שקל ויעיל לעבוד איתה. התחל כאן על ידי הורדת קובץ ה- ZIP בינארי win32
  2. הרחב Memcached--win32-bin.zipאת הדיסק הקשיח שלך. שים לב שכל מה שהוא מכיל הוא memcached.exe. הפעל קובץ זה להפעלת שרת Memcached.
  3. כעת בצע memcached.exe -d installלרישום memcached.exe כשירות. תוכל להשתמש במסוף השירותים כדי להפעיל ולעצור את שרת Memcached.

התחלה / עצירה של CL

נסה להפעיל ולעצור את שרת Memcached משורת הפקודה במקום מלוח השירותים. פעולה זו תעניק לך יותר גמישות לנסות אפשרויות שורת פקודה שונות ולהבין את התצורה הטובה ביותר האפשרית לדרישותיך.

כאשר אתה מבצע את האפשרות memcached.exeללא כל שורת פקודה, כברירת מחדל שרת Memcached יתחיל ביציאה 11211 עם זיכרון של 64 מגה בייט. במקרים מסוימים ייתכן שתרצה לקבל שליטה מפורטת יותר בתצורה. לדוגמא, נניח שיציאה 11211 משמשת תהליך כלשהו אחר במחשב שלך ואתה רוצה ששרת Memcached ישתמש ביציאה 12000; או אם הייתם מפעילים שרת Memcached בסביבת QA או בסביבת ייצור, הייתם רוצים לתת לו יותר זיכרון מאשר ברירת המחדל של 64 מגה בייט. במקרים אלה תוכל להשתמש באפשרויות שורת פקודה כדי להתאים אישית את התנהגות השרת. ביצוע memcache.exe -helpהפקודה יניב רשימה מלאה של אפשרויות שורת פקודה כמו אלה המוצגות באיור 3.

התחבר עם Memcached דרך Telnet

לאחר הפעלת שרת Memcached הוא מקשיב ליציאה שהקצית לו. לקוח Memcached מתחבר לשרת ביציאת TCP או UDP, שולח פקודות ומקבל תגובות ובסופו של דבר סוגר את החיבור. (ראה משאבים לפרטים על הפרוטוקול שהלקוח משתמש בו כדי לתקשר עם השרת.)

אתה יכול להתחבר לשרת Memcached שלך במגוון דרכים. אם אתה משתמש בלקוח Java, כפי שנעשה במחצית השנייה של הדרכה זו, תוכל לגשת לממשק API פשוט לאחסון ולקבלת אובייקטים מהמטמון. לחלופין, תוכל להשתמש בלקוח Telnet כדי להתחבר ישירות לשרת. לדעת כיצד להשתמש בלקוח Telnet כדי לתקשר עם שרת Memcached חשוב לניפוי באגים בלקוח Java, לכן נתחיל שם.

פקודות Telnet

ראשית תצטרך להשתמש בלקוח Telnet על פי בחירתך כדי להתחבר לשרת Memcached. במחשב Windows XP, אתה יכול פשוט לבצע telnet localhost 11211בהנחה ששרת Memcached פועל על אותה מכונה ומקשיב ליציאת ברירת המחדל 11211. הפקודות הבאות חיוניות לעבודה עם Memcached דרך Telnet:

  • setמוסיף פריט חדש למטמון. הקריאה היא: Set . באפשרותך להקליד את הערך בפועל שיש לאחסן בשורה הבאה. אם אינך רוצה שתוקף המטמון יפוג, הזן 0 כערך.
  • getמחזירה את ערך מפתח המטמון. השתמש get בכדי לקבל את הערך של keyName.
  • addמוסיף מפתח חדש רק אם הוא עדיין לא קיים. לדוגמה:add
  • replaceיחליף ערך רק אם המפתח קיים. לדוגמה:replace
  • deleteמוחק את ערך המטמון עבור המפתח. אתה יכול להשתמש בשיחה delete כדי למחוק את הערך של ה- keyName.

צילום המסך באיור 4 מייצג אינטראקציה לדוגמא עם שרת Memcached דרך Telnet. כפי שאתה יכול לראות, שרת Memcached מספקת משוב לכל פקודה, כגון STORED, NOT_STOREDוכן הלאה.

מסקנה לחלק 1

עד כה דנו בקצרה בהבדלים בין הארכיטקטורה המבוזרת של Memcached לבין מערכות מטמון Java מסורתיות יותר. הגדרנו גם יישום Memcached בסביבת הפיתוח שלך, והתאמנת להתחבר ל- Memcached דרך Telnet. בחלק הבא של מדריך זה נשתמש בקובץ ה- java לקוח Java כדי להגדיר פתרון מטמון מבוזר ליישום Java לדוגמה. בתהליך תלמד הרבה יותר על Memcached וכיצד הוא יכול לשפר את הביצועים של יישומי Java EE שלך.

Sunil Patil הוא אדריכל Java EE העובד עבור טכנולוגיית Avnet בסן פרנסיסקו, קליפורניה. הוא מחברם של Java Portlets 101 (SourceBeat, אפריל 2007) וכתב מאמרים רבים שפורסמו על ידי JavaWorld, IBM DeveloperWorks ו- O'Reilly Media. מלבד היותו מפתח יישומי שרת פורטל WebSphere מוסמך של IBM ומנהל, הוא מתכנת Java מוסמך של חברת Sun Microsystems, מפתח רכיבי אינטרנט ומפתח רכיבים עסקיים. תוכלו לצפות בבלוג של Sunil בכתובת //www.webspherenotes.com.