יצירת תמונות מצב של דיסקים שתואמות לאפליקציות Linux

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

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

כדי ליצור snapshot של הדיסקים שמתאים לאפליקציה, משתמשים בתהליך הבא:

  1. כדי להכין את סביבת האורח לעקביות האפליקציה, יוצרים סקריפטים מותאמים אישית של מעטפת להפעלה לפני ואחרי צילום התמונה.
  2. מגדירים את הגדרות התמונות של מכונת ה-VM.
  3. יוצרים קובץ snapshot עם האפשרות guest-flush מופעלת. האפשרות guest-flush מפעילה את הסקריפטים שלפני ואחרי הצילום.

לפני שמתחילים

תפקידים והרשאות נדרשים

כדי לקבל את ההרשאות שדרושות ליצירת תמונת מצב עקבית של אפליקציה, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

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

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

ההרשאות הנדרשות

כדי ליצור תמונת מצב עקבית של אפליקציה, נדרשות ההרשאות הבאות:

  • compute.snapshots.create בפרויקט
  • compute.disks.createSnapshot בדיסק
  • כדי ליצור תמונת מצב של דיסק האתחול של מכונה שמצורף אליה חשבון שירות: iam.serviceAccounts.actAs בחשבון השירות של המכונה

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

סוגי דיסקים נתמכים

אתם יכולים ליצור תמונות מצב עקביות של אפליקציות עבור נפחי Persistent Disk שמצורפים למופעי Linux.

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

מגבלות

יש מגבלות על יצירת תמונות מצב עקביות של אפליקציות ב-Linux:

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

יצירת סקריפטים לפני ואחרי תמונת מצב

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

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

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

בדוגמה הבאה מוצג קוד של סקריפט לפני יצירת תמונת מצב. שימו לב לתווים #! שמופיעים בתחילת השורה.

#!/bin/bash
sudo fsfreeze -f [example-disk-location]

בדוגמת הקוד הבאה מוצג סקריפט של צילום מצב של פוסט. שימו לב לתווים #! שמופיעים בתחילת השורה.

#!/bin/bash
sudo fsfreeze -u [example-disk-location]

צריך לשמור את הסקריפטים במכונה הווירטואלית בספרייה /etc/google/snapshots/. הנתיב המלא של הסקריפט שלפני צריך להיות /etc/google/snapshots/pre.sh והנתיב המלא של הסקריפט שאחרי צריך להיות /etc/google/snapshots/post.sh.

הפניה לדיסקים ספציפיים בסקריפטים

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

הארגומנט צריך להיות בפורמט הבא:

  • דיסקים שמחוברים ל-SCSI: רשימה מופרדת בפסיקים של זוגות <target/lun>.
  • דיסקים שמצורפים ל-NVME: רשימה מופרדת בפסיקים של <nvme:namespace> זוגות.

לדוגמה, דיסק אתחול שמחובר ל-SCSI עשוי להופיע כ-1/0, ודיסק נוסף שמחובר למכונה הווירטואלית עשוי להופיע כ-2/0.

עריכת קובץ התצורה של סביבת האורח

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

  1. פותחים או יוצרים את קובץ ההגדרות של סביבת האורח.

    edit /etc/default/instance_configs.cfg
    
  2. מוסיפים את הקטע הבא לקובץ התצורה, ואז שומרים את השינויים ויוצאים מהעורך.

    [Snapshots]
    enabled = ENABLED
    timeout_in_seconds = TIMEOUT_SECONDS
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ENABLED: מגדירים את הערך true כדי להפעיל את התכונה של יצירת קובץ snapshot עקבי של האפליקציה. ערך ברירת המחדל הוא false.
    • TIMEOUT_SECONDS: מספר השניות שנדרשות לסקריפט שלפני או אחרי ה-snapshot כדי לסיים את ההרצה לפני שחלף הזמן הקצוב לתפוגה. הערך המספרי צריך להיות בין 0 ל-300. ערך ברירת המחדל הוא 60.

  3. מפעילים מחדש את Guest Agent כדי להשתמש בהגדרות התצורה החדשות.

    $ sudo systemctl restart google-guest-agent.service
    

יצירת תמונת מצב עם guest-flush מופעל

באמצעות מסוף Google Cloud ,‏ Google Cloud CLI או REST, יוצרים תמונת מצב עם האפשרות guest-flush מופעלת. הסקריפטים שלפני ואחרי הצילום מתחילים לפעול לפני ואחרי צילום התמונה.

המסוף

  1. נכנסים לדף Create a Snapshot במסוף Google Cloud .

    כניסה לדף Create a Snapshot
  2. מזינים שם לתמונת המצב.
  3. בוחרים סוג תמונת מצב. ברירת המחדל היא תמונת מצב של STANDARD, שהיא האפשרות הטובה ביותר לגיבוי לטווח ארוך ולתוכנית התאוששות מאסון (DR).

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

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

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

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

      • בוחרים באפשרות Multi-regional (אזורים מרובים) כדי ליהנות מזמינות גבוהה יותר בעלות גבוהה יותר.
      • כדי לקבל יותר שליטה על המיקום הפיזי של הנתונים בעלות נמוכה יותר, בוחרים באפשרות תמונות מצב אזוריות.
    2. בשדה Select location (בחירת מיקום), בוחרים את האזור הספציפי או את מספר האזורים שרוצים להשתמש בהם. כדי להשתמש באזור או במספר אזורים שהכי קרובים לדיסק המקור, בוחרים באפשרות Based on disk's location (על סמך המיקום של הדיסק).
  7. מסמנים את האפשרות הפעלת תמונת מצב עקבית של האפליקציה.
  8. לוחצים על Create (יצירה) כדי ליצור את התמונה.

gcloud

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

  • כדי ליצור snapshot במיקום ברירת המחדל המוגדר מראש או בהתאמה אישית בהגדרות ה-snapshot, משתמשים בפקודה gcloud compute snapshots create.

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --source-disk=SOURCE_DISK_NAME \
        --snapshot-type=SNAPSHOT_TYPE \
        --guest-flush
    
  • לחלופין, כדי לבטל את הגדרות הצילום וליצור צילום במיקום אחסון מותאם אישית, צריך לכלול את הדגל --storage-location כדי לציין איפה לאחסן את הצילום.

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --source-disk=SOURCE_DISK_NAME \
        --snapshot-type=SNAPSHOT_TYPE \
        --storage-location=STORAGE_LOCATION \
        --guest-flush
    
  • (תצוגה מקדימה) כדי ליצור תמונת מצב בהיקף אזורי באזור מותר, צריך לכלול את הדגל --region כדי לציין איפה ליצור את תמונת המצב.

    gcloud beta compute snapshots create SNAPSHOT_NAME \
        --region=SNAPSHOT_SCOPE_REGION
        --source-disk=SOURCE_DISK_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --snapshot-type=SNAPSHOT_TYPE
    

מחליפים את מה שכתוב בשדות הבאים:

  • SNAPSHOT_NAME: שם לקובץ ה-snapshot.
  • SOURCE_ZONE: האזור של דיסק המקור.
  • SOURCE_DISK_NAME: השם של נפח הדיסק שממנו רוצים ליצור קובץ snapshot.
  • SNAPSHOT_TYPE: סוג ה-snapshot, ‏ STANDARD או ARCHIVE. אם לא מציינים סוג של snapshot, נוצר STANDARD snapshot.
  • STORAGE_LOCATION: אופציונלי: בשביל תמונות מצב בהיקף גלובלי, אזור Cloud Storage או אזור Cloud Storage שבו רוצים לאחסן את תמונת המצב. אפשר לציין רק מיקום אחסון אחד.

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

  • SNAPSHOT_SCOPE_REGION: אופציונלי: אם מדובר בקובץ snapshot בהיקף אזורי, מציינים את האזור שה-snapshot מוגבל אליו. אם כוללים את הפרמטר הזה, אי אפשר להשתמש בפרמטר --storage-location. הדומיין STORAGE_LOCATION מוגדר אוטומטית ל-SNAPSHOT_SCOPE_REGION.

REST

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

  • כדי ליצור snapshot במיקום ברירת המחדל המוגדר מראש או בהתאמה אישית בהגדרות ה-snapshot, שולחים בקשת POST אל ה-method‏ snapshots.insert:

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": "SNAPSHOT_NAME",
      "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
      "snapshotType": "SNAPSHOT_TYPE",
      "guestFlush": true,
    }
    
  • לחלופין, כדי לשנות את הגדרות התמונה ולשמור אותה במיקום אחסון מותאם אישית, שולחים בקשת POST אל snapshots.insert וכוללים את המאפיין storageLocations בבקשה:

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": "SNAPSHOT_NAME",
      "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
      "snapshotType": "SNAPSHOT_TYPE",
      "storageLocations": [
          "STORAGE_LOCATION"
      ],
      "guestFlush": true,
    }
    
  • (תצוגה מקדימה) כדי ליצור snapshot בהיקף אזורי באזור מותר, שולחים בקשת POST אל ה-method‏ snapshots.insert ומגדירים את אזור היצירה:

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/regions/SNAPSHOT_SCOPE_REGION/snapshots
    {
        "name": "SNAPSHOT_NAME",
        "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
        "snapshotType": "SNAPSHOT_TYPE"
    }
    

מחליפים את מה שכתוב בשדות הבאים:

  • DESTINATION_PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור את התמונה.
  • SNAPSHOT_NAME: שם לקובץ ה-snapshot.
  • SOURCE_PROJECT_ID: מזהה הפרויקט של דיסק המקור.
  • SOURCE_ZONE: האזור של דיסק המקור.
  • SOURCE_DISK_NAME: השם של הדיסק שממנו רוצים ליצור קובץ snapshot.
  • SNAPSHOT_TYPE: סוג ה-snapshot, ‏ STANDARD או ARCHIVE. אם לא מציינים סוג של snapshot, נוצר STANDARD snapshot.
  • STORAGE_LOCATION: אופציונלי: בשביל תמונות מצב בהיקף גלובלי, אזור Cloud Storage או אזור Cloud Storage שבו רוצים לאחסן את תמונת המצב. אפשר לציין רק מיקום אחסון אחד.

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

  • SNAPSHOT_SCOPE_REGION: אופציונלי: אם מדובר בקובץ snapshot בהיקף אזורי, מציינים את האזור שה-snapshot מוגבל אליו. אם כוללים את הפרמטר הזה, אי אפשר להשתמש בפרמטר storageLocations. הדומיין STORAGE_LOCATION מוגדר אוטומטית ל-SNAPSHOT_SCOPE_REGION.

יצירת תזמון של snapshot עם guest-flush מופעל

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

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

gcloud compute resource-policies create snapshot-schedule SCHEDULE_NAME \
  --description "MY HOURLY SNAPSHOT SCHEDULE" \
  --start-time 22:00 \
  --hourly-schedule 4 \
  --guest-flush \
  --max-retention-days SNAPSHOT_RETENTION_AGE

מידע נוסף זמין במאמר מידע על תזמון של תמונות מצב לדיסקים.

פתרון בעיות

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

בדיקת היומנים

  1. נכנסים לדף Logs Explorer במסוףGoogle Cloud :

    כניסה לדף Logs Explorer

  2. מדביקים את השאילתה הבאה בחלונית של שאילתת יומן:

    resource.type="gce_disk"
    jsonPayload.event_subtype="compute.disks.createSnapshot" OR
    protoPayload.methodName="ScheduledSnapshots"
    
  3. מריצים את השאילתה ובודקים את היומנים:

    שאילתה ביומן ליצירת תמונת מצב.

בדיקת ההגדרות

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