จัดการการเก็บรักษาข้อมูลด้วยดัชนี TTL

หน้านี้อธิบายวิธีใช้ MongoDB API, คอนโซล Google Cloud และ Google Cloud CLI เพื่อกำหนดค่าดัชนี Time to Live (TTL)

ภาพรวมของ Time to Live

ใช้ดัชนี TTL เพื่อนำข้อมูลที่ไม่มีการอัปเดตออกจากฐานข้อมูลโดยอัตโนมัติ ดัชนี TTL จะกำหนดฟิลด์ที่ระบุเป็นเวลาหมดอายุของเอกสารในคอลเล็กชันที่ระบุ TTL ช่วยให้คุณลดต้นทุนพื้นที่เก็บข้อมูลได้ด้วยการล้างข้อมูลที่ล้าสมัย โดยปกติแล้ว ระบบจะลบข้อมูลภายใน 24 ชั่วโมงหลังจากเวลาหมดอายุ

ราคา

การดำเนินการลบ TTL จะใช้หน่วยการลบที่มีการจัดการ ดูราคาได้ที่ราคาของรุ่น Cloud Firestore Enterprise

ขีดจำกัดและข้อจำกัด

  • คุณสร้างดัชนี TTL ได้เพียง 1 รายการต่อคอลเล็กชัน
  • คุณมีดัชนี TTL ได้สูงสุด 500 รายการ

การลบ TTL

โปรดทราบลักษณะการทำงานที่สำคัญต่อไปนี้ของการลบที่ขับเคลื่อนด้วย TTL

  • การลบผ่าน TTL ไม่ใช่กระบวนการที่เกิดขึ้นทันที เอกสารที่หมดอายุจะยังคงปรากฏในการค้นหาและคำขอค้นหาจนกว่ากระบวนการ TTL จะลบเอกสารเหล่านั้นออกจริงๆ TTL จะแลกความทันเวลาในการลบเพื่อประโยชน์ในการลดต้นทุนรวมในการเป็นเจ้าของสำหรับการลบ โดยปกติแล้ว ระบบจะลบข้อมูลภายใน 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

ดัชนี TTL ต่างจากดัชนี Firestore อื่นๆ ตรงที่ไม่ได้ใช้ในระหว่างการวางแผนการค้นหาเพื่อเพิ่มประสิทธิภาพ หากต้องการปรับปรุงประสิทธิภาพการค้นหาในฟิลด์ที่ใช้กับ TTL คุณต้องเพิ่มฟิลด์ดังกล่าวลงในดัชนีที่ไม่ใช่ TTL แยกต่างหาก

โปรดทราบว่าเนื่องจากช่อง TTL ใช้การประทับเวลา การเพิ่มช่องดังกล่าวลงในดัชนีที่ไม่ใช่ TTL อาจทำให้เกิดฮอตสปอต ฮอตสปอตจะเกิดขึ้นเมื่อมีการเขียนและลบในอัตราสูงกระจุกตัวอยู่ในเอกสารจำนวนไม่มาก ซึ่งอาจส่งผลเสียต่อประสิทธิภาพการปรับขนาดในช่วงที่มีการเข้าชมเพื่อเขียนข้อมูลจำนวนมาก

สิทธิ์

ผู้ใช้ที่สร้างหรือวางดัชนี TTL ต้องมีสิทธิ์ต่อไปนี้ในโปรเจ็กต์

  • การดูดัชนี TTL ต้องใช้สิทธิ์ datastore.indexes.list และ datastore.indexes.get
  • การสร้างหรือการวางดัชนี TTL ต้องใช้สิทธิ์ datastore.indexes.update
  • การตรวจสอบสถานะของการดำเนินการ TTL ต้องใช้ datastore.operations.list และ datastore.operations.get

ดูบทบาทที่มอบหมายสิทธิ์เหล่านี้ได้ที่บทบาท Identity and Access Management ของ 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 ได้เพียง 1 รายการต่อคอลเล็กชัน
  • บันทึกการตรวจสอบสำหรับการสร้างดัชนี TTL ด้วย MongoDB API จะใช้ชื่อเมธอด google.firestore.admin.v1.FirestoreAdmin.UpdateField

Google Cloud Console

  1. ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล

    ไปที่ฐานข้อมูล

  2. เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล

  3. ในเมนูการนำทาง ให้คลิกระยะเวลาที่ใช้งานได้

  4. คลิก Create Policy

  5. ป้อนชื่อคอลเล็กชันและชื่อฟิลด์การประทับเวลา

  6. ไม่บังคับ: กำหนดค่าออฟเซ็ตการหมดอายุ ป้อนค่าและเลือกหน่วย (วัน ชั่วโมง นาที หรือวินาที) โดยค่าเริ่มต้น ออฟเซ็ตจะเป็น 0

  7. คลิกสร้าง

คอนโซลจะกลับไปที่หน้าระยะเวลาที่ใช้งานได้ หากการดำเนินการเริ่มต้นสำเร็จ หน้าเว็บจะเพิ่มรายการลงในตารางดัชนี 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 อาจใช้เวลาอย่างน้อย 10 นาทีขึ้นไป เมื่อเริ่มการดำเนินการแล้ว การปิดเทอร์มินัลจะไม่ยกเลิกการดำเนินการ

ดูดัชนี TTL

หากต้องการดูดัชนี TTL ให้ทำตามขั้นตอนต่อไปนี้

MongoDB API

ใช้เมธอด listIndexes() เพื่อดูดัชนี TTL เช่น

db.restaurants.listIndexes()

โปรดทราบว่าเอาต์พุตจะมีทั้งดัชนี TTL และดัชนีที่ไม่ใช่ TTL ดัชนี TTL จะมีตัวเลือก expireAfterSeconds

Google Cloud Console

  1. ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล

    ไปที่ฐานข้อมูล

  2. เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล

  3. ในเมนูการนำทาง ให้คลิกระยะเวลาที่ใช้งานได้

คอนโซลจะแสดงดัชนี 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

ใช้เมธอด 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. ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล

    ไปที่ฐานข้อมูล

  2. เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล

  3. ในเมนูการนำทาง ให้คลิกระยะเวลาที่ใช้งานได้

  4. ในตารางดัชนี TTL ให้หาแถวของดัชนี TTL ในแถวตารางนี้ ให้คลิกปุ่มลบ (ถังขยะ)

  5. คลิกลบเพื่อยืนยัน

คอนโซลจะกลับไปที่หน้าระยะเวลาที่ใช้งานได้ เมื่อดำเนินการสำเร็จ 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

firestore.googleapis.com/document/ttl_expiration_to_deletion_delays ความล่าช้าในการลบเมื่อหมดอายุของ TTL

เวลาที่ผ่านไประหว่างที่เอกสารหมดอายุภายใต้ดัชนี TTL และเวลาที่เอกสารถูกลบจริง

หากต้องการตั้งค่าแดชบอร์ดที่มีเมตริก Cloud Firestore โปรดดูหัวข้อจัดการแดชบอร์ดที่กำหนดเองและเพิ่มวิดเจ็ตแดชบอร์ด