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