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

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

סקירה כללית של זמן חיים (TTL)

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

תמחור

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

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

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

מחיקת TTL

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

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

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

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

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

הרשאות

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

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

במאמר תפקידים בניהול הזהויות והרשאות הגישה (IAM) ב-Cloud Firestore מפורטים התפקידים שכוללים את ההרשאות האלה.

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

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

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

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

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

  • אם תשתמשו בכל סוג נתונים אחר או לא תגדירו את ערך השדה TTL, תושבת האפשרות להגדיר 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, שם ה-method הוא 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. מתקינים ומפעילים את ה-CLI של gcloud 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

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

db.restaurants.listIndexes()

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

Google Cloud Console

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

    כניסה לדף Databases

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

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

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

gcloud

  1. מתקינים ומפעילים את ה-CLI של gcloud 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. בשורה הזו בטבלה, לוחצים על הכפתור Delete (סמל פח האשפה).

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

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

gcloud

  1. מתקינים ומפעילים את ה-CLI של gcloud 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 לבין המועד שבו הוא נמחק בפועל.

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