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