interhost

הבלוג
הכל על שרתים, תקשורת ולינוקס

ארכיון פוסטים מהחודש "מאי, 2011"

עבודה עם mysql-proxy

יום ראשון, 1 במאי, 2011

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

כאשר שרת ה-MySQL  אינו עומד בעומס אנחנו יכולים להוסיף שרת נוסף והפתרון לכך הוא שימוש במנגנון ה-Replication הוותיק. המנגנון מבצע סנכרון של הנתונים מהמסד הראשי (Master) לשרת המשני (או שרת "עבד", באנגלית Slave).

אצא מנקודת הנחה שכבר יש לפניכים שני שרתי MySQL עם רפליקציה מוגדרת בתצורת master-slave, אוקי אז ההגדרה די פשוטה ומהירה.

ישנן מספר עובדות שאנחנו יודעים:

  1. שהרפליקציה עובדת בצורה חד-כיוונית, ז"א שכל כתיבה לשרת Master עוברת לשרת ה-Slave.
  2. הכתיבה יכולה להתבצע אך ורק לשרת ה-Master בלבד.
  3. קריאות מהמסד יכולות להתבצע משני השרתים, הן מהראשי והן מהמשני.

מצויידים בידע זה עלינו לבצע שינויים בקוד (באפליקציה) ע"מ לנתב את כל שאילתות הכתיבה רק למאסטר ואת שאילתות הקריאה לשניהם (או לרק לסלייב).

סיטואציה זו מצריכה שינויים בקוד ולעיתים אף שינויים גדולים מה גם שאם נרצה לבצע הפניה של שאילתות קריאה לשני השרתים יהיה עלינו לבצע מנגנון Load Balancing קטן ברמת הקוד או ברמת ה-DNS.

אפשר כמובן לרכוש מערכת Load-Balancing יקרה שתעשה בשבילו את העבודה או שאפשר להשתמש בכלי חינמי שנתמך על ידי MySQL שנקרא "mysql-proxy".

הכלי רץ כסרוויס על השרת, רצוי להתקין אותו על שרת האפליקציה או שרת אחר שאין בו MySQL – ע"מ שלא יווצרו התנגשויות כי הוא גם מאזין בפורט 3306 (כמובן שזה גם ניתן לשינוי).

את ה-mysql-proxy יש להריץ עם פלאגין שנקרא rw-splitting.lua
בכלל mysql-proxy עובד עם פלאגינים בשפת LUA (זוכרים אותה מ-mod_magnet?)

מה שבעצם mysql-proxy עושה הוא מאזין בפורט של שרת mysql (הוא בעצם "מתחזה" לשרת mysql בעצמו) ומעביר את הפניות עליו לשרתים שהגדרנו בשורת ההרצה.

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

להלן הסינטקס לדוגמא להפעלת mysql-proxy:

mysql-proxy –proxy-backend-addresses=master.mysql-server.com:3306 –proxy-read-only-backend-addresses=slave.mysql-server.com:3306 –proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua –proxy-address=0.0.0.0:3306 –admin-address=127.0.0.1:4041

בכחול מסומן הפרמטר שבו מגדירים את שרת ה-Master ובירוק סלט מסומן הפרמטר שבו מגדירים את השרתים לקריאה בלבד שהם שרתי ה-Slave.

כמו כן בירוק קהה מסומן הפרמטר שטוען את הפלאגין rw-splitting שיודע לנתב את השאילתות לפי סוגן.

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

כל מה שנותר הוא לעדכן בקוד את כתובת השרת mysql-proxy כשרת ה-mysql שלנו.