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

בחירת גרסת תיעוד:

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

בדיקת ההגדרה של Patroni

  1. מתחברים לאחד ממכונות ה-Patroni‏ (alloydb-patroni1,‏ alloydb-patroni2 או alloydb-patroni3) ועוברים לתיקיית Patroni של AlloyDB Omni.

    cd /alloydb/
    
  2. בודקים את היומנים של Patroni.

      sudo journalctl -u patroni
      

    הרשומות האחרונות צריכות לשקף מידע על צומת Patroni. אמורה להופיע הודעה דומה לזו שכאן למטה.

    May 16 15:10:29 alloydb-patroni1 patroni[1234]: 2024-06-12 15:10:29,020 INFO: no action. I am (patroni1), the leader with the lock
    May 16 15:10:39 alloydb-patroni1 patroni[1234]: 2024-06-12 15:10:39,010 INFO: no action. I am (patroni1), the leader with the lock
    May 16 15:10:49 alloydb-patroni1 patroni[1234]: 2024-06-12 15:10:49,007 INFO: no action. I am (patroni1), the leader with the lock
    

  3. מתחברים לכל מכונה שמריצה את Linux ויש לה קישוריות רשת למכונה הראשית של Patroni, ‏alloydb-patroni1, ומקבלים מידע על המכונה. יכול להיות שתצטרכו להתקין את הכלי jq על ידי הרצת sudo dnf install jq.

    curl -s http://alloydb-patroni1:8008/patroni | jq .
    

    הפלט אמור להיראות כך:

    {
      "state": "running",
      "postmaster_start_time": "2024-05-16 14:12:30.031673+00:00",
      "role": "master",
      "server_version": 150005,
      "xlog": {
        "location": 83886408
      },
      "timeline": 1,
      "replication": [
        {
          "usename": "alloydbreplica",
          "application_name": "patroni2",
          "client_addr": "10.172.0.40",
          "state": "streaming",
          "sync_state": "async",
          "sync_priority": 0
        },
        {
          "usename": "alloydbreplica",
          "application_name": "patroni3",
          "client_addr": "10.172.0.41",
          "state": "streaming",
          "sync_state": "async",
          "sync_priority": 0
        }
      ],
      "dcs_last_seen": 1715870011,
      "database_system_identifier": "7369600155531440151",
      "patroni": {
        "version": "3.3.0",
        "scope": "my-patroni-cluster",
        "name": "patroni1"
      }
    }
    

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

בדיקת ההגדרה של HAProxy

  1. במחשב עם דפדפן וקישוריות לרשת של צומת HAProxy, עוברים לכתובת הבאה: http://haproxy:7000. לחלופין, אתם יכולים להשתמש בכתובת ה-IP החיצונית של מכונת HAProxy במקום בשם המארח שלה.

    המסך אמור להיראות כמו בצילום המסך הבא.

    דף הסטטוס של HAProxy שבו מוצגים סטטוס התקינות והזמן שלוקח לנתונים לעבור בין צומתי Patroni

    איור 1. דף הסטטוס של HAProxy שבו מוצגים סטטוס התקינות וזמן האחזור של צמתי Patroni.

    בלוח הבקרה של HAProxy אפשר לראות את סטטוס התקינות ואת זמן האחזור של צומת Patroni הראשי, patroni1, ושל שתי הרפליקות, patroni2 ו-patroni3.

  2. אתם יכולים להריץ שאילתות כדי לבדוק את הנתונים הסטטיסטיים של הרפליקציה באשכול. מלקוח כמו pgAdmin, מתחברים לשרת מסד הנתונים הראשי דרך HAProxy ומריצים את השאילתה הבאה.

    SELECT
          pid, usename, application_name, client_addr, state, sync_state
    FROM
          pg_stat_replication;
    

    אמורה להופיע דיאגרמה דומה לזו שכאן למטה, שמראה ש-patroni2 ו-patroni3 מעבירים סטרימינג מ-patroni1.

    פלט של pg_stat_replication שמציג את מצב השכפול של צמתי Patroni

    איור 2. פלט של pg_stat_replication שמציג את מצב הרפליקציה של צומתי Patroni.

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

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

  1. במכונה הראשית של Patroni, עוברים לתיקייה AlloyDB Omni Patroni.

    cd /alloydb/
    
  2. עוצרים את הקונטיינר.

    sudo systemctl stop patroni
    

    הפלט אמור להיראות כך: הפעולה הזו אמורה לאמת שהקונטיינר והרשת הופסקו.

    patroni.service - Runner for Patroni
       Loaded: loaded (/etc/systemd/system/patroni.service; enabled; vendor preset: disabled)
       Active: inactive (dead) since ...
    

  3. מרעננים את לוח הבקרה של HAProxy ורואים איך מתבצע מעבר הגיבוי האוטומטי.

    לוח הבקרה של HAProxy שמציג את יתירות הכשל מהצומת הראשי לצומת ההמתנה

    איור 3. לוח הבקרה של HAProxy שבו מוצג מעבר אוטומטי מכשל מהצומת הראשי לצומת ההמתנה.

    מכונה patroni3 הפכה למכונה הראשית החדשה, ו-patroni2 היא הרפליקה היחידה שנותרה. השרת הראשי הקודם, patroni1, מושבת ובדיקות התקינות שלו נכשלות.

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

  4. מלקוח כמו pgAdmin, מתחברים לשרת מסד הנתונים דרך HAProxy ובודקים את נתוני הרפליקציה באשכול אחרי יתירות כשל.

    SELECT
          pid, usename, application_name, client_addr, state, sync_state
    FROM
          pg_stat_replication;
    

    אמורה להופיע דיאגרמה דומה לזו שכאן למטה, שבה רואים שרק patroni2 משדר עכשיו.

    פלט של pg_stat_replication שמציג את מצב הרפליקציה של צומתי Patroni אחרי יתירות כשל

    איור 4. פלט של pg_stat_replication שמציג את מצב הרפליקציה של צומתי Patroni אחרי יתירות כשל.

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

    לוח הבקרה של HAProxy שמציג את יתירות הכשל מהצומת הראשי, patroni3, לצומת ההמתנה, patroni2

    איור 5. לוח הבקרה של HAProxy שמציג את המעבר לגיבוי כשל משרת ראשי, patroni3, לשרת בהמתנה, patroni2.

שיקולים לגבי חלופות

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

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

לוח הבקרה של HAProxy שבו מוצג השחזור של patroni1 ו-patroni3 כצמתים במצב המתנה

איור 6. לוח הבקרה של HAProxy שמציג את השחזור של patroni1 ושל patroni3 כצמתים במצב המתנה.

עכשיו patroni1 ו-patroni3 משוכפלים מהמכונה הראשית הנוכחית patroni2.

פלט של pg_stat_replication שמציג את מצב הרפליקציה של צומתי Patroni אחרי החזרה למצב הקודם

איור 7. פלט של pg_stat_replication שמציג את מצב השכפול של צמתי Patroni אחרי הגיבוי.

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