ניהול שמירת נתונים באמצעות אינדקסים של TTL

בדף הזה מוסבר איך להשתמש ב-MongoDB API, במסוף Google Cloud וב-Google Cloud CLI כדי להגדיר אינדקסים של זמן חיים (TTL).

סקירה כללית של אורך חיים (TTL)

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

תמחור

פעולות מחיקה של TTL משתמשות ביחידות מחיקה מנוהלות. למידע על תמחור, אפשר לעיין בCloud Firestoreתמחור מהדורת Enterprise.

מגבלות ואילוצים

  • אפשר ליצור רק אינדקס TTL אחד לכל אוסף.
  • אפשר להגדיר עד 500 אינדקסים של TTL.

מחיקה של TTL

חשוב לשים לב להתנהגויות העיקריות הבאות של מחיקה שמבוססת על TTL:

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

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

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

  • המסמכים לא נמחקים בהכרח לפי סדר התפוגה שלהם.

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

  • ‫Cloud Firestore תמיד יתייחס לשדה TTL העדכני ביותר כדי לקבוע את תאריך התפוגה. לדוגמה, אם מסמך שתוקפו פג אבל עדיין לא נמחק, השדה TTL שלו מתעדכן לתאריך מאוחר יותר, תוקף המסמך לא יפוג והתאריך החדש ישמש כנקודת הסיום.

  • ‫Cloud Firestore יפוג תוקף של מסמך רק אם השדה TTL מוגדר לערך Date and time/BSON Date או לערך Array שמכיל ערך Date and time/BSON Date. כדי להשבית את התפוגה של מסמך מסוים, משאירים את השדה ריק או מגדירים בו ערך כמו null.

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

הבדלים במדדי ה-TTL

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

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

הרשאות

לחשבון המשתמש שיוצר או מסיר אינדקס TTL צריכה להיות ההרשאה הבאה בפרויקט:

  • כדי לראות את האינדקסים של TTL, צריך את ההרשאות datastore.indexes.list ו-datastore.indexes.get.
  • כדי ליצור או להסיר אינדקסים של TTL, צריך את ההרשאה datastore.indexes.update.
  • כדי לבדוק את הסטטוס של פעולות TTL, צריך להשתמש ב-datastore.operations.list וב-datastore.operations.get.

למידע על תפקידים שמקצים את ההרשאות האלה, ראו Cloud Firestore תפקידים בניהול זהויות והרשאות גישה.

יצירת אינדקס TTL

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

התכונה TTL משתמשת בשדה שצוין כדי לזהות מסמכים שעומדים בדרישות למחיקה. בשדה TTL צריך להגדיר ערך של Timestamp/BSON Date או ערך של Array שכולל ערך של Timestamp/BSON Date. אפשר לבחור שדה שכבר קיים או לציין שדה שמתכננים להוסיף בהמשך.

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

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

  • אם משתמשים בסוג נתונים אחר או לא מגדירים את הערך של השדה TTL, משך החיים של המסמך הספציפי מושבת.

כדי ליצור אינדקס TTL, פועלים לפי השלבים הבאים:

MongoDB API

כוללים את אפשרות האינדקס expireAfterSeconds כשמבצעים קריאה לשיטה createIndex():

db.COLLECTION_NAME.createIndex({"TTL_FIELD": 1, "expireAfterSeconds": EXPIRATION_OFFSET_SECONDS})

לדוגמה:

db.restaurants.createIndex({"ts": 1, "expireAfterSeconds": 3600})

‫expireAfterSeconds מזהה את ה-TTL כאינדקס TTL והוא ההיסט בין ערך חותמת הזמן מהשדה TTL לבין זמן התפוגה. אם expireAfterSeconds מוגדר כ-0, מועד התפוגה ניתן ישירות על ידי ערך חותמת הזמן מהשדה TTL.

חשוב לשים לב למגבלות הבאות:

  • אינדקסים של TTL חייבים לכלול שדה אחד בדיוק.
  • אינדקסים של TTL לא משמשים בתכנון שאילתות, והם לא משפרים את הביצועים של שאילתות.
  • אפשר ליצור רק אינדקס TTL אחד לכל אוסף.
  • יומני ביקורת ליצירת אינדקס TTL באמצעות MongoDB API משתמשים בשם השיטה google.firestore.admin.v1.FirestoreAdmin.UpdateField.

Google Cloud Console

  1. נכנסים לדף Databases במסוף Google Cloud.

    לדף Databases

  2. בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.

  3. בתפריט הניווט, לוחצים על Time-to-live (זמן החיים).

  4. לוחצים על יצירת מדיניות.

  5. מזינים שם לאוסף ושם לשדה של חותמת הזמן.

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

  7. לוחצים על יצירה.

המסוף חוזר לדף Time-to-live. אם הפעולה מתחילה בהצלחה, הדף מוסיף רשומה לטבלה של אינדקסים של TTL. אם הפעולה נכשלת, מוצגת בדף הודעת שגיאה.

gcloud

  1. מתקינים ומפעילים את gcloud CLI CLI.

  2. משתמשים בפקודה firestore fields ttls update כדי להגדיר אינדקס TTL. מוסיפים את הדגל --async כדי למנוע מהפקודה gcloud CLI להמתין לסיום הפעולה.

     gcloud firestore fields ttls update \
      ttl_field \
      --collection-group=collection_name \
      --enable-ttl 

    כדי להפעיל אינדקס TTL עם היסט של תפוגה, מוסיפים את הדגל --expiration-offset:

     gcloud firestore fields ttls update \
      ttl_field \
      --collection-group=collection_name \
      --enable-ttl \
      --expiration-offset=expiration_offset 

    מחליפים את expiration_offset במשך זמן, לדוגמה, 7d ל-7 ימים או 24h ל-24 שעות. אם לא מציינים את הדגל הזה, ערך ברירת המחדל של ההיסט של תאריך התפוגה הוא 0.

משך יצירת אינדקס TTL

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

צפייה באינדקסים של TTL

כדי לראות את האינדקסים של TTL, פועלים לפי השלבים הבאים:

MongoDB API

משתמשים בשיטה listIndexes() כדי להציג את האינדקסים של TTL. לדוגמה:

db.restaurants.listIndexes()

שימו לב שהפלט יכלול גם אינדקסים של TTL וגם אינדקסים שלא מוגדר להם TTL. אינדקסים עם TTL יכללו את האפשרות expireAfterSeconds.

Google Cloud Console

  1. נכנסים לדף Databases במסוף Google Cloud.

    לדף Databases

  2. בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.

  3. בתפריט הניווט, לוחצים על Time-to-live (זמן החיים).

במסוף מוצגים אינדקסים של TTL עבור מסד הנתונים, כולל הסטטוס של כל אינדקס.

gcloud

  1. מתקינים ומפעילים את gcloud CLI CLI.

  2. משתמשים בפקודה firestore fields ttls list כדי להגדיר אינדקס TTL. הפקודה הבאה מציגה רשימה של כל האינדקסים של TTL.

    gcloud firestore fields ttls list
    

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

    gcloud firestore fields ttls list  --collection-group=collection_name
    

צפייה בפרטי הפעולה

אפשר להשתמש בgcloud CLI כדי לראות פרטים נוספים על אינדקס TTL שנמצא במצב CREATING.

משתמשים בפקודה operations list כדי לראות את כל הפעולות שפועלות ואת הפעולות שהסתיימו לאחרונה:

gcloud firestore operations list

התשובה כוללת הערכה של התקדמות הפעולה.

הסרה של אינדקס TTL

כדי להסיר אינדקס TTL, פועלים לפי השלבים הבאים:

MongoDB API

משתמשים ב-method ‏dropIndex() כדי להסיר אינדקס TTL. לדוגמה:

הסרת אינדקס TTL באמצעות שם האינדקס

db.restaurants.dropIndex("ts_1")

מחיקת אינדקס TTL באמצעות הגדרת האינדקס

db.restaurants.dropIndex({"ts": 1})

שימו לב: יומני הביקורת של הפלת אינדקס TTL באמצעות MongoDB API משתמשים בשם השיטה google.firestore.admin.v1.FirestoreAdmin.UpdateField.

Google Cloud Console

  1. נכנסים לדף Databases במסוף Google Cloud.

    לדף Databases

  2. בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.

  3. בתפריט הניווט, לוחצים על Time-to-live (זמן החיים).

  4. בטבלת אינדקס ה-TTL, מוצאים את השורה של אינדקס ה-TTL. בשורה הזו בטבלה, לוחצים על הלחצן מחיקה (סמל של פח אשפה).

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

המסוף חוזר לדף Time-to-live. במקרה של הצלחה, ‫Cloud Firestore מסיר את אינדקס ה-TTL מהטבלה.

gcloud

  1. מתקינים ומפעילים את gcloud CLI CLI.

  2. משתמשים בפקודה firestore fields ttls update כדי להגדיר אינדקס TTL. מוסיפים את הדגל --async כדי למנוע מהפקודה gcloud CLI להמתין לסיום הפעולה.

    gcloud firestore fields ttls update ttl_field --collection-group=collection_name --disable-ttl
    

מעקב אחרי מחיקות של נתונים לפי TTL

אפשר להשתמש ב-Cloud Monitoring כדי לראות מדדים לגבי מחיקות שמבוססות על TTL. ב-Cloud Firestore מוצגים המדדים הבאים לגבי TTL:

סוג מדד שם המדד תיאור המדד
firestore.googleapis.com/document/ttl_deletion_count מספר המחיקות של נתונים שהגיע אורך חיים (TTL)

המספר הכולל של מסמכים שנמחקו על ידי אינדקסים של TTL.

firestore.googleapis.com/document/ttl_expiration_to_deletion_delays עיכובים במחיקה בגלל תפוגת תוקף (TTL)

הזמן שחלף בין המועד שבו תוקף המסמך פג במסגרת אינדקס TTL לבין המועד שבו הוא נמחק בפועל.

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