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

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

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

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

ราคา

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

ข้อจำกัดและข้อกำหนด

  • คุณสร้างดัชนี 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

ดูบทบาทที่มอบหมายสิทธิ์เหล่านี้ได้ที่Cloud Firestoreบทบาท Identity and Access Management

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

Google Cloud Console

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

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

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

  3. ในเมนูการนำทาง ให้คลิก Time to Live

  4. คลิก Create Policy

  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 อาจใช้เวลาอย่างน้อย 10 นาทีหรือนานกว่านั้น เมื่อเริ่มการดำเนินการแล้ว การปิดเทอร์มินัลจะไม่ยกเลิกการดำเนินการ

ดูดัชนี TTL

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

MongoDB API

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

db.restaurants.listIndexes()

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

Google Cloud Console

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

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

  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

ใช้เมธอด 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. ในเมนูการนำทาง ให้คลิก 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 จำนวนการลบ Time to Live

จำนวนเอกสารทั้งหมดที่ดัชนี TTL ลบ

firestore.googleapis.com/document/ttl_expiration_to_deletion_delays การหน่วงเวลาการหมดอายุถึงการลบ Time to Live

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

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