ארכיטקטורות לזמינות גבוהה של אשכולות PostgreSQL ב-Compute Engine

Last reviewed 2024-12-03 UTC

במסמך הזה מתוארות כמה ארכיטקטורות שמספקות זמינות גבוהה (HA) לפריסות של PostgreSQL ב- Google Cloud. זמינות גבוהה היא מדד לחוסן של המערכת בתגובה לכשל בתשתית הבסיסית. במסמך הזה, המונח "זמינות גבוהה" מתייחס לזמינות של אשכולות PostgreSQL באזור אחד בענן או בין כמה אזורים, בהתאם לארכיטקטורת הזמינות הגבוהה.

המסמך הזה מיועד למנהלי מסדי נתונים, למומחי Cloud Architect ולמהנדסי DevOps שרוצים ללמוד איך לשפר את האמינות של שכבת הנתונים ב-PostgreSQL על ידי שיפור זמן הפעולה התקינה הכולל של המערכת. במאמר הזה נסביר מושגים שרלוונטיים להרצת PostgreSQL ב-Compute Engine. במסמך לא מוסבר איך להשתמש במסדי נתונים מנוהלים כמו Cloud SQL ל-PostgreSQL ו-AlloyDB ל-PostgreSQL.

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

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

הנושאים שמופיעים במסמך הזה:

  • הגדרות של מונחים שקשורים למושגים של מסדי נתונים בזמינות גבוהה.
  • אפשרויות לטופולוגיות של HA PostgreSQL.
  • מידע על ההקשר של כל אפשרות ארכיטקטורה.

הסברים על המונחים

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

רפליקציה
התהליך שבו טרנזקציות כתיבה (INSERT, UPDATE או DELETE) ושינויים בסכימה (שפת הגדרת נתונים (DDL)) מתועדים באופן מהימן ביומן, ואז מוחלים באופן סדרתי על כל צומתי הרפליקה של מסד הנתונים במורד הזרם בארכיטקטורה.
צומת ראשי
הצומת שמספק קריאה עם המצב העדכני ביותר של נתונים שנשמרו. כל פעולות הכתיבה במסד הנתונים חייבות להיות מופנות לצומת ראשי.
צומת רפליקה (משני)
עותק אונליין של צומת מסד הנתונים הראשי. השינויים משוכפלים לצומתי הרפליקה מהצומת הראשי באופן סינכרוני או אסינכרוני. אפשר לקרוא מצומתי רפליקה, אבל חשוב לזכור שהנתונים עשויים להתעכב מעט בגלל השהיית הרפליקציה.
השהיית רפליקציה
מדידה, במספר רצף של יומן (LSN), במזהה עסקה או בזמן. השהיית הרפליקציה מבטאת את ההבדל בין הזמן שבו פעולות השינוי מוחלות על הרפליקה לבין הזמן שבו הן מוחלות על הצומת הראשי.
העברה רציפה לארכיון
גיבוי מצטבר שבו מסד הנתונים שומר באופן רציף טרנזקציות עוקבות בקובץ.
כתיבה מראש ביומן (WAL)
יומן כתיבה מראש (WAL) הוא קובץ יומן שמתעד שינויים בקובצי נתונים לפני שהשינויים מבוצעים בפועל בקבצים. במקרה של קריסת שרת, ה-WAL הוא דרך סטנדרטית להבטיח את תקינות הנתונים ועמידות הכתיבה.
רשומת WAL
רשומה של עסקה שהוחלה על מסד הנתונים. רשומת WAL מעוצבת ומאוחסנת כסדרה של רשומות שמתארות שינויים ברמת הדף של קובץ הנתונים.
מספר סידורי של יומן (LSN)
טרנזקציות יוצרות רשומות WAL שמתווספות לקובץ ה-WAL. המיקום שבו מתבצעת ההוספה נקרא מספר סידורי ביומן (LSN). זהו מספר שלם של 64 ביט, שמיוצג כשני מספרים הקסדצימליים שמופרדים בלוכסן (XXXXXXXX/YYZZZZZZ). האות Z מייצגת את מיקום ההיסט בקובץ ה-WAL.
קבצי פלחים
קבצים שמכילים כמה שיותר רשומות WAL, בהתאם לגודל הקובץ שהגדרתם. שמות הקבצים של הפלחים גדלים באופן מונוטוני, וגודל הקובץ שמוגדר כברירת מחדל הוא 16MB.
רפליקציה סינכרונית
סוג של שכפול שבו השרת הראשי ממתין שהרפליקה תאשר שהנתונים נכתבו ביומן העסקאות של הרפליקה, לפני שהוא מאשר את השמירה ללקוח. כשמפעילים רפליקציה בסטרימינג, אפשר להשתמש באפשרות synchronous_commit של PostgreSQL, שעוזרת להבטיח עקביות בין השרת הראשי לרפליקה.
רפליקציה אסינכרונית
סוג של רפליקציה שבה השרת הראשי לא ממתין שהרפליקה תאשר שהטרנזקציה התקבלה בהצלחה לפני שהוא מאשר את ה-commit ללקוח. ברפליקציה אסינכרונית זמן האחזור קצר יותר בהשוואה לרפליקציה סינכרונית. עם זאת, אם השרת הראשי קורס והטרנזקציות שבוצעו בו לא מועברות לרפליקה, יכול להיות שנתונים יאבדו. רפליקציה אסינכרונית היא מצב ברירת המחדל של רפליקציה ב-PostgreSQL, באמצעות העברת יומנים מבוססי-קובץ או רפליקציה בסטרימינג.
העברת יומנים מבוססת-קבצים
שיטת רפליקציה ב-PostgreSQL שמעבירה את קובצי הפלחים של WAL משרת מסד הנתונים הראשי לרפליקה. השרת הראשי פועל במצב של העברה רציפה לארכיון, וכל שירות המתנה פועל במצב שחזור (recovery) רציף כדי לקרוא את קובצי ה-WAL. סוג הרפליקציה הזה הוא אסינכרוני.
רפליקציה של סטרימינג
שיטת רפליקציה שבה הרפליקה מתחברת לראשי ומקבלת באופן רציף רצף של שינויים. מכיוון שהעדכונים מגיעים דרך סטרימינג, השיטה הזו שומרת על הרפליקה מעודכנת יותר בהשוואה לשיטת log-shipping replication. למרות שרפליקציה היא אסינכרונית כברירת מחדל, אפשר להגדיר רפליקציה סינכרונית.
רפליקציה פיזית של סטרימינג
שיטת שכפול שמעבירה שינויים לרפליקה. בשיטה הזו משתמשים ברשומות WAL שמכילות את השינויים הפיזיים בנתונים, בצורה של כתובות בלוקים בדיסק ושינויים של בייט אחר בייט.
רפליקציה לוגית של סטרימינג
שיטת רפליקציה שמתעדת שינויים על סמך זהות הרפליקציה (מפתח ראשי), ומאפשרת שליטה רבה יותר על אופן הרפליקציה של הנתונים בהשוואה לרפליקציה פיזית. בגלל המגבלות ברפליקציה לוגית של PostgreSQL, רפליקציה לוגית בסטרימינג דורשת הגדרה מיוחדת לזמינות גבוהה. המדריך הזה עוסק ברפליקציה פיזית רגילה ולא ברפליקציה לוגית.
זמן פעולה תקינה
אחוז הזמן שבו משאב פועל ויכול להגיב לבקשה.
זיהוי כשלים
התהליך שבו מזהים שהייתה תקלה בתשתית.
יתירות כשל
התהליך שבו מקדמים את תשתית הגיבוי או התשתית במצב המתנה (במקרה הזה, צומת הרפליקה) כדי שתהפוך לתשתית הראשית. במהלך יתירות כשל, צומת הרפליקה הופך לצומת הראשי.
מעבר
תהליך ההפעלה של יתירות כשל ידנית במערכת ייצור. העברה ידנית בודקת שהמערכת פועלת כמו שצריך, או מוציאה את הצומת הראשי הנוכחי מהאשכול לצורך תחזוקה.
יעד זמן ההתאוששות (RTO)
משך הזמן שחלף בזמן אמת עד להשלמת התהליך של יתירות כשל בשכבת הנתונים. ה-RTO תלוי במשך הזמן שסביר מבחינה עסקית.
יעד להתאוששות מאסון (RPO)
כמות הנתונים שאבדו (בזמן אמת שחלף) בשכבת הנתונים כתוצאה מיתירות כשל. ה-RPO תלוי בכמות אובדן הנתונים שניתן לקבל מבחינה עסקית.
חלופי
התהליך של החזרת הצומת הראשי הקודם אחרי תיקון המצב שגרם ליתירות כשל.
תיקון עצמי
היכולת של מערכת לפתור בעיות בלי פעולות חיצוניות של מפעיל אנושי.
מחיצת רשת
מצב שבו שני צמתים בארכיטקטורה – לדוגמה, הצומת הראשי והצומת המשוכפל – לא יכולים לתקשר זה עם זה ברשת.
מוח מפוצל
מצב שבו שני צמתים מניחים בו-זמנית שהם הצומת הראשי.
קבוצת צמתים
קבוצה של משאבי מחשוב שמספקים שירות. במסמך הזה, השירות הזה הוא שכבת ההתמדה של הנתונים.
צומת עדות או צומת קוורום
משאב מחשוב נפרד שעוזר לקבוצת צמתים לקבוע מה לעשות כשמתרחש מצב של פיצול מוח.
בחירות מקדימות או בחירות לראשות המפלגה
התהליך שבו קבוצה של צמתים שמודעים לעמיתים, כולל צומתי עדים, קובעת איזה צומת צריך להיות הצומת הראשי.

מתי כדאי לשקול ארכיטקטורת HA

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

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

הדרישות שלכם לזמינות גבוהה (HA)

השאלות הבאות יעזרו לכם להחליט איזו אפשרות של זמינות גבוהה ב-PostgreSQL הכי מתאימה לעסק שלכם:

  • מהי רמת הזמינות שאתם רוצים להשיג? האם אתם צריכים אפשרות שתאפשר לשירות שלכם להמשיך לפעול במהלך כשל באזור אחד בלבד או כשל אזורי מלא? חלק מהאפשרויות של זמינות גבוהה מוגבלות לאזור אחד, ואחרות יכולות להיות בכמה אזורים.
  • אילו שירותים או לקוחות מסתמכים על שכבת הנתונים, ומה העלות לעסק אם יש זמן השבתה בשכבת הנתונים הקבועים? אם שירות מסוים מיועד רק ללקוחות פנימיים שצריכים להשתמש במערכת מדי פעם, סביר להניח שדרישות הזמינות שלו יהיו נמוכות יותר מאלה של שירות שפונה ללקוחות קצה ומשרת אותם באופן רציף.
  • מה התקציב התפעולי שלכם? העלות היא שיקול חשוב: כדי לספק זמינות גבוהה, סביר להניח שעלויות התשתית והאחסון יעלו.
  • עד כמה התהליך צריך להיות אוטומטי, ובאיזו מהירות צריך לבצע את המעבר במקרה של כשל? (מהו ה-RTO שלך?) האפשרויות של זמינות גבוהה משתנות בהתאם למהירות שבה המערכת יכולה לעבור למצב של יתירות כשל ולהיות זמינה ללקוחות.
  • האם אתם יכולים להרשות לעצמכם לאבד נתונים כתוצאה מיתירות כשל? (מהו ה-RPO שלכם?) בגלל האופי המבוזר של טופולוגיות HA, יש פשרה בין זמן האחזור של השמירה לבין הסיכון לאובדן נתונים בגלל כשל.

איך פועלת זמינות גבוהה (HA)

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

רפליקציה בסטרימינג

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

כל צומת רפליקה דורש משאבי מחשוב ואחסון ייעודיים. תשתית צומת הרפליקה לא תלויה בתשתית הראשית. אפשר להשתמש בצומתי רפליקה כגיבוי חם (hot standby) כדי להציג שאילתות לקוח לקריאה בלבד. הגישה הזו מאפשרת איזון עומסים של שאילתות לקריאה בלבד בין הרפליקה הראשית לבין רפליקה אחת או יותר.

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

שכפול סטרימינג סינכרוני

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

אפשרות ההגדרה synchronous_commit מאפשרת גם להגדיר את רמות העמידות הבאות של הרפליקה המתקדמת לעסקה:

  • ‫local: רפליקות המתנה סינכרוניות לא מעורבות באישור ה-commit. השרת הראשי מאשר את ביצוע העסקאות אחרי שרשומות ה-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, שמציינת את רשימת שרתי הגיבוי שמשתתפים בתהליך השכפול הסינכרוני. אם לא צוינו שמות של המתנה סינכרונית, אישורי העסקאות לא ממתינים לרפליקציה.

ארכיטקטורות של PostgreSQL HA

ברמה הבסיסית ביותר, זמינות גבוהה בשכבת הנתונים כוללת את הדברים הבאים:

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

בקטעים הבאים מופיעה סקירה כללית של ארכיטקטורות הזמינות הגבוהה הבאות:

  • התבנית של Patroni
  • התוסף והשירות pg_auto_failover
  • קבוצות MIG עם שמירת מצב ודיסק אחסון מתמיד אזורי

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

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

זמינות גבוהה באמצעות התבנית של Patroni

‫Patroni היא תבנית תוכנה בקוד פתוח (ברישיון MIT) שמתעדכנת באופן קבוע. היא מספקת את הכלים להגדרה, לפריסה ולתפעול של ארכיטקטורת PostgreSQL HA. ‫Patroni מספק מצב אשכול משותף והגדרת ארכיטקטורה שנשמרת במאגר הגדרות מבוזר (DCS). אפשרויות להטמעת DCS כוללות את etcd, ‏Consul, ‏Apache ZooKeeper או Kubernetes. בתרשים הבא מוצגים הרכיבים העיקריים של אשכול Patroni.

באשכול Patroni יש אינטראקציה בין צומתי PostgreSQL,‏ DCS וסוכני Patroni.

איור 1. תרשים של הרכיבים העיקריים באשכול Patroni.

באיור 1, מאזני העומסים נמצאים לפני צומתי PostgreSQL, והסוכנים של DCS ו-Patroni פועלים בצומתי PostgreSQL.

‫Patroni מריץ תהליך של סוכן בכל צומת של PostgreSQL. תהליך הנציג מנהל את תהליך PostgreSQL ואת ההגדרות של צומת הנתונים. סוכן Patroni מתואם עם צמתים אחרים דרך ה-DCS. תהליך הסוכן של Patroni גם חושף API בארכיטקטורת REST שאפשר לשלוח אליו שאילתות כדי לקבוע את Service Health וההגדרות של שירות PostgreSQL לכל צומת.

כדי להצהיר על תפקיד החברות שלו באשכול, הצומת הראשי מעדכן באופן קבוע את מפתח ה-leader ב-DCS. מפתח ה-leader כולל זמן חיים (TTL). אם ה-TTL חולף בלי עדכון, מפתח ה-leader נמחק מה-DCS, ומתחיל תהליך בחירת leader כדי לבחור primary חדש ממאגר המועמדים.

בתרשים הבא מוצג אשכול תקין שבו צומת A מעדכן בהצלחה את נעילת ה-leader.

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

איור 2. תרשים של אשכול תקין.

באיור 2 מוצג אשכול תקין: צומת B וצומת C צופים בזמן שצומת A מעדכן בהצלחה את מפתח המנהיג.

זיהוי כשלים

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

אשכול פגום בוחר מנהיג חדש אחרי שתוקף המפתח של המנהיג הקיים פג.

איור 3. תרשים של אשכול פגום.

באיור 3 מוצג אשכול פגום: צומת ראשי מושבת לא עדכן לאחרונה את מפתח ה-leader שלו ב-DCS, והרפליקות שאינן leader מקבלות הודעה על כך שתוקף מפתח ה-leader פג.

במארחי Linux, ‏Patroni מריץ גם כלב שמירה ברמת מערכת ההפעלה בצמתים הראשיים. ה-watchdog הזה מאזין להודעות keep-alive מתהליך הסוכן של Patroni. אם התהליך מפסיק להגיב והאות keep alive לא נשלח, ה-watchdog מפעיל מחדש את המארח. ה-watchdog עוזר למנוע מצב של split brain, שבו צומת PostgreSQL ממשיך לשמש כראשי, אבל מפתח ה-leader ב-DCS פג בגלל כשל בסוכן, ונבחר ראשי (leader) אחר.

תהליך יתירות כשל

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

במהלך תהליך יתירות הכשל של Patroni, הרפליקות בודקות את המיקום שלהן ביומן ה-WAL.

איור 4. דיאגרמה של תהליך יתירות הכשל ב-Patroni.

באיור 4 מוצגות שאילתות של מיקום יומן WAL והתוצאות המתאימות מצומתי הרפליקה הפעילים. צומת A לא זמין, והצמתים התקינים B ו-C מחזירים אחד לשני את אותו מיקום WAL.

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

צומת יוצר מפתח מוביל ב-DCS והופך לראשי החדש.

איור 5. תרשים של מרוץ המובילים.

באיור 5 מוצג מרוץ מנהיגים: שני מועמדים למנהיגות מנסים להשיג את נעילת המנהיג, אבל רק אחד משני הצמתים, צומת C, מגדיר בהצלחה את מפתח המנהיג ומנצח במרוץ.

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

ב-Patroni יש גם את כלי הבקרה patronictl שמאפשר להריץ מעברים כדי לבדוק את תהליך יתירות הכשל של הצומת. הכלי הזה עוזר למפעילים לבדוק את הגדרות הזמינות הגבוהה שלהם בסביבת הייצור.

ניתוב שאילתות

תהליך הסוכן של Patroni שפועל בכל צומת חושף נקודות קצה ל-API בארכיטקטורת REST, שמגלות את התפקיד הנוכחי של הצומת: ראשי או רפליקה.

נקודת קצה (endpoint) של REST קוד החזרה של HTTP אם הוא ראשי קוד החזרה של HTTP אם מדובר ברפליקה
/primary 200 503
/replica 503 200

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

תהליך הגיבוי

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

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

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

זמינות גבוהה באמצעות התוסף והשירות pg_auto_failover

‫pg_auto_failover הוא תוסף PostgreSQL בקוד פתוח (רישיון PostgreSQL) שנמצא בפיתוח פעיל. pg_auto_failover מגדיר ארכיטקטורת HA על ידי הרחבת היכולות הקיימות של PostgreSQL. ל-pg_auto_failover אין יחסי תלות מלבד PostgreSQL.

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

ארכיטקטורה של pg_auto_failover מכילה מערך של צמתים.

איור 6. תרשים של ארכיטקטורת pg_auto_failover.

באיור 6 מוצגת ארכיטקטורה של pg_auto_failover שמורכבת משני רכיבים עיקריים: שירות המעקב וסוכן ה-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 כדי להתאים אישית את תזמון המעקב ואת מספר הניסיונות החוזרים. מידע נוסף זמין במאמר יתירות כשל ועמידות בפני תקלות.

אם יש כשל בצומת יחיד, אחד מהמצבים הבאים מתקיים:

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

בתרשים הבא מוצגים תרחישי הכישלון ומצבי התוצאה של ההיווצרות שמתוארים ברשימה שלמעלה.

תרחישי הכשל של pg_auto_failover לכשלים בצומת הראשי, המשני והמעקב.

איור 7. דיאגרמה של תרחישי הכשל של pg_auto_failover.

תהליך יתירות כשל

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

  • ‫replication_quorum: אפשרות בוליאנית. אם הערך של replication_quorum הוא true, הצומת נחשב כמועמד פוטנציאלי ליתירות כשל.
  • ‫candidate_priority: ערך של מספר שלם מ-0 עד 100. ערך ברירת המחדל של candidate_priority הוא 50, ואפשר לשנות אותו כדי להשפיע על העדיפות של יתירות הכשל. הצמתים מתועדפים כמועמדים פוטנציאליים ליתירות כשל על סמך הערך של candidate_priority. לצמתים עם ערך candidate_priority גבוה יותר יש עדיפות גבוהה יותר. כדי שתהליך יתירות הכשל יפעל, צריך שלפחות לשני צמתים תהיה עדיפות מועמדים שאינה אפס בכל תצורה של pg_auto_failover.

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

צמתים משניים נשקלים לקידום לפי הקריטריונים הבאים:

  • צמתים עם עדיפות המועמד הגבוהה ביותר
  • מצב המתנה עם מיקום יומן ה-WAL המתקדם ביותר שפורסם ב-Monitor
  • בחירה אקראית כשובר שוויון סופי

מועמד ליתירות כשל הוא מועמד בפיגור אם הוא לא פרסם את מיקום ה-LSN המתקדם ביותר ב-WAL. בתרחיש הזה, pg_auto_failover מתזמר שלב ביניים במנגנון יתירות הכשל: המועמד המפגר מאחור מאחזר את בייטי ה-WAL החסרים מצומת המתנה שיש לו את מיקום ה-LSN המתקדם ביותר. לאחר מכן, הצומת במצב המתנה מקודם. ‫Postgres מאפשר את הפעולה הזו כי רפליקציה מדורגת מאפשרת לכל המתנה לפעול כצומת במעלה הזרם של המתנה אחרת.

ניתוב שאילתות

ב-pg_auto_failure אין יכולות ניתוב של שאילתות בצד השרת. במקום זאת, pg_auto_failure מסתמך על ניתוב שאילתות בצד הלקוח שמשתמש במנהל ההתקן הרשמי של לקוח PostgreSQL,‏ libpq. כשמגדירים את ה-URI של החיבור, מנהל ההתקן יכול לקבל כמה מארחים במילת המפתח host.

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

תהליכי חזרה למצב קודם ומעבר בין מצבים

כשתהליך ה-Keeper מפעיל מחדש צומת שנכשל או מפעיל צומת חלופי חדש, התהליך בודק את צומת ה-Monitor כדי לקבוע את הפעולה הבאה שיש לבצע. אם צומת שהופעל מחדש אחרי שנכשל היה בעבר הראשי, וה-Monitor כבר בחר ראשי חדש בהתאם לתהליך יתירות הכשל, ה-Keeper מאתחל מחדש את הראשי הישן כרפליקה משנית.

‫pg_auto_failure מספק את הכלי pg_autoctl, שמאפשר להריץ העברות כדי לבדוק את תהליך יתירות הכשל של הצומת. בנוסף לאפשרות לבדוק את הגדרות הזמינות הגבוהה בסביבת הייצור, הכלי עוזר לשחזר את אשכול הזמינות הגבוהה למצב תקין אחרי יתירות כשל.

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

בקטע הזה מתוארת גישה לזמינות גבוהה שמשתמשת ברכיבים הבאים של Google Cloud:

  • דיסק לאחסון מתמיד של אזור. כשמשתמשים בדיסקים אזוריים קבועים, הנתונים משוכפלים באופן סינכרוני בין שני אזורים באותו מרחב, כך שאין צורך להשתמש בשכפול בסטרימינג. עם זאת, זמינות גבוהה מוגבלת לשני אזורים בדיוק בתוך אזור.
  • קבוצות מופעי מכונה מנוהלים עם שמירת מצב (stateful). צמד קבוצות MIG עם שמירת מצב משמשות כחלק ממישור בקרה כדי להפעיל צומת PostgreSQL ראשי אחד. כשה-MIG עם שמירת המצב מפעיל מכונה חדשה, הוא יכול לצרף את הדיסק האזורי הקיים לאחסון מתמיד. בנקודת זמן אחת, רק לאחת משתי קבוצות ה-MIG יהיה מופע פועל.
  • Cloud Storage. אובייקט בקטגוריה של Cloud Storage מכיל הגדרה שמציינת באיזו משתי קבוצות ה-MIG פועל צומת מסד הנתונים הראשי, ובאיזו קבוצת MIG צריך ליצור מכונה של יתירות כשל.
  • בדיקות תקינות ותיקון אוטומטי של MIG. בדיקת התקינות עוקבת אחרי תקינות המכונה. אם הצומת הפעיל לא תקין, בדיקת התקינות מפעילה את תהליך התיקון האוטומטי.
  • רישום ביומן. כשהצומת הראשי נעצר על ידי תיקון תוכנה אוטומטי, רשומה נרשמת ב-Logging. רשומות היומן הרלוונטיות מיוצאות לנושא של Pub/Sub sink באמצעות מסנן.
  • פונקציות Cloud Run מבוססות-אירועים. ההודעה ב-Pub/Sub מפעילה פונקציות Cloud Run. פונקציות Cloud Run משתמשות בהגדרות האישיות ב-Cloud Storage כדי לקבוע אילו פעולות לבצע בכל קבוצת MIG עם שמירת מצב.
  • ‫Internal passthrough Network Load Balancer. מאזן העומסים מספק ניתוב למכונה שפועלת בקבוצה. כך אפשר להבטיח ששינוי בכתובת ה-IP של המכונה, שנגרם כתוצאה מיצירה מחדש של המכונה, מופשט מהלקוח.

בתרשים הבא מוצגת דוגמה לזמינות גבוהה באמצעות קבוצות MIG עם שמירת מצב ודיסקים אזוריים קבועים:

ב-HA נעשה שימוש בקבוצות MIG עם שמירת מצב ובדיסקים לאחסון מתמיד אזורי.

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

באיור 8 מוצג צומת ראשי תקין שמשרת את תנועת הלקוחות. הלקוחות מתחברים לכתובת ה-IP הסטטית של מאזן עומסי הרשת הפנימי להעברת סיגנל ללא שינוי. מאזן העומסים מנתב את בקשות הלקוח למכונה הווירטואלית שפועלת כחלק מה-MIG. נפחי הנתונים מאוחסנים בדיסקים אזוריים לאחסון מתמיד (persistent disks) שנטענו.

כדי ליישם את הגישה הזו, יוצרים קובץ אימג' של מכונה וירטואלית עם PostgreSQL שמופעל באתחול, ומשתמשים בו כתבנית של הגדרות המכונה של ה-MIG. בנוסף, צריך להגדיר בדיקת תקינות מבוססת-HTTP (כמו HAProxy או pgDoctor) בצומת. בדיקת תקינות שמבוססת על HTTP עוזרת לוודא שגם מאזן העומסים וגם קבוצת המכונות יכולים לקבוע את התקינות של צומת PostgreSQL.

דיסק אחסון מתמיד אזורי

כדי להקצות התקן אחסון בלוקים שמספק שכפול נתונים סינכרוני בין שני אזורים, אתם יכולים להשתמש באפשרות האחסון Persistent Disk אזורי של Compute Engine. דיסק אחסון מתמיד (persistent disk) אזורי יכול לשמש כאבן בניין בסיסית להטמעת אפשרות של זמינות גבוהה ב-PostgreSQL, שלא מסתמכת על הרפליקציה המובנית של סטרימינג ב-PostgreSQL.

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

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

  • להחזיק מכונה וירטואלית במצב המתנה קר באזור הגיבוי. מכונה וירטואלית במצב המתנה קר היא מכונה וירטואלית שהופסקה, שאין לה Persistent Disk אזורי, אבל היא זהה למכונה הווירטואלית של הצומת הראשי. אם יש כשל, המכונה הווירטואלית במצב המתנה קר מופעלת ודיסק האחסון המתמיד האזורי מותקן בה. למכונה במצב המתנה קרה ולמכונה של הצומת הראשי יש את אותם נתונים.
  • יוצרים זוג קבוצות MIG עם שמירת מצב באמצעות אותה תבנית של הגדרות מכונה. קבוצות ה-MIG מספקות בדיקות תקינות ומשמשות כחלק ממישור הבקרה. אם הצומת הראשי נכשל, נוצרת מכונה לגיבוי במקרה של כשל בקבוצת ה-MIG המוגדרת כיעד. קבוצת ה-MIG שרוצים להוסיף מוגדרת באובייקט של Cloud Storage. כדי לצרף את הדיסק האזורי לאחסון מתמיד, משתמשים בהגדרות אישיות לכל מכונה.

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

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

תהליך זיהוי כשלים ויתירות כשל

בגישת הזמינות הגבוהה, משתמשים ביכולות של תיקון תוכנה אוטומטי (autohealing) של קבוצות מכונות כדי לעקוב אחרי תקינות הצמתים באמצעות בדיקת תקינות. אם בדיקת התקינות נכשלת, המכונה הקיימת נחשבת לא תקינה והיא נעצרת. השלב הזה מפעיל את תהליך יתירות הכשל באמצעות Logging,‏ Pub/Sub והפונקציה המופעלת של פונקציות Cloud Run.

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

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

איור 9. תרשים של כשל אזורי ב-MIG.

באיור 9, הצומת הראשי הקודם באזור A נכשל, ופונקציות Cloud Run הגדירו את MIG B להפעיל מכונה ראשית חדשה באזור B. מנגנון זיהוי הכשלים מוגדר באופן אוטומטי למעקב אחרי התקינות של הצומת הראשי החדש.

ניתוב שאילתות

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

תהליך הגיבוי

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

השוואה בין האפשרויות לזמינות גבוהה

בטבלאות הבאות מוצגת השוואה בין אפשרויות הזמינות הגבוהה שזמינות ב-Patroni, ב-pg_auto_failover ובקבוצות של מכונות מנוהלות עם שמירת מצב (Stateful MIGs) עם דיסקים אזוריים קבועים.

הגדרה וארכיטקטורה

Patroni pg_auto_failover קבוצות MIG עם שמירת מצב ודיסקים אזוריים לאחסון מתמיד

צריך ארכיטקטורת HA, הגדרת DCS, ניטור והתראות. הגדרת הסוכן בצומתי נתונים היא פשוטה יחסית.

לא נדרשים יחסי תלות חיצוניים מלבד PostgreSQL. נדרש צומת ייעודי כצג. צומת המעקב דורש זמינות גבוהה (HA) והתאוששות מאסון (DR) כדי לוודא שהוא לא נקודת כשל בודדת (SPOF). ארכיטקטורה שמורכבת רק משירותי Google Cloud. אתם מריצים רק צומת אחד פעיל של מסד נתונים בכל פעם.

אפשרות להגדיר זמינות גבוהה

Patroni pg_auto_failover קבוצות MIG עם שמירת מצב ודיסקים אזוריים לאחסון מתמיד
ניתן להגדרה בקלות: תומך בשכפול סינכרוני ואסינכרוני, ומאפשר לציין אילו צמתים יהיו סינכרוניים ואילו אסינכרוניים. כולל ניהול אוטומטי של הצמתים הסינכרוניים. מאפשר הגדרות של זמינות גבוהה בכמה אזורים ובכמה תחומים. צריכה להיות גישה ל-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. קבוצת מכונות עם שמירת מצב (stateful) ודיסק משותף מייתרת את הצורך באתחול של צומת PostgreSQL. מכיוון שרק צומת אחד פועל, ניהול ההגדרות מתבצע בצומת יחיד.

אפשרויות התאמה אישית ומגוון תכונות

Patroni pg_auto_failover קבוצות MIG עם שמירת מצב ודיסקים אזוריים לאחסון מתמיד

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

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

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

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

בשלות

Patroni pg_auto_failover קבוצות MIG עם שמירת מצב ודיסקים אזוריים לאחסון מתמיד
הפרויקט זמין מאז 2015 ומשמש לייצור בחברות גדולות כמו Zalando ו-GitLab. פרויקט חדש יחסית שהוכרז בתחילת 2019. מורכב כולו ממוצרים שזמינים לכלל המשתמשים Google Cloud .

שיטות מומלצות לתחזוקה ולמעקב

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

ביצוע גיבויים ובדיקות שחזור באופן קבוע

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

מעקב אחרי שרתי PostgreSQL וזמן האחזור של הרפליקציה

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

הטמעת מאגר חיבורים (connection pooling)

מאגר חיבורים יכול לעזור לכם לנהל ביעילות את החיבורים למסד הנתונים. מאגר חיבורים עוזר לצמצם את התקורה של יצירת חיבורים חדשים, וכך משפר את ביצועי האפליקציה ואת היציבות של שרת מסד הנתונים. כלים כמו PGBouncer ו-Pgpool-II יכולים לספק מאגר חיבורים ל-PostgreSQL.

הטמעת מעקב מקיף

כדי לקבל תובנות לגבי אשכולות ה-HA של PostgreSQL, צריך להגדיר מערכות מעקב חזקות:

  • עוקבים אחרי מדדים חשובים של PostgreSQL ושל המערכת, כמו ניצול המעבד (CPU), שימוש בזיכרון, קלט/פלט (I/O) בדיסק, פעילות ברשת וחיבורים פעילים.
  • איסוף יומני PostgreSQL, כולל יומני שרת, יומני WAL ויומני autovacuum, לניתוח מעמיק ולפתרון בעיות.
  • השתמשו בכלי מעקב ובמרכזי בקרה כדי להציג מדדים ויומנים בצורה חזותית, וכך לזהות בעיות במהירות.
  • לשלב מדדים ויומנים עם מערכות התראה כדי לקבל התראות יזומות על בעיות פוטנציאליות.

למידע נוסף על מעקב אחר מכונת Compute Engine, ראו סקירה כללית על Cloud Monitoring.

המאמרים הבאים

שותפים ביצירת התוכן

מחבר: אלכס קרצ'יו | ארכיטקט פתרונות