Как управлять хранением данных с помощью индексов TTL

На этой странице рассказывается, как настроить индексы TTL с помощью API MongoDB, консоли Google Cloud и Google Cloud CLI.

Обзор времени жизни

Используйте индексы TTL, чтобы автоматически удалять устаревшие данные из баз данных. Индекс TTL указывает, что определенное поле является временем истечения срока действия документов в заданной коллекции. С помощью TTL можно снизить расходы на хранение, удаляя устаревшие данные. Обычно данные удаляются в течение 24 часов после истечения срока их хранения.

Цены

Операции удаления с использованием TTL используют управляемые единицы удаления. Информацию о ценах можно найти на странице Цены на версию Cloud Firestore Enterprise.

Ограничения

  • Для каждой коллекции можно создать только один индекс TTL.
  • Можно создать не более 500 индексов 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

В отличие от других индексов 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.

Чтобы узнать, какие роли назначают эти разрешения, ознакомьтесь со статьей 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 и временем истечения срока действия. Если для параметра expireAfterSeconds задано значение 0, срок действия определяется непосредственно по значению временной метки из поля TTL.

Обратите внимание на следующие ограничения:

  • Индексы TTL должны содержать ровно одно поле.
  • Индексы TTL не используются при планировании запросов и не повышают их производительность.
  • Для каждой коллекции можно создать только один индекс TTL.
  • Журналы аудита для создания индекса TTL с помощью API MongoDB используют название метода google.firestore.admin.v1.FirestoreAdmin.UpdateField.

Google Cloud Console

  1. В консоли Google Cloud перейдите на страницу Базы данных.

    Перейти к базам данных

  2. Выберите нужную базу данных из списка.

  3. В меню навигации нажмите Время жизни.

  4. Нажмите Создать правило.

  5. Введите название коллекции и название поля временной метки.

  6. При необходимости настройте смещение срока действия. Введите значение и выберите единицу измерения (дни, часы, минуты или секунды). По умолчанию смещение равно 0.

  7. Нажмите Создать.

Консоль вернется на страницу Время жизни. Если операция успешно запущена, на странице в таблицу индексов TTL добавляется запись. Если что-то пойдет не так, на странице появится сообщение об ошибке.

gcloud

  1. Установите и инициализируйте интерфейс командной строки gcloud CLI.

  2. Чтобы настроить индекс TTL, используйте команду firestore fields ttls update. Добавьте флаг --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 будут включать параметр expireAfterSeconds.

Google Cloud Console

  1. В консоли Google Cloud перейдите на страницу Базы данных.

    Перейти к базам данных

  2. Выберите нужную базу данных из списка.

  3. В меню навигации нажмите Время жизни.

В консоли перечислены индексы TTL для вашей базы данных и указан статус каждого индекса.

gcloud

  1. Установите и инициализируйте интерфейс командной строки gcloud CLI.

  2. Чтобы настроить индекс TTL, используйте команду firestore fields ttls list. Следующая команда позволяет получить список всех индексов TTL:

    gcloud firestore fields ttls list
    

    Чтобы получить список индексов TTL в определенной коллекции, выполните следующие действия:

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

Как посмотреть сведения об операции

Чтобы посмотреть подробную информацию об индексе TTL, который находится в состоянии CREATING, используйте команду gcloud CLI.

Чтобы посмотреть все выполняемые и недавно завершенные операции, используйте команду operations list:

gcloud firestore operations list

В ответе приводится оценка хода выполнения операции.

Как удалить индекс TTL

Чтобы удалить индекс TTL, выполните следующие действия:

MongoDB API

Чтобы удалить индекс TTL, используйте метод dropIndex(). Пример:

Как удалить индекс TTL, используя имя индекса

db.restaurants.dropIndex("ts_1")

Как удалить индекс TTL, используя определение индекса

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

Обратите внимание, что в журналах аудита для удаления индекса TTL с помощью API MongoDB используется название метода 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.

  2. Чтобы настроить индекс TTL, используйте команду firestore fields ttls update. Добавьте флаг --async, чтобы gcloud CLI не ждал завершения операции.

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

Как отслеживать удаление данных по истечении срока жизни

Вы можете использовать Cloud Monitoring, чтобы посмотреть показатели, связанные с удалением на основе TTL. Cloud Firestore предоставляет следующие показатели для времени жизни:

Тип показателя Название показателя Описание показателя
firestore.googleapis.com/document/ttl_deletion_count Количество удалений с учетом времени жизни

Общее количество документов, удаленных индексами TTL.

firestore.googleapis.com/document/ttl_expiration_to_deletion_delays Задержки при удалении из-за истечения срока жизни (TTL)

Время, прошедшее с момента истечения срока действия документа в индексе TTL и до его фактического удаления.

Чтобы настроить сводку с показателями Cloud Firestore, ознакомьтесь со статьями Как управлять специальными сводками и Как добавлять виджеты в сводки.