ניהול שמירת הנתונים באמצעות אינדקסים של TTL
בדף הזה מוסבר איך להגדיר אינדקסים של זמן חיים (TTL) באמצעות MongoDB API, מסוף Google Cloud ו-Google Cloud CLI.
סקירה כללית של זמן חיים (TTL)
כדי להסיר באופן אוטומטי נתונים ישנים ממסדי הנתונים, השתמשו באינדקסים של TTL. אינדקס TTL מגדיר שדה מסוים כזמן התפוגה של מסמכים באוסף נתון. בעזרת TTL אפשר להפחית את עלויות האחסון על ידי ניקוי נתונים מיושנים. בדרך כלל הנתונים נמחקים תוך 24 שעות אחרי מועד התפוגה שלהם.
תמחור
פעולות מחיקה של TTL משתמשות ביחידות מחיקה מנוהלות. למידע על המחירים, ראו התמחור של מהדורת Firestore Enterprise.
מגבלות ואילוצים
- אפשר ליצור רק אינדקס TTL אחד לכל אוסף.
- אפשר להגדיר עד 500 אינדקסים של TTL.
מחיקת TTL
שימו לב להתנהגויות העיקריות הבאות של מחיקה מבוססת-TTL:
המחיקה באמצעות TTL היא לא תהליך מיידי. מסמכים שפג תוקפם ממשיכים להופיע בשאילתות ובבקשות חיפוש עד שתהליך ה-TTL מוחק אותם בפועל. ה-TTL מחליף את העמידה בזמנים של מחיקת הנתונים לטובת עלות בעלות כוללת (TCO) נמוכה יותר למחיקות. בדרך כלל הנתונים נמחקים תוך 24 שעות אחרי מועד התפוגה שלהם.
יצירת אינדקס TTL באוסף קיים גורמת למחיקה בכמות גדולה של כל הנתונים שפג תוקפם, בהתאם לאינדקס ה-TTL החדש. חשוב לזכור שגם מחיקת הנתונים בכמות גדולה לא מתבצעת באופן מיידי, ומשך הזמן תלוי בכמות הנתונים שקיימים באוסף.
אם למסמך יש זמן תפוגה בעבר ואתם מוסיפים אינדקס TTL חדש לאוסף, המסמך יימחק תוך 24 שעות מרגע שהגדרת אינדקס ה-TTL תסתיים והוא יהפוך לפעיל.
TTL לא בהכרח מוחק מסמכים לפי הסדר של חותמות הזמן של התפוגה שלהם.
המחיקות לא מתבצעות כטרנזקציות. מסמכים עם אותו זמן תפוגה לא בהכרח נמחקים באותו זמן. אם אתם צריכים את ההתנהגות הזו, בצעו את המחיקות באמצעות ספריית לקוח.
Firestore עם תאימות ל-MongoDB תמיד יכבד את שדה ה-TTL האחרון כדי לקבוע את תאריך התפוגה. לדוגמה, אם מעדכנים את שדה ה-TTL של מסמך שפג תוקפו אבל עדיין לא נמחק לתאריך מאוחר יותר, תוקף המסמך לא יפוג וייעשה שימוש בתאריך החדש.
ב-Firestore עם תאימות ל-MongoDB, התוקף של מסמך פג רק אם בשדה 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.
במאמר תפקידים בניהול הזהויות והרשאות הגישה ב-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
נכנסים לדף Databases במסוף Google Cloud .
בוחרים את מסד הנתונים הרצוי מרשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Time-to-live.
לוחצים על יצירת מדיניות.
מזינים שם של אוסף ושם של שדה חותמת זמן.
אופציונלי: מגדירים היסט תפוגה. מזינים ערך ובוחרים יחידה (ימים, שעות, דקות או שניות). כברירת מחדל, ההיסט הוא 0.
לוחצים על יצירה.
המסוף חוזר לדף Time-to-live. אם הפעולה מתחילה בהצלחה, הדף מוסיף רשומה לטבלת האינדקסים של TTL. אם הפעולה נכשלת, מוצגת בדף הודעת שגיאה.
gcloud
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
משתמשים בפקודה
firestore fields ttls updateכדי להגדיר אינדקס TTL. מוסיפים את הדגל--asyncכדי למנוע מה-CLI של gcloud להמתין עד שהפעולה תסתיים.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
נכנסים לדף Databases במסוף Google Cloud .
בוחרים את מסד הנתונים הרצוי מרשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Time-to-live.
במסוף מופיעה רשימה של אינדקסי TTL של מסד הנתונים, כולל הסטטוס של כל אינדקס.
gcloud
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
משתמשים בפקודה
firestore fields ttls listכדי להגדיר אינדקס TTL. הפקודה הבאה מציגה רשימה של כל אינדקסי ה-TTL.gcloud firestore fields ttls list
כדי להציג רשימה של אינדקסי TTL באוסף ספציפי, משתמשים בפקודה הבאה:
gcloud firestore fields ttls list --collection-group=collection_name
הצגת פרטי הפעולה
אתם יכולים להשתמש ב-CLI של gcloud כדי לראות פרטים נוספים על אינדקס 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
נכנסים לדף Databases במסוף Google Cloud .
בוחרים את מסד הנתונים הרצוי מרשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Time-to-live.
בטבלת האינדקסים של TTL, מוצאים את השורה של האינדקס הרלוונטי. בשורה הזו בטבלה, לוחצים על הכפתור Delete (סמל פח האשפה).
לוחצים על מחיקה כדי לאשר את הפעולה.
המסוף חוזר לדף Time-to-live. אם הפעולה תצליח, Firestore עם תאימות ל-MongoDB יסיר את אינדקס ה-TTL מהטבלה.
gcloud
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
משתמשים בפקודה
firestore fields ttls updateכדי להגדיר אינדקס TTL. מוסיפים את הדגל--asyncכדי למנוע מה-CLI של gcloud להמתין עד שהפעולה תסתיים.gcloud firestore fields ttls update ttl_field --collection-group=collection_name --disable-ttl
מעקב אחרי מחיקות TTL
אתם יכולים להשתמש ב-Cloud Monitoring כדי לראות מדדים לגבי מחיקות שמבוססות על TTL. Firestore עם תאימות ל-MongoDB מספק את המדדים הבאים ל-TTL:
| סוג מדד | שם המדד | תיאור המדד |
|---|---|---|
| firestore.googleapis.com/document/ttl_deletion_count | מספר המחיקות של זמן חיים (TTL) |
המספר הכולל של מסמכים שנמחקו על ידי אינדקסי TTL. |
| firestore.googleapis.com/document/ttl_expiration_to_deletion_delays | עיכובים במחיקה של פריטים שפג תוקפם |
הזמן שחלף בין מועד התפוגה של מסמך לפי אינדקס TTL לבין המועד שבו הוא נמחק בפועל. |
כדי להגדיר מרכז בקרה עם מדדים של Firestore עם תאימות ל-MongoDB, קראו את המאמרים ניהול מרכז בקרה בהתאמה אישית והוספת ווידג'טים למרכז הבקרה.