Работа с восстановлением на момент времени (PITR)

На этой странице описывается, как использовать восстановление на определенный момент времени (PITR) для сохранения и восстановления данных в Cloud Firestore .

Чтобы понять концепции PITR, см . раздел Восстановление на определенный момент времени .

Разрешения

Чтобы получить разрешения, необходимые для управления настройками PITR, попросите администратора предоставить вам следующие роли IAM в проекте, в котором вы хотите включить PITR:

  • Владелец облачного хранилища данных ( roles/datastore.owner )

Для пользовательских ролей убедитесь, что предоставлены следующие разрешения:

  • Чтобы включить PITR при создании базы данных: datastore.databases.create
  • Чтобы обновить настройки PITR в существующей базе данных: datastore.databases.update , datastore.databases.list
  • Для чтения данных PITR: datastore.databases.get , datastore.entities.get , datastore.entities.list
  • Для экспорта данных PITR: datastore.databases.export
  • Для импорта данных PITR: datastore.databases.import

Прежде чем начать

Прежде чем начать использовать PITR, обратите внимание на следующие моменты:

  • Вы не сможете начать чтение данных за последние семь дней сразу после включения PITR.
  • Если вы хотите включить PITR при создании базы данных, необходимо использовать команду gcloud firestore databases create . Включение PITR при создании базы данных с помощью консоли Google Cloud не поддерживается.
  • Cloud Firestore начинает сохранять версии с момента включения PITR.
  • После отключения PITR вы не сможете прочитать данные PITR в окне PITR.
  • Если вы снова включите PITR сразу после его отключения, предыдущие данные PITR станут недоступны. Все данные PITR, созданные до отключения PITR, будут удалены по истечении срока действия PITR.
  • Если вы случайно удалили данные в течение последнего часа и PITR отключен, вы можете восстановить свои данные, включив PITR в течение одного часа после удаления.
  • Любое чтение устаревших данных PITR завершается неудачей.

Включить PITR

Перед использованием PITR включите биллинг для вашего проекта Google Cloud . Функциональность PITR доступна только для проектов Google Cloud с включённым биллингом.

Чтобы включить PITR для вашей базы данных:

Консоль

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

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

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

  3. В навигационном меню нажмите Аварийное восстановление .

  4. Нажмите «Изменить» , чтобы изменить настройки.

  5. Установите флажок Включить восстановление на определенный момент времени , а затем нажмите кнопку Сохранить .

Включение PITR влечёт за собой расходы на хранение. Подробнее см. в разделе «Цены» .

Чтобы отключить PITR, снимите флажок Включить восстановление на определенный момент времени на странице «Аварийное восстановление» в консоли Google Cloud.

gcloud

Включите PITR во время создания базы данных с помощью команды gcloud firestore databases create и --enable-ptir следующим образом:

gcloud firestore databases create\
  --location=LOCATION\
  --database=DATABASE_ID\
  --type=firestore-native\
  --enable-pitr

Замените значения следующим образом:

  • LOCATION - место, где вы хотите создать базу данных.
  • DATABASE_ID — задается идентификатор базы данных.

Вы можете отключить PITR с помощью команды gcloud firestore databases update следующим образом:

gcloud firestore databases update\
  --database=DATABASE_ID\
  --no-enable-pitr

Замените значения следующим образом:

  • DATABASE_ID — задается идентификатором базы данных или (по умолчанию).

Получите период хранения и время самой ранней версии

Консоль

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

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

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

  3. В навигационном меню нажмите Аварийное восстановление .

  4. В разделе «Настройки» обратите внимание на период хранения и время самой ранней версии .

    • Срок хранения : период, в течение которого Cloud Firestore хранит все версии данных базы данных. Значение составляет один час при отключенном PITR и семь дней при включенном PITR.
    • Время самой ранней версии : самая ранняя временная метка, с которой более старые версии данных могут быть прочитаны в окне PITR. Это значение постоянно обновляется Cloud Firestore и становится устаревшим в момент запроса. Если вы используете это значение для восстановления данных, обязательно учитывайте время с момента запроса значения до момента начала восстановления.
    • Восстановление на определенный момент времени : отображается Enabled , если PITR включен. Если PITR отключен, отображается Disabled .

gcloud

Запустите команду gcloud firestore databases describe следующим образом:

gcloud firestore databases describe --database=DATABASE_ID

Замените DATABASE_ID на идентификатор базы данных или '(default)' .

Вот что получилось:

    appEngineIntegrationMode: ENABLED
    concurrencyMode: PESSIMISTIC
    createTime: '2021-03-24T17:02:35.234Z'
    deleteProtectionState: DELETE_PROTECTION_DISABLED
    earliestVersionTime: '2023-06-12T16:17:25.222474Z'
    etag: IIDayqOevv8CMNTvyNK4uv8C
    keyPrefix: s
    locationId: nam5
    name: projects/PROJECT_ID/databases/DATABASE_ID
    pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
    type: FIRESTORE_NATIVE
    uid: 5230c382-dcd2-468f-8cb3-2a1acfde2b32
    updateTime: '2021-11-17T17:48:22.171180Z'
    versionRetentionPeriod: 3600s

где,

  • earliestVersionTime : временная метка самых ранних сохраненных данных PITR.
  • pointInTimeRecoveryEnablement : отображается POINT_IN_TIME_RECOVERY_ENABLED , если PITR включён. Если PITR отключён, вы либо увидите POINT_IN_TIME_RECOVERY_DISABLED , либо поле pointInTimeRecoveryEnablement может не отображаться.
  • versionRetentionPeriod : период хранения данных PITR в миллисекундах. Значение может составлять один час, если PITR отключен, или семь дней, если PITR включен.

Чтение данных PITR

Вы можете прочитать данные PITR, используя клиентские библиотеки, методы REST API или коннектор FirestoreIO Apache Beam.

Клиентские библиотеки

Ява

Для чтения данных PITR необходимо использовать транзакцию ReadOnly . Непосредственно указывать readTime при чтении невозможно. Подробнее см. в разделе «Транзакции и пакетная запись» .

  Firestore firestore = 

  TransactionOptions options =
          TransactionOptions.createReadOnlyOptionsBuilder()
              .setReadTime(
                  com.google.protobuf.Timestamp.newBuilder()
                      .setSeconds(1684098540L)
                      .setNanos(0))
              .build();

  ApiFuture<Void> futureTransaction = firestore.runTransaction(
              transaction -> {
                // Does a snapshot read document lookup
                final DocumentSnapshot documentResult =
                    transaction.get(documentReference).get();

                // Executes a snapshot read query
                final QuerySnapshot queryResult =
                  transaction.get(query).get();
              },
              options);

  // Blocks on transaction to complete
  futureTransaction.get();

Узел

Для чтения данных PITR необходимо использовать транзакцию ReadOnly . Нельзя напрямую указать readTime при чтении. Подробнее см. в разделе «Транзакции и пакетная запись» .

const documentSnapshot = await firestore.runTransaction(
    updateFunction => updateFunction.get(documentRef),
    {readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);

const querySnapshot = await firestore.runTransaction(
    updateFunction => updateFunction.get(query),
    {readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);

REST API

Чтения PITR поддерживаются во всех методах чтения Cloud Firestore , а именно get , list , batchGet , listCollectionIds , listDocuments , runQuery , runAggregationQuery и partitionQuery .

Чтобы выполнить чтение с использованием методов REST, попробуйте один из следующих вариантов:

  1. В запросе метода чтения передайте значение readTime в качестве поддерживаемой временной метки PITR в методе readOptions . Временная метка PITR может быть либо с точностью до микросекунды в течение последнего часа, либо с точностью до целой минуты за пределами последнего часа, но не ранее, чем earliestVersionTime .

  2. Используйте параметр readTime вместе с методом BeginTransaction как часть транзакции ReadOnly для нескольких чтений PITR.

Apache Beam

Используйте коннектор Cloud Firestore IO Apache Beam для чтения или записи документов в базе данных Cloud Firestore в больших масштабах с помощью Dataflow.

Чтения PITR поддерживаются следующим методом чтения коннектора ввода-вывода Cloud Firestore . Эти методы чтения поддерживают метод withReadTime(@Nullable Instant readTime) , который можно использовать для чтения PITR:

Ява

Следующий код можно использовать с примером конвейера Dataflow для массовых операций чтения или записи. В примере используется метод withReadTime(@Nullable Instant readTime) для чтения PITR.

  Instant readTime = Instant.ofEpochSecond(1684098540L);

  PCollection<Document> documents =
      pipeline
          .apply(Create.of(collectionId))
          .apply(
              new FilterDocumentsQuery(
                  firestoreOptions.getProjectId(), firestoreOptions.getDatabaseId()))
          .apply(FirestoreIO.v1().read().runQuery().withReadTime(readTime).withRpcQosOptions(rpcQosOptions).build())
  ...

Полный список примеров readTime в конвейере Dataflow см. в репозитории Github .

Экспорт и импорт из данных PITR

Вы можете экспортировать базу данных PITR в Cloud Storage с помощью команды gcloud firestore export . Вы можете экспортировать данные PITR с меткой времени в течение целых минут в течение последних семи дней, но не ранее самой ранней версии (the earliestVersionTime . Если данные по указанной метке времени отсутствуют, операция экспорта завершается ошибкой.

Операция экспорта PITR поддерживает все фильтры, включая экспорт всех документов и экспорт определенных коллекций.

  1. Экспортируйте базу данных, указав параметр snapshot-time для выбранной временной метки восстановления.

    gcloud

    Выполните следующую команду, чтобы экспортировать базу данных в ваш контейнер.

    gcloud firestore export gs://BUCKET_NAME_PATH \
        --snapshot-time=PITR_TIMESTAMP \
        --collection-ids=COLLECTION_IDS \
        --namespace-ids=NAMESPACE_IDS
    

    Где,

    • BUCKET_NAME_PATH — допустимый контейнер Cloud Storage с необязательным префиксом пути, где хранятся экспортированные файлы.
    • PITR_TIMESTAMP — временная метка PITR с точностью до минуты, например, 2023-05-26T10:20:00.00Z или 2023-10-19T10:30:00.00-07:00 .
    • COLLECTION_IDS — список идентификаторов коллекций или идентификаторов групп коллекций, например 'specific-collection-group1','specific-collection-group2' .
    • NAMESPACE_IDS — список идентификаторов пространств имен, например 'customer','orders' .

    Перед экспортом данных PITR обратите внимание на следующие моменты:

    • Укажите временную метку в формате RFC 3339. Например, 2023-05-26T10:20:00.00Z или 2023-10-19T10:30:00.00-07:00 .
    • Убедитесь, что указанная вами временная метка представляет собой целую минуту в пределах последних семи дней, но не ранее, чем earliestVersionTime . Если данные по указанной временной метке отсутствуют, генерируется ошибка. Временная метка должна представлять собой целую минуту, даже если указанное время находится в пределах последнего часа.
    • Плата за неудачный экспорт PITR не взимается.
  2. Импорт в базу данных.

    Чтобы импортировать экспортированную базу данных, выполните действия, описанные в разделе «Импорт всех документов» . Если в базе данных уже есть какой-либо документ, он будет перезаписан.