הגדרת גרסאות ל-Object Storage להגנת נתונים

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

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

מה נשבר ללא ניהול גרסאות באחסון אובייקטים

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

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

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

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

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

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

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

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

מה נותן ניהול גרסאות: שחזור והגנה מפני מחיקה

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

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

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

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

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

השוואת מצבי שמירה: מתי איזו גישה מתאימה

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

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

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

איך לבחור מצב לפי פרופיל עומס

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

שלבי הטמעה: מביקורת אחסון ועד מסירה

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

  1. ביקורת אחסון. עורכים ספירת מלאי של דליים וקידומות, מחשבים נפח ושיעור אובייקטים פעילים, מוצאים את כל הצרכנים — שירותים, משימות גיבוי, אנליטיקה. מתעדים היכן ניהול גרסאות כבר מופעל חלקית ומאיפה מגיעות הכתיבות.
  2. פריסת מיקום ושכפול. מחליטים אילו קידומות מנהלות גרסאות, אילו עוברות למחלקה קרה, ומה משכפלים לאזור אחר. קובעים סדר מעבר בכשל אתר וזמן הפער בנתונים.
  3. הפעלת המצב. מגדירים את מצב הדלי ואת נעילת האובייקטים לנתונים בלתי משתנים, קובעים סדר לפי דליים כך ששירותים כותבים לא יקבלו שגיאות ברגע ההפעלה.
  4. הגדרת מדיניות. כללי lifecycle: מחיקת גרסאות לא רלוונטיות וסמני מחיקה, העברת עותקים ישנים למחלקה זולה, מחיקת העלאות שלא הושלמו. בנפרד — מי רשאי למחוק גרסה.
  5. בדיקת שחזור. משחזרים גרסה קודמת נקודתית ובקבוצה, בודקים התנהגות בדריסת שם, מודדים זמן שחזור ומוודאים שתיעוד יומני הגישה נכתב.
  6. מסירת תיעוד. מוסרים מפת קידומות ומדיניות, תרשים תפקידים והרשאות, הוראות לתורן לשחזור ולמחיקה, ומכשירים את המשמרת על תרחיש אמיתי.

קריטריוני מוכנות לשלב

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

מה מוסרים לידיים: מדיניות, תרשימים, נהלים

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

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

איך ארטיפקטים ממשיכים לחיות אחרי המסירה

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

מקרה בוחן: הסרנו סוג כשלים בדריסת אובייקטים

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

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

מה הראו המדדים

זמן שחזור אובייקט ירד מכמה שעות של הרכבה ידנית מגיבויים לדקות: הגרסה הנדרשת מוחזרת ממוקד לפי חתימת זמן. שיעור השחזורים המוצלחים עלה מ-40% ל-100% — אם גרסה קיימת, השחזור כבר לא תלוי בשלמות עותק הלילה. מספר האירועים מסוג "נתונים אבדו" ברבעון — אפס.

מה התברר כצוואר בקבוק

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

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

מה לעשות אם האחסון כבר מלא?

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

אפליקציות שקוראות נתונים לפי קישורים ישנים ממשיכות לעבוד — תאימות לאחור נשמרת, ואין צורך לכתוב מחדש קוד.

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

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

המגבלה המרכזית — הנפח גדל ביחס למספר הדריסות: בתיקיות פעילות האחסון גדל פי 2-5. זה מטופל במחזור חיים שמחזיק את הגרסאות האחרונות ומנקה את השאר, אחרת אחסון מלא נתקל במכסה במהירות.

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

ספקות טכניים: תאימות, עומס, הגירה

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

האם הכתיבה תאט לאחר הפעלת ניהול גרסאות?

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

האם האחסון יגדל ללא סוף?

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

האם יהיה צורך לעצור שירותים לצורך הגירה?

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

איך לקבוע תקופות שמירה?

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

מי יוכל למחוק נתונים ללא אפשרות שחזור?

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

נדבר על המשימה: נבנה תרשים ותוכנית הטמעה

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

בסיום השיחה נשלח:

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

תארו את המשימה במילים כלליות — נחזור עם הערכת מועדים ותוכנית הטמעה.