במאמר הזה מתוארות כמה ארכיטקטורות שמספקות זמינות גבוהה (HA) לפריסות של PostgreSQL ב- Google Cloud. זמינות גבוהה היא מדד לחוסן של המערכת בתגובה לכשל בתשתית הבסיסית. במסמך הזה, המונח HA מתייחס לזמינות של אשכולות PostgreSQL בתוך אזור יחיד בענן או בין כמה אזורים, בהתאם לארכיטקטורת ה-HA.
המסמך הזה מיועד לאדמינים של מסדי נתונים, לארכיטקטים של ענן ולמהנדסי DevOps שרוצים ללמוד איך לשפר את האמינות של רמת הנתונים ב-PostgreSQL על ידי שיפור זמן הפעולה הכולל של המערכת. במאמר הזה נסביר על מושגים שרלוונטיים להרצת PostgreSQL ב-Compute Engine. במאמר לא מוסבר איך להשתמש במסדי נתונים מנוהלים כמו Cloud SQL ל-PostgreSQL ו-AlloyDB ל-PostgreSQL.
אם מערכת או אפליקציה דורשות מצב מתמשך כדי לטפל בבקשות או בעסקאות, שכבת התמדת הנתונים (שכבת הנתונים) צריכה להיות זמינה כדי לטפל בהצלחה בבקשות לשאילתות נתונים או לשינויים בנתונים. השבתה בשכבת הנתונים מונעת מהמערכת או מהאפליקציה לבצע את המשימות הנדרשות.
בהתאם ליעדים למדידת רמת השירות (SLO) של המערכת, יכול להיות שתצטרכו ארכיטקטורה שתספק רמת זמינות גבוהה יותר. יש יותר מדרך אחת להשיג זמינות גבוהה, אבל באופן כללי, אתם מקצים תשתית מיותרת שאפשר לגשת אליה במהירות מהאפליקציה.
במסמך הזה מפורטים הנושאים הבאים:
- הגדרות של מונחים שקשורים למושגים של מסדי נתונים עם זמינות גבוהה.
- אפשרויות לטופולוגיות של PostgreSQL עם זמינות גבוהה.
- מידע הקשרי שיעזור לכם לשקול כל אחת מהאפשרויות לארכיטקטורה.
הסברים על המונחים
המונחים והקונספטים הבאים הם סטנדרטיים בתעשייה, והם שימושיים להבנה למטרות שחורגות מההיקף של המסמך הזה.
- רפליקציה
-
התהליך שבו טרנזקציות של כתיבה (
INSERT,UPDATEאוDELETE) ושינויים בסכימה (שפת הגדרת נתונים (DDL)) מתועדים באופן מהימן, נרשמים ביומן ולאחר מכן מוחלים באופן סדרתי על כל הצמתים של העותקים המשוכפלים של מסד הנתונים במורד הזרם בארכיטקטורה. - צומת ראשי
- הצומת שמספק קריאה עם המצב העדכני ביותר של נתונים שנשמרו. כל פעולות הכתיבה במסד הנתונים צריכות להיות מופנות לצומת ראשי.
- צומת רפליקה (משני)
- עותק אונליין של צומת מסד הנתונים הראשי. השינויים משוכפלים באופן סינכרוני או אסינכרוני לצמתי העתקים מצומת ראשי. אפשר לקרוא מתוך צמתי רפליקה, אבל צריך להבין שהנתונים עשויים להתעדכן באיחור קל בגלל פרק הזמן מהחשיפה להמרה.
- פרק הזמן שחלף מאז השכפול
- מדידה, במספר רצף יומן (LSN), במזהה עסקה או בזמן. העיכוב בשכפול מבטא את ההבדל בין המועד שבו פעולות שינוי מוחלות על הרפליקה לבין המועד שבו הן מוחלות על הצומת הראשי.
- העברה רציפה לארכיון
- גיבוי מצטבר שבו מסד הנתונים שומר ברציפות עסקאות עוקבות בקובץ.
- יומן כתיבה מראש (WAL)
- יומן WAL הוא קובץ יומן שמתעד שינויים בקובצי נתונים לפני שהשינויים מבוצעים בפועל בקבצים. במקרה של קריסת שרת, WAL היא דרך סטנדרטית להבטיח את תקינות הנתונים ועמידות הכתיבות.
- רשומת WAL
- רשומה של עסקה שחלה על מסד הנתונים. רשומת WAL מעוצבת ומאוחסנת כסדרה של רשומות שמתארות שינויים ברמת הדף בקובץ הנתונים.
- מספר סידורי ביומן (LSN)
- עסקאות יוצרות רשומות WAL שמצורפות לקובץ ה-WAL. המיקום שבו מתבצעת ההוספה נקרא מספר סידורי ביומן (LSN). זהו מספר שלם בן 64 ביט, שמיוצג כשני מספרים הקסדצימליים שמופרדים על ידי קו נטוי (XXXXXXXX/YYZZZZZZ). האות Z מייצגת את מיקום ההיסט בקובץ ה-WAL.
- קבצים של פלחים
- קבצים שמכילים כמה שיותר רשומות WAL, בהתאם לגודל הקובץ שהגדרתם. לשמות של קובצי פלחים יש עלייה מונוטונית, וגודל הקובץ המוגדר כברירת מחדל הוא 16MB.
- שכפול סינכרוני
-
סוג של רפליקציה שבו השרת הראשי מחכה שהרפליקה תאשר שהנתונים נכתבו
ב-transaction log של הרפליקה לפני שהוא מאשר את השמירה ללקוח. כשמריצים שכפול סטרימינג, אפשר להשתמש באפשרות
synchronous_commitשל PostgreSQL, שעוזרת להבטיח עקביות בין השרת הראשי לבין הרפליקה. - שכפול אסינכרוני
- סוג של שכפול שבו השרת הראשי לא מחכה שהרפליקה תאשר שהטרנזקציה התקבלה בהצלחה לפני שהוא מאשר את השמירה ללקוח. ההשהיה בשכפול אסינכרוני נמוכה יותר בהשוואה לשכפול סינכרוני. עם זאת, אם השרת הראשי קורס והטרנזקציות שאושרו בו לא מועברות לרפליקה, יש סיכוי לאובדן נתונים. שכפול אסינכרוני הוא מצב השכפול שמוגדר כברירת מחדל ב-PostgreSQL, באמצעות העברת יומנים מבוססת-קובץ או שכפול סטרימינג.
- העברת יומנים מבוססת-קבצים
- שיטת רפליקציה ב-PostgreSQL שמעבירה את קובצי פלחי ה-WAL משרת מסד הנתונים הראשי אל הרפליקה. השרת הראשי פועל במצב ארכיון רציף, וכל שירות המתנה פועל במצב שחזור רציף כדי לקרוא את קובצי ה-WAL. סוג השכפול הזה הוא אסינכרוני.
- רפליקציה של סטרימינג
- שיטת רפליקציה שבה הרפליקה מתחברת למקור ומקבלת באופן רציף רצף של שינויים. העדכונים מגיעים דרך זרם, ולכן השיטה הזו מאפשרת לשמור על הרפליקה מעודכנת יותר בהשוואה לרפליקציה של יומני רישום. למרות שהשכפול הוא אסינכרוני כברירת מחדל, אפשר גם להגדיר שכפול סינכרוני.
- שכפול פיזי של סטרימינג
- שיטת שכפול שמעבירה שינויים לרפליקה. בשיטה הזו נעשה שימוש ברשומות WAL שמכילות את השינויים בנתונים הפיזיים בצורה של כתובות של בלוקים בדיסק ושינויים ברמת הבייט.
- שכפול לוגי של סטרימינג
- שיטת רפליקציה שמתעדת שינויים על סמך זהות הרפליקציה שלהם (מפתח ראשי), ומאפשרת יותר שליטה באופן הרפליקציה של הנתונים בהשוואה לרפליקציה פיזית. בגלל ההגבלות בשכפול לוגי ב-PostgreSQL, שכפול לוגי של סטרימינג דורש הגדרה מיוחדת עבור הגדרת זמינות גבוהה (HA). במדריך הזה נדון בשכפול פיזי רגיל, ולא בשכפול לוגי.
- זמן פעולה תקינה
- אחוז הזמן שבו מקור מידע פועל ויכול לספק תגובה לבקשה.
- זיהוי כשלים
- התהליך של זיהוי כשל בתשתית.
- יתירות כשל
- התהליך של העלאה בדרגה של תשתית הגיבוי או ההמתנה (במקרה הזה, צומת הרפליקה) כדי שתהפוך לתשתית הראשית. במהלך יתירות כשל, צומת הרפליקה הופך לצומת הראשי.
- מעבר
- תהליך ההפעלה של מעבר ידני לגיבוי במערכת ייצור. החלפה בין צמתים בודקת אם המערכת פועלת בצורה תקינה, או מוציאה את הצומת הראשי הנוכחי מהאשכול לצורך תחזוקה.
- יעד משך ההתאוששות (RTO)
- המשך הזמן שחלף בזמן אמת עד להשלמת תהליך המעבר לגיבוי (failover) של שכבת הנתונים. RTO תלוי בכמות הזמן שמקובלת מנקודת מבט עסקית.
- יעד להתאוששות מאסון (RPO)
- כמות אובדן הנתונים (בזמן אמת שחלף) שרמת הנתונים יכולה לשאת כתוצאה מיתירות כשל. ה-RPO תלוי בכמות אובדן הנתונים שמקובלת מנקודת מבט עסקית.
- חלופי
- התהליך של החזרת הצומת הראשי הקודם אחרי שהתנאי שגרם למעבר לגיבוי תוקן.
- תיקון עצמי
- היכולת של מערכת לפתור בעיות ללא פעולות חיצוניות של מפעיל אנושי.
- חלוקת רשת למחיצות
- תנאי שמתקיים כששני צמתים בארכיטקטורה – למשל הצומת הראשי והצומת המשוכפל – לא יכולים לתקשר אחד עם השני ברשת.
- מוח חצוי
- מצב שמתרחש כששני צמתים מאמינים בו-זמנית שהם הצומת הראשי.
- קבוצת צמתים
- קבוצה של משאבי מחשוב שמספקים שירות. במסמך הזה, השירות הזה הוא רמת שימור הנתונים.
- צומת עדים או צומת קוורום
- משאב נפרד של מחשוב שעוזר לקבוצת צמתים לקבוע מה לעשות כשמתרחש מצב של פיצול מוח.
- בחירות מקדימות או בחירות לראשות המפלגה
- התהליך שבו קבוצה של צמתים עם מודעות לעמיתים, כולל צמתים של עדים, קובעת איזה צומת צריך להיות הצומת הראשי.
מתי כדאי לשקול ארכיטקטורת HA
ארכיטקטורות HA מספקות הגנה משופרת מפני השבתה של שכבת הנתונים בהשוואה להגדרות של מסד נתונים עם צומת יחיד. כדי לבחור את האפשרות הכי טובה לתרחיש השימוש בעסק, צריך להבין מהי הסבילות שלכם להשבתה, ואת היתרונות והחסרונות של הארכיטקטורות השונות.
כדאי להשתמש בארכיטקטורת HA כשרוצים לספק זמן פעולה משופר של רמת הנתונים כדי לעמוד בדרישות האמינות של עומסי העבודה והשירותים. אם הסביבה שלכם יכולה לסבול כמות מסוימת של זמן השבתה, ארכיטקטורה של זמינות גבוהה עלולה להוסיף עלויות ומורכבות מיותרות. לדוגמה, בסביבות פיתוח או בדיקה, בדרך כלל לא נדרשת זמינות גבוהה של רמת מסד הנתונים.
הגדרת הדרישות לזמינות גבוהה
הנה כמה שאלות שיעזרו לכם להחליט איזו אפשרות של PostgreSQL HA הכי מתאימה לעסק שלכם:
- מהי רמת הזמינות שאתם רוצים להשיג? האם נדרשת לך אפשרות שתאפשר לשירות שלך להמשיך לפעול רק במהלך אזור יחיד או כשל אזורי מלא? חלק מהאפשרויות לזמינות גבוהה מוגבלות לאזור מסוים, ואחרות יכולות להיות במספר אזורים.
- אילו שירותים או לקוחות מסתמכים על רמת הנתונים שלכם, ומה העלות לעסק שלכם אם יש זמן השבתה ברמת הנתונים? אם שירות מיועד רק ללקוחות פנימיים שצריכים להשתמש במערכת מדי פעם, סביר להניח שדרישות הזמינות שלו נמוכות יותר מאלה של שירות שפונה ללקוחות קצה ומשרת אותם באופן רציף.
- מה התקציב התפעולי שלך? העלות היא שיקול חשוב: כדי לספק זמינות גבוהה, סביר להניח שהעלויות של התשתית והאחסון יגדלו.
- עד כמה התהליך צריך להיות אוטומטי, וכמה מהר צריך לבצע מעבר לגיבוי? (מהו ה-RTO שלך?) אפשרויות ה-HA משתנות בהתאם למהירות שבה המערכת יכולה לבצע יתירות כשל ולחזור להיות זמינה ללקוחות.
- האם אתם יכולים להרשות לעצמכם לאבד נתונים כתוצאה ממעבר לגיבוי? (מהו ה-RPO שלך?) בגלל האופי המבוזר של טופולוגיות HA, יש פשרה בין זמן האחזור של ביצוע פעולות (commit) לבין הסיכון לאובדן נתונים בגלל כשל.
איך HA עובד
בקטע הזה מתוארים שכפול סטרימינג ושכפול סטרימינג סינכרוני, שהם הבסיס לארכיטקטורות של זמינות גבוהה ב-PostgreSQL.
שכפול בסטרימינג
שכפול סטרימינג הוא גישה לשכפול שבה הרפליקה מתחברת למקור ומקבלת באופן רציף זרם של רשומות WAL. בהשוואה לשכפול של יומני רישום, שכפול של סטרימינג מאפשר לרפליקה להישאר מעודכנת יותר עם הראשי. PostgreSQL מציע שכפול סטרימינג מובנה החל מגרסה 9. בהרבה פתרונות לזמינות גבוהה של PostgreSQL נעשה שימוש בשכפול סטרימינג מובנה כדי לספק את המנגנון לשמירה של כמה צמתי העתקה של PostgreSQL מסונכרנים עם הצומת הראשי. בהמשך המאמר, בקטע ארכיטקטורות של זמינות גבוהה ב-PostgreSQL, נסביר על כמה מהאפשרויות האלה.
כל צומת רפליקה דורש משאבי מחשוב ואחסון ייעודיים. תשתית צומת הרפליקה נפרדת מהתשתית הראשית. אפשר להשתמש בצמתי העתקה כגיבוי פעיל כדי להציג שאילתות לקוח לקריאה בלבד. הגישה הזו מאפשרת איזון עומסים של שאילתות לקריאה בלבד בין השרת הראשי לבין עותק אחד או יותר.
שכפול סטרימינג הוא אסינכרוני כברירת מחדל. השרת הראשי לא ממתין לאישור מהרפליקה לפני שהוא מאשר את ביצוע העסקה ללקוח. אם מתרחשת כשל בשרת הראשי אחרי שהוא מאשר את העסקה, אבל לפני שהרפליקה מקבלת את העסקה, רפליקציה אסינכרונית עלולה לגרום לאובדן נתונים. אם הרפליקה קודמה והפכה לשרת ראשי חדש, עסקה כזו לא תופיע.
שכפול סינכרוני של סטרימינג
אפשר להגדיר שכפול בסטרימינג כסינכרוני על ידי בחירה של רפליקה אחת או יותר שתהיה רפליקת המתנה סינכרונית. אם מגדירים את הארכיטקטורה לשכפול סינכרוני, השרת הראשי לא מאשר את ביצוע העסקה עד שהרפליקה מאשרת את התמדת העסקה. שכפול סינכרוני של נתונים בזמן אמת מספק עמידות משופרת בתמורה לזמן טעינה ארוך יותר של טרנזקציות.
אפשרות ההגדרה synchronous_commit מאפשרת גם להגדיר את רמות העמידות המתקדמות הבאות של הרפליקה עבור העסקה:
-
local: רפליקות במצב המתנה סינכרוני לא מעורבות באישור של ביצוע הפעולה. השרת הראשי מאשר את ביצוע העסקאות אחרי שרשומות ה-WAL נכתבות ומועברות לדיסק המקומי שלו. התחייבויות לעסקאות בשרת הראשי לא כוללות רפליקות במצב המתנה. עסקאות עלולות להיכשל אם יש כשל בשרת הראשי. -
on[ברירת מחדל]: העתקים משניים במצב המתנה סינכרוני כותבים את העסקאות שאושרו ב-WAL שלהם לפני שהם שולחים אישור לעותק הראשי. השימוש בהגדרהonמבטיח שהעסקה תאבד רק אם העותק הראשי וכל העותקים הסינכרוניים של הגיבוי יסבלו מכשלים בו-זמניים באחסון. השכפולים שולחים אישור רק אחרי שהם כותבים רשומות WAL, ולכן לקוחות שמבצעים שאילתות בשכפול לא יראו שינויים עד שהרשומות המתאימות של WAL יוחלו על מסד הנתונים של השכפול. -
remote_write: עותקים משוכפלים במצב המתנה סינכרוני מאשרים את קבלת רשומת ה-WAL ברמת מערכת ההפעלה, אבל הם לא מבטיחים שרשומת ה-WAL נכתבה לדיסק. מכיוון שהפונקציהremote_writeלא מבטיחה שה-WAL נכתב, יכול להיות שהטרנזקציה תאבד אם תהיה תקלה גם בשרת הראשי וגם בשרת המשני לפני שהרשומות ייכתבו.remote_writeהוא בעל עמידות נמוכה יותר בהשוואה לאפשרותon. -
remote_apply: רפליקות במצב המתנה סינכרוני מאשרות את קבלת העסקה ואת ההחלה שלה על מסד הנתונים לפני שהן מאשרות את ביצוע העסקה ללקוח. השימוש בהגדרהremote_applyמבטיח שהעסקה תישמר ברפליקה, ושתוצאות השאילתות של הלקוח יכללו באופן מיידי את ההשפעות של העסקה. remote_applyמספק עמידות ועקביות גבוהות יותר בהשוואה ל-onול-remote_write.
אפשרות ההגדרה synchronous_commit פועלת עם אפשרות ההגדרה synchronous_standby_names שמציינת את רשימת השרתים במצב המתנה שמשתתפים בתהליך השכפול הסינכרוני. אם לא מציינים שמות של שרתים במצב המתנה סינכרוני, אישור העסקאות לא מתבצע עד שהשכפול מסתיים.
ארכיטקטורות של HA ב-PostgreSQL
ברמה הבסיסית ביותר, זמינות גבוהה של שכבת הנתונים מורכבת מהרכיבים הבאים:
- מנגנון לזיהוי כשל בצומת הראשי.
- תהליך לביצוע יתירות כשל שבו צומת הרפליקה מועלה בדרגה להיות צומת ראשי.
- תהליך לשינוי ניתוב השאילתות כך שבקשות האפליקציה יגיעו לצומת הראשי החדש.
- אופציונלי: שיטה לחזרה לארכיטקטורה המקורית באמצעות צמתים ראשיים וצמתים משוכפלים לפני מעבר לגיבוי בעת כשל, בקיבולות המקוריות שלהם.
בקטעים הבאים מופיעה סקירה כללית של ארכיטקטורות ה-HA הבאות:
- תבנית Patroni
- תוסף ושירות pg_auto_failover
- קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי
פתרונות ה-HA האלה מצמצמים את זמן ההשבתה אם יש תשתית או הפסקה זמנית בשירות אזורית. כשבוחרים בין האפשרויות האלה, צריך לאזן בין זמן האחזור של ביצוע הפעולה לבין העמידות בהתאם לצרכים העסקיים.
היבט קריטי בארכיטקטורת HA הוא הזמן והמאמץ הידני שנדרשים כדי להכין סביבת המתנה חדשה למעבר גיבוי או למעבר חזרה. אחרת, המערכת יכולה לעמוד רק בכשל אחד, והשירות לא מוגן מפני הפרה של הסכם רמת השירות. מומלץ לבחור בארכיטקטורת HA שיכולה לבצע מעבר ידני לגיבוי (failover) או מעבר חזרה (switchover) עם תשתית הייצור.
זמינות גבוהה באמצעות תבנית Patroni
Patroni הוא תבנית תוכנה בוגרת בקוד פתוח (עם רישיון MIT) שמתוחזקת באופן פעיל. התבנית מספקת כלים להגדרה, לפריסה ולהפעלה של ארכיטקטורת HA של PostgreSQL. Patroni מספק מצב אשכול משותף והגדרת ארכיטקטורה שנשמרים בחנות הגדרות מבוזרת (DCS). אפשרויות להטמעה של DCS כוללות את: etcd, Consul, Apache ZooKeeper, או Kubernetes. בתרשים הבא מוצגים הרכיבים העיקריים של אשכול Patroni.

איור 1. דיאגרמה של הרכיבים העיקריים באשכול Patroni.
באיור 1, מאזני העומסים נמצאים מול הצמתים של PostgreSQL, והסוכנים של DCS ו-Patroni פועלים בצמתים של PostgreSQL.
Patroni מריץ תהליך של סוכן בכל צומת PostgreSQL. תהליך הסוכן מנהל את תהליך PostgreSQL ואת ההגדרה של צומת הנתונים. סוכן Patroni מתאם עם צמתים אחרים דרך DCS. תהליך הסוכן של Patroni חושף גם API בארכיטקטורת REST שאפשר לשלוח אליו שאילתות כדי לקבוע את תקינות השירות של PostgreSQL ואת ההגדרה של כל צומת.
כדי לאשר את תפקיד החברות באשכול, הצומת הראשי מעדכן באופן קבוע את מפתח ה-leader ב-DCS. מפתח המנהיג כולל אורך חיים (TTL). אם הזמן שמוגדר ל-TTL חולף בלי עדכון, מפתח ה-leader מוצא מה-DCS, ותהליך בחירת ה-leader מתחיל כדי לבחור מפתח ראשי חדש ממאגר המועמדים.
בתרשים הבא מוצג אשכול תקין שבו צומת א' מעדכן בהצלחה את נעילת הצומת הראשי.

איור 2. תרשים של אשכול תקין.
איור 2 מציג אשכול תקין: צפייה בצומת ב' ובצומת ג' בזמן שצומת א' מעדכן בהצלחה את מפתח המנהל.
זיהוי כשלים
הסוכן Patroni משדר את מצב התקינות שלו באופן רציף על ידי עדכון המפתח שלו ב-DCS. במקביל, הסוכן מאמת את תקינות PostgreSQL. אם הסוכן מזהה בעיה, הוא משבית את הצומת או מוריד את רמת הצומת לרמת רפליקה. כפי שמוצג בתרשים הבא, אם הצומת הפגום הוא הצומת הראשי, מפתח ה-leader שלו ב-DCS יפוג, ותתבצע בחירה חדשה של leader.

איור 3. דיאגרמה של אשכול פגום.
איור 3 מציג אשכול פגום: צומת ראשי מושבת לא עדכן לאחרונה את מפתח ה-leader שלו ב-DCS, והעותקים המשוכפלים שאינם leader מקבלים הודעה שתוקף מפתח ה-leader פג.
במארחי Linux, Patroni מפעיל גם כלב שמירה ברמת מערכת ההפעלה בצמתים ראשיים. טיימר מפקח (watchdog) זה מאזין להודעות keep-alive מתהליך הסוכן של Patroni. אם התהליך לא מגיב והאות 'פעיל' לא נשלח, מנגנון ה-watchdog מפעיל מחדש את המארח. ה-watchdog עוזר למנוע מצב של פיצול מוח, שבו צומת PostgreSQL ממשיך לשמש כצומת ראשי, אבל מפתח ה-leader ב-DCS פג בגלל כשל בסוכן, ונבחר צומת ראשי (leader) אחר.
תהליך המעבר לגיבוי
אם נעילת ה-leader פגה ב-DCS, הצמתים של העותק המשוכפל של המועמד מתחילים בבחירת leader. כאשר רפליקה מגלה שחסר נעילת מנהיג, היא בודקת את מיקום הרפליקציה שלה בהשוואה לרפליקות האחרות. כל רפליקה משתמשת ב-API בארכיטקטורת REST כדי לקבל את מיקומי יומן ה-WAL של צמתי הרפליקה האחרים, כפי שמוצג בדיאגרמה הבאה.

איור 4. תרשים של תהליך המעבר לגיבוי ב-Patroni.
איור 4 מציג שאילתות של מיקום ביומן WAL ותוצאות מתאימות מצמתי העתק פעילים. צומת א' לא זמין, והצמתים התקינים ב' ו-ג' מחזירים זה לזה את אותו מיקום WAL.
הצומת (או הצמתים, אם הם באותו מיקום) הכי עדכני מנסה בו-זמנית לקבל את נעילת ה-leader ב-DCS. עם זאת, רק צומת אחד יכול ליצור את מפתח המנהל ב-DCS. הצומת הראשון שיצליח ליצור את מפתח המנהיג הוא המנצח במירוץ למנהיגות, כפי שמוצג בתרשים הבא. אפשרות אחרת היא להגדיר מועמדים מועדפים ליתירות כשל על ידי הגדרת התג failover_priority בקובצי התצורה.

איור 5. דיאגרמה של המירוץ לראשות הטבלה.
באיור 5 מוצג מירוץ לבחירת מנהיג: שני מועמדים לתפקיד מנהיג מנסים להשיג את נעילת המנהיג, אבל רק אחד משני הצמתים, צומת C, מצליח להגדיר את מפתח המנהיג ולנצח במירוץ.
אחרי שהרפליקה זוכה בבחירות למנהיגות, היא מקודמת להיות הרפליקה הראשית החדשה. החל מהרגע שבו העותק המשוכפל מקודם, השרת הראשי החדש מעדכן את מפתח ה-leader ב-DCS כדי לשמור על נעילת ה-leader, והצמתים האחרים משמשים כעותקים משוכפלים.
Patroni מספק גם את כלי הבקרה patronictl שמאפשר להריץ מעברים כדי לבדוק את תהליך יתירות הכשל של הצמתים.
הכלי הזה עוזר למפעילים לבדוק את הגדרות ה-HA שלהם בסביבת ייצור.
ניתוב שאילתות
תהליך הסוכן של Patroni שפועל בכל צומת חושף נקודות קצה ל-API בארכיטקטורת REST שמגלות את התפקיד הנוכחי של הצומת: ראשי או רפליקה.
| נקודת קצה של REST | קוד החזרה של HTTP אם הוא ראשי | קוד החזרה של HTTP אם מדובר ברפליקה |
|---|---|---|
/primary |
200 |
503 |
/replica |
503 |
200 |
בגלל שבדיקות תקינות רלוונטיות משנות את התגובות שלהן אם צומת מסוים משנה את התפקיד שלו, בדיקת תקינות של מאזן עומסים יכולה להשתמש בנקודות הקצה האלה כדי להודיע על ניתוב תעבורה של צומת ראשי וצומת העתק. פרויקט Patroni מספק תבניות של הגדרות למאזן עומסים כמו HAProxy. מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי יכול להשתמש באותם בדיקות תקינות כדי לספק יכולות דומות.
תהליך חלופי
אם יש כשל בצומת, האשכול נשאר במצב פגום. תהליך הגיבוי של Patroni עוזר לשחזר אשכול HA למצב תקין אחרי מעבר לגיבוי. תהליך הגיבוי מנהל את החזרת האשכול למצב המקורי שלו על ידי הפעלה אוטומטית של הצומת המושפע כרפליקה של האשכול.
לדוגמה, יכול להיות שצומת יופעל מחדש בגלל כשל במערכת ההפעלה או בתשתית הבסיסית. אם הצומת הוא הראשי וההפעלה מחדש שלו נמשכת יותר זמן מ-TTL של מפתח ה-leader, מופעלת בחירת leader, ונבחר צומת ראשי חדש שמועבר לקידום. כשמתחיל תהליך Patroni ראשי לא פעיל, הוא מזהה שאין לו את נעילת ה-leader, מוריד את עצמו אוטומטית לדרגת רפליקה ומצטרף לאשכול בתפקיד הזה.
אם יש כשל בצומת שלא ניתן לשחזר, כמו כשל אזורי לא סביר, צריך להפעיל צומת חדש. מפעיל מסד נתונים יכול להפעיל ידנית צומת חדש, או להשתמש בקבוצת מופעי מכונה מנוהלים (MIG) אזורית עם שמירת מצב עם מספר צמתים מינימלי כדי להפוך את התהליך לאוטומטי. אחרי שיוצרים את הצומת החדש, Patroni מזהה שהצומת החדש הוא חלק מאשכול קיים ומאתחל את הצומת אוטומטית כרפליקה.
זמינות גבוהה באמצעות התוסף והשירות pg_auto_failover
pg_auto_failover הוא תוסף PostgreSQL בקוד פתוח (רישיון PostgreSQL) שנמצא בפיתוח פעיל. התוסף pg_auto_failover מגדיר ארכיטקטורת זמינות גבוהה על ידי הרחבת היכולות הקיימות של PostgreSQL. ל-pg_auto_failover אין תלות בשום דבר מלבד PostgreSQL.
כדי להשתמש בתוסף pg_auto_failover עם ארכיטקטורת HA, צריך לפחות שלושה צמתים, שבכל אחד מהם פועל PostgreSQL עם התוסף. כל אחד מהצמתים יכול להיכשל בלי להשפיע על זמן הפעולה הרציפה של קבוצת מסדי הנתונים. אוסף של צמתים שמנוהלים על ידי pg_auto_failover נקרא formation. בתרשים הבא מוצגת ארכיטקטורת pg_auto_failover.

איור 6. תרשים של ארכיטקטורת pg_auto_failover.
באיור 6 מוצגת ארכיטקטורה של pg_auto_failover שמורכבת משני רכיבים עיקריים: שירות Monitor וסוכן Keeper. הכלי Keeper והכלי Monitor כלולים בתוסף pg_auto_failover.
שירות מעקב
שירות המעקב pg_auto_failover מיושם כתוסף PostgreSQL. כשהשירות יוצר צומת מעקב, הוא מפעיל מופע PostgreSQL עם התוסף pg_auto_failover. השירות Monitor שומר על המצב הגלובלי של הקבוצה, מקבל את סטטוס בדיקת התקינות מצמתי הנתונים של PostgreSQL, ומנהל את הקבוצה באמצעות הכללים שנקבעו על ידי מכונת מצבים סופית (FSM). בהתאם לכללי ה-FSM למעברים בין מצבים, הצומת Monitor מעביר הוראות לצמתי הקבוצה לפעולות כמו קידום, הורדה בדרגה ושינויים בהגדרות.
סוכן Keeper
בכל צומת נתונים של pg_auto_failover, התוסף מפעיל תהליך של סוכן Keeper. תהליך Keeper הזה עוקב אחרי שירות PostgreSQL ומנהל אותו. ה-Keeper שולח עדכוני סטטוס לצומת Monitor, ומקבל ומבצע פעולות שה-Monitor שולח בתגובה.
כברירת מחדל, pg_auto_failover מגדיר את כל צמתי הנתונים המשניים בקבוצה כרפליקות סינכרוניות. מספר העותקים הסינכרוניים שנדרשים לביצוע commit מבוסס על ההגדרה number_sync_standby שקבעתם ב-Monitor.
זיהוי כשלים
סוכני Keeper בצמתי נתונים ראשיים ומשניים מתחברים מעת לעת לצומת Monitor כדי לדווח על המצב הנוכחי שלהם ולבדוק אם יש פעולות שצריך לבצע. צומת המעקב מתחבר גם לצומתי הנתונים כדי לבצע בדיקת תקינות על ידי הפעלת קריאות ל-API של פרוטוקול PostgreSQL (libpq), תוך חיקוי של אפליקציית הלקוח pg_isready() של PostgreSQL. אם אף אחת מהפעולות האלה לא מצליחה אחרי פרק זמן מסוים (30 שניות כברירת מחדל), צומת המעקב קובע שחלה שגיאה בצומת הנתונים. אפשר לשנות את הגדרות התצורה של PostgreSQL כדי להתאים אישית את התזמון של המעקב ואת מספר הניסיונות החוזרים. מידע נוסף זמין במאמר בנושא מעבר לגיבוי כשל וסובלנות תקלות.
אם מתרחש כשל בצומת יחיד, אחד מהתנאים הבאים מתקיים:
- אם צומת הנתונים הלא תקין הוא צומת ראשי, הכלי 'מעקב' מתחיל בהעברה אוטומטית לשירות גיבוי (failover).
- אם צומת הנתונים הלא תקין הוא משני, המוניטור משבית את השכפול הסינכרוני עבור הצומת הלא תקין.
- אם הצומת שנכשל הוא צומת המעקב, אי אפשר לבצע מעבר גיבוי אוטומטי. כדי להימנע מנקודת הכשל הבודדת הזו, צריך לוודא שיש לכם את המעקב הנכון ואת תוכנית ההתאוששות מאסון.
בתרשים הבא מוצגים תרחישי הכשל ומצבי התוצאה שמתוארים ברשימה שלמעלה.

איור 7. דיאגרמה של תרחישי כשל ב-pg_auto_failover.
תהליך המעבר לגיבוי
לכל צומת של מסד נתונים בקבוצה יש את אפשרויות ההגדרה הבאות שקובעות את תהליך המעבר לגיבוי:
-
replication_quorum: אפשרות בוליאנית. אם הערך שלreplication_quorumהואtrue, הצומת נחשב למועמד פוטנציאלי למעבר לגיבוי. -
candidate_priority: ערך שלם מ-0 עד 100. לפרמטרcandidate_priorityיש ערך ברירת מחדל של 50, שאפשר לשנות כדי להשפיע על העדיפות של המעבר לגיבוי. הצמתים מתועדפים כמועמדים פוטנציאליים למעבר לגיבוי (failover) על סמך הערך שלcandidate_priority. לצמתים עם ערךcandidate_priorityגבוה יותר יש עדיפות גבוהה יותר. כדי שתהליך יתירות הכשל יפעל, צריך שלפחות שני צמתים יהיו בעלי עדיפות לא אפסית במועמדות להחלפה בכל מבנה של pg_auto_failover.
אם יש כשל בצומת ראשי, המערכת שוקלת להפוך צמתים משניים לצמתים ראשיים אם יש בהם שכפול סינכרוני פעיל והם חברים ב-replication_quorum.
הקידום של צמתים משניים מתבצע לפי הקריטריונים הבאים:
- צמתים עם העדיפות הגבוהה ביותר
- מצב המתנה עם מיקום יומן ה-WAL המתקדם ביותר שפורסם במוניטור
- בחירה אקראית כשובר שוויון סופי
מועמד ליתירות כשל הוא מועמד עם השהיה אם הוא לא פרסם את מיקום ה-LSN המתקדם ביותר ב-WAL. בתרחיש הזה, pg_auto_failover מתזמן שלב ביניים במנגנון היתירות כשל: המועמד עם הנתונים החסרים מאחור מאחזר את הבייטים החסרים של WAL מצומת גיבוי עם מיקום ה-LSN המתקדם ביותר. לאחר מכן, הצומת במצב המתנה מקודם. מערכת Postgres מאפשרת את הפעולה הזו כי שכפול מדורג מאפשר לכל שרת המתנה לפעול כצומת במעלה הזרם עבור שרת המתנה אחר.
ניתוב שאילתות
pg_auto_failover לא מספק יכולות ניתוב שאילתות בצד השרת.
במקום זאת, pg_auto_failover מסתמך על ניתוב שאילתות בצד הלקוח, שמשתמש במנהל ההתקן הרשמי של PostgreSQL בצד הלקוח, libpq.
כשמגדירים את ה-URI של החיבור, מנהל ההתקן יכול לקבל כמה מארחים במילת המפתח host שלו.
ספריית הלקוח שבה האפליקציה משתמשת צריכה לעטוף את libpq או להטמיע את היכולת לספק כמה מארחים כדי שהארכיטקטורה תתמוך ביתירות כשל אוטומטית מלאה.
תהליכי חזרה למצב ראשוני ומעבר
כש-Keeper מפעיל מחדש צומת שנכשל או מתחיל צומת חלופי חדש, התהליך בודק את צומת המעקב כדי לקבוע את הפעולה הבאה שצריך לבצע. אם צומת שהופעל מחדש אחרי כשל היה הצומת הראשי, והכלי Monitor כבר בחר צומת ראשי חדש בהתאם לתהליך יתירות הכשל, הכלי Keeper מאתחל מחדש את הצומת הראשי הלא פעיל כרפליקה משנית.
pg_auto_failover מספק את הכלי pg_autoctl, שמאפשר להריץ מעברים כדי לבדוק את תהליך יתירות הכשל של הצומת. בנוסף לאפשרות לבדוק את הגדרות ה-HA בסביבת הייצור, הכלי עוזר לשחזר אשכול HA למצב תקין אחרי מעבר לגיבוי.
זמינות גבוהה באמצעות קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי
בקטע הזה מתואר גישה לזמינות גבוהה שמשתמשת ברכיבים הבאים של Google Cloud:
- דיסק לאחסון מתמיד אזורי. כשמשתמשים בדיסקים קשיחים אזוריים, הנתונים משוכפלים באופן סינכרוני בין שני אזורים באזור, כך שלא צריך להשתמש בשכפול סטרימינג. עם זאת, זמינות גבוהה מוגבלת לשני אזורים בדיוק באזור מסוים.
- קבוצות של מופעי מכונה מנוהלים עם שמירת מצב. זוג של קבוצות MIG עם שמירת מצב משמש כחלק ממישור בקרה כדי להפעיל צומת PostgreSQL ראשי אחד. כשקבוצת ה-MIG עם שמירת מצב מפעילה מכונה חדשה, היא יכולה לצרף את דיסק האחסון המתמיד האזורי הקיים. בכל נקודת זמן, רק אחת משתי קבוצות ה-MIG תכלול מופע פעיל.
- Cloud Storage. אובייקט בקטגוריה של Cloud Storage מכיל הגדרה שמציינת איזה מבין שני ה-MIG מפעיל את צומת מסד הנתונים הראשי, ובאיזה MIG צריך ליצור מופע של מעבר לגיבוי.
- בדיקות תקינות של MIG ותיקון אוטומטי. בדיקת התקינות עוקבת אחרי תקינות המופע. אם הצומת הפעיל הופך ללא תקין, בדיקת התקינות מפעילה את תהליך התיקון האוטומטי.
- Logging. כשתיקון תוכנה אוטומטי (autohealing) מפסיק את הצומת הראשי, נרשמת רשומה ברישום ביומן. הרשומות הרלוונטיות ביומן מיוצאות לנושא של יעד Pub/Sub באמצעות מסנן.
- פונקציות Cloud Run מבוססות-אירועים. ההודעה ב-Pub/Sub מפעילה פונקציות Cloud Run. פונקציות Cloud Run משתמשות בהגדרות ב-Cloud Storage כדי לקבוע אילו פעולות לבצע עבור כל קבוצת MIG עם שמירת מצב.
- מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי. מאזן העומסים מספק ניתוב למופע הפעיל בקבוצה. כך מובטח ששינוי בכתובת ה-IP של מכונה שנגרם כתוצאה מיצירה מחדש של מכונה יהיה מוסתר מהלקוח.
בתרשים הבא מוצגת דוגמה לזמינות גבוהה באמצעות קבוצות MIG עם שמירת מצב ודיסקים קשיחים אזוריים:
איור 8. דיאגרמה של זמינות גבוהה (HA) שמשתמשת בקבוצות מנוהלות של מופעים (MIG) עם שמירת מצב ובדיסקים לאחסון מתמיד אזורי.
איור 8 מציג צומת ראשי תקין שמשרת תעבורת לקוחות. הלקוחות מתחברים לכתובת ה-IP הסטטית של מאזן עומסי הרשת הפנימי להעברת סיגנל ללא שינוי. מאזן העומסים מעביר בקשות של לקוחות למכונה הווירטואלית שפועלת כחלק מקבוצת המכונות המנוהלת. נפחי הנתונים מאוחסנים בדיסקים לאחסון מתמיד אזוריים שמוצמדים.
כדי להטמיע את הגישה הזו, יוצרים תמונה של מכונה וירטואלית עם PostgreSQL שמופעלת באתחול כדי לשמש כתבנית של הגדרות מכונה בקבוצת ה-MIG. צריך גם להגדיר בדיקת תקינות מבוססת-HTTP (כמו HAProxy או pgDoctor) בצומת. בדיקת תקינות מבוססת-HTTP עוזרת לוודא שגם מאזן העומסים וגם קבוצת המופעים יכולים לקבוע את התקינות של צומת PostgreSQL.
אחסון מתמיד (persistent disk) אזורי
כדי להקצות מכשיר לאחסון בלוקים שמספק שכפול נתונים סינכרוני בין שני אזורים באזור מסוים, אפשר להשתמש באפשרות האחסון regional persistent disk של Compute Engine. דיסק אחסון מתמיד (persistent disk) אזורי יכול לספק לכם אבן בניין בסיסית להטמעה של אפשרות HA ב-PostgreSQL שלא מסתמכת על שכפול הסטרימינג המובנה של PostgreSQL.
אם המכונה הווירטואלית של הצומת הראשי לא זמינה בגלל כשל בתשתית או הפסקה זמנית בשירות באזור, אפשר לחייב את דיסק האחסון המתמיד האזורי להתחבר למכונה וירטואלית באזור הגיבוי באותו אזור.
כדי לצרף את דיסק האחסון המתמיד האזורי למכונה וירטואלית באזור הגיבוי, אפשר לבצע אחת מהפעולות הבאות:
- שומרים על מכונה וירטואלית (VM) במצב cold standby באזור הגיבוי. מכונה וירטואלית במצב המתנה לא פעיל היא מכונה וירטואלית מושבתת שלא מחובר אליה Persistent Disk אזורי, אבל היא מכונה וירטואלית זהה למכונה הווירטואלית של הצומת הראשי. אם יש כשל, מכונת ה-VM במצב המתנה קרה מופעלת ודיסק האחסון המתמיד האזורי מותקן בה. הנתונים במופע של מצב המתנה פעיל והנתונים במופע של הצומת הראשי זהים.
- יוצרים זוג של קבוצות מנוהלות עם שמירת מצב באמצעות אותה תבנית של הגדרות מכונה. קבוצות ה-MIG מספקות בדיקות תקינות ופועלות כחלק ממישור הבקרה. אם הצומת הראשי נכשל, נוצרת באופן הצהרתי מופע של יתירות כשל בקבוצת ה-MIG של היעד. קבוצת ה-MIG של היעד מוגדרת באובייקט Cloud Storage. הגדרות לכל אירוע משמשות לצירוף של דיסק אחסון מתמיד אזורי.
אם מזהים במהירות את ההפסקה הזמנית בשירות הנתונים, פעולת הצירוף הכפוי בדרך כלל מסתיימת תוך פחות מדקה, כך שאפשר להשיג RTO שנמדד בדקות.
אם העסק שלכם יכול לסבול את זמן ההשבתה הנוסף שנדרש כדי לזהות הפסקה זמנית בשירות ולדווח עליה, וכדי לבצע את המעבר לגיבוי ידנית, אתם לא צריכים להפוך את תהליך הצירוף הכפוי לאוטומטי. אם סף הסבילות שלכם ל-RTO נמוך יותר, אתם יכולים להפוך את תהליך הזיהוי והמעבר לגיבוי אוטומטי. לחלופין, Cloud SQL ל-PostgreSQL מספק הטמעה מנוהלת מלאה של הגישה הזו לזמינות גבוהה.
זיהוי כשלים ותהליך מעבר לגיבוי (failover)
הגישה לזמינות גבוהה (HA) משתמשת ביכולות התיקון האוטומטי של קבוצות מופעים כדי לעקוב אחרי תקינות הצמתים באמצעות בדיקת תקינות. אם בדיקת תקינות נכשלת, המופע הקיים נחשב ללא תקין והוא מופסק. העצירה הזו מפעילה את תהליך המעבר לגיבוי (failover) באמצעות Logging, Pub/Sub והפונקציה שהופעלה ב-Cloud Run Functions.
כדי לעמוד בדרישה שהמכונה הווירטואלית הזו תמיד תכלול את הדיסק האזורי, אחת משתי קבוצות ה-MIG תוגדר על ידי פונקציות Cloud Run ליצירת מופע באחד משני האזורים שבהם הדיסק האזורי לאחסון מתמיד זמין. אם צומת נכשל, המכונה החלופית מופעלת באזור החלופי, בהתאם למצב שנשמר ב-Cloud Storage.
איור 9. דיאגרמה של כשל אזורי ב-MIG.
באיור 9, הצומת הראשי הקודם באזור א' נכשל, והפונקציות של Cloud Run הגדירו את MIG ב' להפעיל מופע ראשי חדש באזור ב'. מנגנון זיהוי הכשלים מוגדר אוטומטית למעקב אחרי תקינות הצומת הראשי החדש.
ניתוב שאילתות
מאזן עומסי הרשת הפנימי להעברת סיגנל ללא שינוי מנתב את הלקוחות למופע שבו פועל שירות PostgreSQL. מאזן העומסים משתמש באותו בדיקת תקינות כמו קבוצת המופעים כדי לקבוע אם המופע זמין להצגת שאילתות. אם הצומת לא זמין כי הוא נוצר מחדש, החיבורים ייכשלו. אחרי שהמכונה חוזרת לפעולה, בדיקות התקינות מתחילות לעבור והחיבורים החדשים מנותבים לצומת הזמין. אין צמתים לקריאה בלבד בהגדרה הזו כי יש רק צומת אחד פעיל.
תהליך חלופי
אם צומת מסד הנתונים נכשל בבדיקת תקינות בגלל בעיה בסיסית בחומרה, הצומת נוצר מחדש במופע בסיסי אחר. בשלב הזה, הארכיטקטורה חוזרת למצב המקורי שלה בלי לבצע שלבים נוספים. עם זאת, אם יש כשל אזורי, ההגדרה ממשיכה לפעול במצב פגום עד שהאזור הראשון מתאושש. למרות שהסיכוי לכך נמוך מאוד, אם יהיו כשלים בו-זמניים בשני האזורים שהוגדרו לשכפול אזורי של Persistent Disk ול-MIG עם שמירת מצב, לא תהיה אפשרות לשחזר את מופע PostgreSQL – מסד הנתונים לא יהיה זמין לטיפול בבקשות במהלך ההפסקה הזמנית בשירות.
השוואה בין אפשרויות ה-HA
בטבלאות הבאות מוצגת השוואה בין אפשרויות ה-HA שזמינות ב-Patroni, ב-pg_auto_failover וב-MIGs עם שמירת מצב עם דיסקים קשיחים אזוריים.
הגדרה וארכיטקטורה
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
|
נדרשת ארכיטקטורת HA, הגדרת DCS וניטור והתראות. הגדרת הסוכן בצמתי נתונים היא פשוטה יחסית. |
לא נדרשות תלותיות חיצוניות מלבד PostgreSQL. נדרש צומת שמוקדש לניטור. צריך להגדיר זמינות גבוהה (HA) והתאוששות מאסון (DR) בצומת של הניטור כדי שלא יהיה נקודת כשל בודדת (SPOF). | ארכיטקטורה שמורכבת אך ורק משירותים של Google Cloud. אפשר להריץ רק צומת מסד נתונים פעיל אחד בכל פעם. |
אפשרות להגדרה של זמינות גבוהה
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
| ניתן להגדרה באופן נרחב: תומך בשכפול סינכרוני ואסינכרוני, ומאפשר לציין אילו צמתים יהיו סינכרוניים ואילו אסינכרוניים. כולל ניהול אוטומטי של הצמתים הסינכרוניים. מאפשר הגדרות HA של כמה אזורים ושל מספר אזורים. חייבת להיות גישה ל-DCS. | דומה ל-Patroni: ניתן להגדרה רבה. עם זאת, מכיוון שהכלי למעקב זמין רק כמופע יחיד, צריך לקחת בחשבון את הגישה לצומת הזה בכל סוג של הגדרה. | מוגבל לשני תחומים באזור יחיד עם שכפול סינכרוני. |
יכולת לטפל בחלוקת רשת
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
| הגנה עצמית בשילוב עם ניטור ברמת מערכת ההפעלה מספקת הגנה מפני פיצול מוח. כל כשל בחיבור ל-DCS גורם לשרת הראשי להפוך לרפליקה ולהפעיל יתירות כשל כדי להבטיח עמידות על פני זמינות. | משתמש בשילוב של בדיקות תקינות מהשרת הראשי לשרת הניטור ולשרת המשוכפל כדי לזהות חלוקה של הרשת, ומוריד את עצמו בדרגה אם יש צורך. | לא רלוונטי: יש רק צומת פעיל אחד של PostgreSQL בכל פעם, ולכן אין חלוקת רשת. |
עלות
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
| העלות גבוהה כי היא תלויה ב-DCS שתבחרו ובמספר העותקים המשוכפלים של PostgreSQL. ארכיטקטורת Patroni לא מוסיפה עלות משמעותית. עם זאת, ההוצאה הכוללת מושפעת מהתשתית הבסיסית, שמשתמשת בכמה מכונות וירטואליות ל-PostgreSQL ול-DCS. האפשרות הזו יכולה להיות הכי יקרה, כי היא משתמשת בכמה עותקים ובאשכול DCS נפרד. | העלות היא בינונית כי היא כוללת הפעלה של צומת מעקב ולפחות שלושה צמתי PostgreSQL (אחד ראשי ושני רפליקות). | העלות נמוכה כי רק צומת PostgreSQL אחד פועל בכל זמן נתון. התשלום הוא רק על מופע מחשוב יחיד. |
הגדרת לקוח
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
| החיבור למאזן העומסים שקוף ללקוח. | נדרשת ספריית לקוח שתומכת בהגדרת כמה מארחים בהגדרה, כי אי אפשר להשתמש בקלות במאזן עומסים. | החיבור למאזן העומסים שקוף ללקוח. |
מדרגיות
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
| גמישות גבוהה בהגדרת פשרות בין מדרגיות לזמינות. אפשר להרחיב את קריאת הנתונים על ידי הוספת עוד רפליקות. | בדומה ל-Patroni: אפשר להרחיב את קריאת הנתונים על ידי הוספת עוד עותקים משוכפלים. | הגמישות מוגבלת כי יש רק צומת PostgreSQL פעיל אחד בכל פעם. |
אוטומציה של אתחול צומת PostgreSQL, ניהול הגדרות
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
הכלי מספק כלים לניהול ההגדרה של PostgreSQL (patronictl
edit-config) ומאתחל אוטומטית צמתים חדשים או צמתים שהופעלו מחדש באשכול. אפשר לאתחל צמתים באמצעות pg_basebackup או כלים אחרים כמו barman.
|
מאפשר לאתחל צמתים באופן אוטומטי, אבל מוגבל לשימוש רק ב-pg_basebackup כשמאתחלים צומת רפליקה חדש.
ניהול ההגדרות מוגבל להגדרות שקשורות ל-pg_auto_failover.
|
קבוצת מכונות עם שמירת מצב ודיסק משותף מבטלת את הצורך באתחול של צומת PostgreSQL. מכיוון שתמיד פועל רק צומת אחד, ניהול ההגדרות מתבצע בצומת יחיד. |
אפשרויות התאמה אישית ומגוון תכונות
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
|
ממשק hook שמאפשר להגדיר פעולות שיופעלו בשלבים מרכזיים, כמו הורדה או העלאה של רמת ההרשאה. אפשרויות הגדרה עשירות בתכונות, כמו תמיכה בסוגים שונים של DCS, אמצעים שונים לאתחול רפליקות ודרכים שונות לספק הגדרות של PostgreSQL. מאפשר להגדיר אשכולות במצב המתנה שמאפשרים להעביר אשכולות משוכפלים מדורגים כדי להקל על ההעברה בין אשכולות. |
מוגבל כי זה פרויקט חדש יחסית. | לא רלוונטי. |
Maturity
| Patroni | pg_auto_failover | קבוצות MIG עם שמירת מצב ודיסקים לאחסון מתמיד אזורי |
|---|---|---|
| הפרויקט זמין מאז 2015, והוא נמצא בשימוש בסביבת ייצור בחברות גדולות כמו Zalando ו-GitLab. | פרויקט חדש יחסית שהוכרז בתחילת 2019. | מורכב כולו ממוצרים שזמינים בדרך כלל Google Cloud . |
שיטות מומלצות לתחזוקה ולמעקב
תחזוקה ומעקב אחר אשכול PostgreSQL HA חיוניים כדי להבטיח זמינות גבוהה, תקינות נתונים וביצועים אופטימליים. בקטעים הבאים מפורטות כמה שיטות מומלצות למעקב אחרי אשכול PostgreSQL HA ולתחזוקה שלו.
ביצוע גיבויים קבועים ובדיקות שחזור
מומלץ לגבות באופן קבוע את מסדי הנתונים של PostgreSQL ולבדוק את תהליך השחזור. כך אפשר לשמור על תקינות הנתונים ולמזער את זמן ההשבתה במקרה של הפסקה זמנית בשירות. כדאי לבדוק את תהליך השחזור כדי לוודא שהגיבויים תקינים ולזהות בעיות פוטנציאליות לפני שמתרחשת הפסקה זמנית בשירות.
מעקב אחרי שרתי PostgreSQL ופיגור בשכפול
עליכם לעקוב אחרי שרתי PostgreSQL כדי לוודא שהם פועלים. מעקב אחרי זמן ההשהיה של הרפליקציה בין הצומת הראשי לצומת הרפליקה. פיגור מוגזם עלול להוביל לחוסר עקביות בנתונים ולאובדן נתונים מוגבר במקרה של יתירות כשל. כדאי להגדיר התראות על עלייה משמעותית בפיגור ולבדוק את שורש הבעיה בהקדם.
שימוש בתצוגות כמו pg_stat_replication ו-pg_replication_slots יכול לעזור לכם לעקוב אחרי פרק הזמן מהחשיפה להמרה.
הטמעה של איגום חיבורים
השימוש במאגר חיבורים יכול לעזור לכם לנהל ביעילות את החיבורים למסד הנתונים. איגום חיבורים עוזר לצמצם את התקורה של יצירת חיבורים חדשים, וכך לשפר את ביצועי האפליקציה ואת היציבות של שרת מסד הנתונים. כלים כמו PGBouncer ו-Pgpool-II יכולים לספק איגום חיבורים ל-PostgreSQL.
הטמעה של מעקב מקיף
כדי לקבל תובנות לגבי אשכולות PostgreSQL HA, צריך להקים מערכות ניטור חזקות באופן הבא:
- אתם יכולים לעקוב אחרי מדדים חשובים של PostgreSQL ומערכת, כמו ניצול המעבד (CPU), שימוש בזיכרון, קלט/פלט (I/O) בדיסק, פעילות ברשת וחיבורים פעילים.
- איסוף יומנים של PostgreSQL, כולל יומני שרת, יומני WAL ויומני autovacuum, לניתוח מעמיק ולפתרון בעיות.
- כדי לזהות בעיות במהירות, אפשר להשתמש בכלי מעקב ובלוחות בקרה כדי להמחיש את המדדים והיומנים.
- שילוב מדדים ויומנים עם מערכות התראות כדי לקבל התראה יזומה על בעיות פוטנציאליות.
למידע נוסף על מעקב אחרי מופע של Compute Engine, אפשר לעיין בסקירה הכללית של Cloud Monitoring.
המאמרים הבאים
- מידע על הגדרת זמינות גבוהה ב-Cloud SQL
- מידע נוסף על אפשרויות של זמינות גבוהה באמצעות דיסק קשיח אזורי
- מידע נוסף על Patroni
- מידע נוסף על pg_auto_failover
- לדוגמאות נוספות של ארכיטקטורות, תרשימים ושיטות מומלצות, עיינו במאמר Cloud Architecture Center.
שותפים ביצירת התוכן
Author: Alex Cârciu | Solutions Architect