Дерево метаинформации

В данном разделе приведено описание Кипариса — дерева метаинформации. Кипарис содержит в себе различную системную информацию, а также данные о том, где хранятся пользовательские данные. Раздел состоит из трех частей, описывающих общее представление дерева, атрибуты узлов Кипариса и TTL для узлов Кипариса.

Общее представление дерева

С пользовательской точки зрения Кипарис похож на дерево файловой системы в Linux, но имеет ряд существенных отличий. Во-первых, с каждым узлом в дереве связан набор атрибутов, в том числе задаваемых пользователем. Во-вторых, дерево является транзакционным. В третьих, в качестве узла Кипариса могут быть не только файлы и директории, но и другие объекты. По аналогии с файловой системой в Кипарисе поддерживается система контроля доступов.

Корневым элементом Кипариса является /, который имеет тип map_node (то есть является директорией). Адресация узлов в Кипарисе осуществляется с помощью YPath.

Примеры путей: //tmp – временная директория, //tmp/@ – атрибуты этой директории, //tmp/table/@type – путь до атрибута type узла //tmp/table.

С использованием YPath Кипарис может быть изображен следующим образом:

/
  /home
    /user1
      /table
        /@id
        /@chunk_ids
        /@type
        ...
      ...
    /user2
    ...
  /tmp
  /sys
    /chunks
      ...
    ...
  ...

С Кипарисом можно работать с помощью CLI.

Атрибуты узлов Кипариса

Помимо атрибутов, общих для всех объектов, узлы Кипариса имеют дополнительные атрибуты, представленные в таблице:

Атрибут Тип Значение
parent_id string Идентификатор узла-родителя (отсутствует в корне)
locks array<Lock> Список блокировок, взятых на узел
lock_mode LockMode Текущий режим блокировки узла (зависит от транзакции)
path string Полный путь к узлу
key string Ключ, по которому данный узел доступен в родительском каталоге (если узел лежит в таковом)
creation_time DateTime Время создания узла
modification_time DateTime Время последней модификации узла
access_time DateTime Время последнего доступа к узлу
expiration_time DateTime Время, когда узел будет автоматически удален. Опциональный атрибут
expiration_timeout DateTime Интервал времени, после которого узел будет автоматически удален, если к нему не было обращений. Опциональный атрибут
access_counter integer Количество обращений к узлу с момента создания
revision integer Ревизия узла
resource_usage ClusterResources Ресурсы кластера, занимаемые узлом
recursive_resource_usage ClusterResources Ресурсы кластера, занимаемые узлом и всем его поддеревом
account string Аккаунт, используемый при учете ресурсов, занимаемых данным узлом
annotation string Человекочитаемая аннотация объекта

Каждый узел имеет свой дескриптор, отвечающий за управление доступом, поэтому среди его атрибутов есть inherit_acl, acl и owner. Подробнее можно прочитать в разделе Система контроля доступов.

Атрибуты времени

Атрибут creation_time хранит время, когда узел был создан. Атрибут modification_time хранит время, когда узел или его атрибуты в последний раз изменялись. Атрибут modification_time не учитывает изменение сыновей узла, т.е. атрибут modification_time у map_node не меняется, если где-то в глубине дерева происходят изменения.

При создании и при каждом изменении узла система обновляет его атрибут revision. В нем хранится неотрицательное целое число. Гарантируется, что ревизия с течением времени растет строго монотонно. Ревизии можно использовать для проверки того факта, что узел не изменился. Атрибут revision изменяется одновременно с modification_time.

Атрибут access_time хранит время последнего обращения к содержимому узла. Обращение к атрибутам при этом не учитывается. Также, для повышения эффективности система не изменяет данный атрибут на каждое обращение, а накапливает факты обращений и обновляет атрибут access_time с периодичностью порядка секунды.

Внимание

В редких случаях возможна ситуация, когда к узлу было обращение, но в результате сбоя мастер-сервера атрибут access_time не будет обновлен.

Для большинства команд, при помощи которых происходит чтение или запись, существуют опции suppress_access_tracking и suppress_modification_tracking, которые позволяют отключить обновления атрибутов access_time, modification_time и revision при чтении и записи соответственно. В частности, веб-интерфейс использует suppress_access_tracking, так что просмотры содержимого через web UI не приводят к обновлению access_time.

Примечание

В случае создания или модификации узла под транзакцией описанные атрибуты устанавливаются один раз: во время изменений внутри транзакции. Таким образом, узел может стать виден в родительских транзакциях существенно позже, чем его creation_time, только после коммита соответствующей транзакции.

TTL для узлов Кипариса

Кипарис может автоматически удалять узлы по наступлении указанного момента времени или в случае отсутствия обращений к узлу на протяжении указанного интервала времени. Для управления этой возможностью существуют атрибуты expiration_time и expiration_timeout. По умолчанию атрибуты отсутствуют, в этом случае система не будет автоматически удалять узел. Для работы TTL необходимо:

  • указать в атрибуте expiration_time момент времени, при наступлении которого узел будет удален. Если узел композитный, то будет также удалено все его поддерево;
  • указать в атрибуте expiration_timeout интервал времени, в течение которого к узлу должны отсутствовать обращения, чтобы узел (и все его поддерево, если узел композитный) был удален.

Момент времени необходимо указать либо строкой в isoformat, либо целым числом миллисекунд с начала эпохи. Эти способы эквивалентны:

yt set //home/project/path/table/@expiration_time '"2020-05-16 15:12:34.591+03:00"'
yt set //home/project/path/table/@expiration_time '1589631154591'

Интервал времени указывается в миллисекундах:

# Удалить узел, если его «не трогали» неделю.
yt set //home/project/path/table/@expiration_timeout 604800000

Внимание

Данные, удаленные с помощью описанного механизма, невозможно восстановить. Используйте его с осторожностью.

Данные атрибуты можно менять в транзакциях, однако эффект имеют только их закоммиченные значения.

Чтобы выставлять данные атрибуты для узла, необходимо иметь право write на сам узел, как и для многих других атрибутов, а также remove для данного узла и всего его поддерева, так как фактически заказывается удаление, хоть и отложенное. Чтобы удалить данные атрибуты, достаточно права write.

Система не дает никаких гарантий точности времени удаления. На практике удаление происходит в пределах единиц секунд после наступления указанного времени.

Автоматическое удаление узла не наступает, если в момент наступления указанного времени на узле есть блокировки, отличные от snapshot. Система удалит узел, как только все блокировки будут сняты. Этим свойством можно пользоваться для искусственного продления времени жизни узла.

При копировании и перемещении узла атрибуты expiration_time и expiration_timeout по умолчанию сбрасываются, так что копия не будет автоматически удалена. У команд есть опции preserve-expiration-time и preserve-expiration-timeout, позволяющие поменять поведение.

Внимание

Ряд вызовов API, создающих временные таблицы, устанавливают на них expiration_time/expiration_timeout, чтобы таблицы самоочищались. Следует иметь это в виду и не хранить в таких таблицах важные данные.

Удаление может произойти раньше, если узел находится в поддереве с меньшим значением expiration_time/expiration_timeout в корне. Чтобы получить фактическое время удаления узла, можно воспользоваться атрибутом effective_expiration:

$ yt get //home/project/path/table/@effective_expiration
{
  "time": {"value": 42, "path": //testator/path}
  "timeout": {"value": 42, "path": //testator/path}
}

При отсутствии, например, expiration_time на пути от корня до узла, в поле "time" будет записано YSON entity.

Предыдущая
Следующая