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

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

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

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

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

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