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

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

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

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

Цены

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

Ограничения

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

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

О ролях, которые назначают эти разрешения, рассказывается в статье Роли 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

При вызове метода createIndex() включите параметр индекса expireAfterSeconds:

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 используется название метода google.firestore.admin.v1.FirestoreAdmin.UpdateField.

Google Cloud Console

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

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

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

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

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

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

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

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

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

gcloud

  1. Установите и инициализируйте gcloud CLI 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 может занять не менее 10 минут. Если вы закроете терминал, операция не будет отменена.

Как посмотреть индексы TTL

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

MongoDB API

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

db.restaurants.listIndexes()

Обратите внимание, что выходные данные будут включать как индексы TTL, так и индексы, не относящиеся к TTL. Индексы TTL будут включать параметр expireAfterSeconds.

Google Cloud Console

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

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

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

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

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

gcloud

  1. Установите и инициализируйте gcloud CLI 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 с помощью MongoDB API используется название метода google.firestore.admin.v1.FirestoreAdmin.UpdateField.

Google Cloud Console

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

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

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

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

  4. В таблице индексов TTL найдите строку с нужным индексом. В этой строке таблицы нажмите кнопку Удалить (значок корзины).

  5. Подтвердите действие, нажав Удалить.

Вы вернетесь на страницу Срок жизни. В случае успеха Cloud Firestore удаляет индекс TTL из таблицы.

gcloud

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

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

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