זמינות גבוהה וחוסן נתונים

בחירת גרסה של מאמר העזרה:

בדף הזה מתואר המושג 'זמינות גבוהה' והכלים שאנחנו ממליצים להשתמש בהם.

מידע על חוסן הנתונים

אפשר לחשוב על עמידות הנתונים במונחים של זמינות, זמן לשחזור השירות ואובדן נתונים. הזמינות נמדדת בדרך כלל במונחים של זמן פעולה רציף (uptime) ומבוטאת כאחוז הזמן שבו מסד הנתונים זמין. לדוגמה, כדי להשיג זמינות של 99.99%, מסד הנתונים לא יכול להיות מושבת יותר מ-52.6 דקות בשנה, או 4.38 דקות בחודש. הזמן שנדרש לשחזור השירות אחרי הפסקה זמנית בשירות נקרא היעד למשך ההתאוששות (RTO). כמות אובדן הנתונים המקובלת כתוצאה מהפסקה זמנית בשירות נקראת יעד להתאוששות מאסון (RPO), והיא מבוטאת כמשך הזמן שבו העסקאות אבדו. לדוגמה, אם ה-RPO הוא 10 דקות, המשמעות היא שבמקרה של כשל, יכול להיות שתאבדו נתונים של עד 10 דקות.

מקובל להגדיר יעד זמינות, או יעד למדידת רמת השירות (SLO), יחד עם יעדים ל-RTO ול-RPO. לדוגמה, עבור עומס עבודה מסוים, יכול להיות שתגדירו את ה-SLO ל-99.99%, ותדרשו גם RPO של 0, ללא אובדן נתונים בכל כשל, ו-RTO של 30 שניות. בעומס עבודה אחר, יכול להיות שתגדירו את SLO ל-99.9%, את RPO ל-5 דקות ואת RTO ל-10 דקות.

אתם יכולים להטמיע חוסן בסיסי של מסד נתונים באמצעות גיבויים של מסד הנתונים. ‫AlloyDB Omni תומך בגיבויים באמצעות pgBackRest, וגם בארכיון של קובצי Write Ahead Log ‏ (WAL) של מסד הנתונים כדי למזער את אובדן הנתונים. בגישה הזו, אם מסד הנתונים הראשי שלכם מושבת, אפשר לשחזר אותו מגיבוי עם RPO של דקות ו-RTO של דקות עד שעות, בהתאם לגודל מסד הנתונים.

אם יש לכם דרישות מחמירות יותר לגבי RPO ו-RTO, אתם יכולים להגדיר את AlloyDB Omni בתצורת זמינות גבוהה באמצעות Patroni. בארכיטקטורה הזו, יש מסד נתונים ראשי ושני מסדי נתונים במצב המתנה, או מסדי נתונים משוכפלים. אתם יכולים להגדיר את AlloyDB Omni כך שישתמש בשכפול סטרימינג רגיל של PostgreSQL כדי לוודא שכל עסקה שמתבצעת במסד הנתונים הראשי משוכפלת באופן סינכרוני לשני מסדי הנתונים המשניים. כך מתקבל RPO של אפס ו-RTO של פחות מ-60 שניות ברוב תרחישי הכשל.

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

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

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

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

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

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

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

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

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

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

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

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

  • איגום חיבורים (אופציונלי): משפר את הביצועים ואת יכולת ההתאמה של אפליקציות שמתקשרות עם מסדי הנתונים שלכם.

כלים לזמינות גבוהה

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

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

High Availability Proxy (HAProxy) הוא תוכנה בקוד פתוח שמשמשת לאיזון עומסים ולשימוש כשרת proxy באפליקציות מבוססות TCP ו-HTTP. התוכנה משמשת לשיפור הביצועים והמהימנות של אפליקציות אינטרנט על ידי חלוקת בקשות נכנסות בין כמה שרתים. ‫HAProxy מציע איזון עומסים על ידי חלוקת תנועת הרשת בין כמה שרתים. ‫HAProxy גם מבצע בדיקות תקינות כדי לשמור על מצב התקינות של שרתי הקצה העורפי שהוא מתחבר אליהם. אם שרת נכשל בבדיקת תקינות, HAProxy מפסיק לשלוח אליו תנועה עד שהוא עובר שוב את בדיקות התקינות.

שיקולים לגבי שכפול סינכרוני ואסינכרוני

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

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

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

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

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