Дерево метаинформации
Кипарис — дерево метаинформации, содержащее в себе различную системную информации и данные о том, где хранятся пользовательские данные.
Вы познакомитесь с общим представлением дерева, атрибутами узлов Кипариса и TTL для узлов Кипариса.
Общее представление дерева
С пользовательской точки зрения Кипарис похож на дерево файловой системы в Linux, но имеет ряд существенных отличий:
- С каждым узлом в дереве связан набор атрибутов, в том числе задаваемых пользователем.
- Дерево является транзакционным.
- В качестве узла Кипариса могут быть не только файлы и директории, но и другие объекты.
По аналогии с файловой системой в Кипарисе поддерживается система контроля доступов.
Что еще важно знать
-
Корневым элементом Кипариса является
/, который имеет тип map_node (то есть является директорией). Адресация узлов в Кипарисе осуществляется с помощью YPath. -
Количество дочерних узлов директории ограничено. По умолчанию лимит равен 50000, но зависит от конфигурации кластера.
-
Глубина Кипариса в теории не ограничена, но стоит помнить о том, что в 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 |
Интервал времени, после которого узел будет автоматически удален, если к нему не было обращений. Опциональный атрибут |
touch_time |
DateTime |
Время последнего доступа к узлу, используемое для автоматического удаления через expiration_timeout. Присутствует только при наличии expiration_timeout |
access_counter |
integer |
Количество обращений к узлу с момента создания |
revision |
integer |
Ревизия узла |
resource_usage |
ClusterResources |
Ресурсы кластера, занимаемые узлом |
recursive_resource_usage |
ClusterResources |
Ресурсы кластера, занимаемые узлом и всем его поддеревом |
account |
string |
Аккаунт, используемый при учете ресурсов, занимаемых данным узлом |
annotation |
string |
Человекочитаемая аннотация объекта |
Каждый узел имеет свой дескриптор, отвечающий за управление доступом, поэтому среди его атрибутов есть inherit_acl, acl и owner. Подробнее можно прочитать в разделе Система контроля доступов.
Атрибуты времени
|
Название атрибута |
Описание атрибута |
|
Атрибут |
Хранит время, когда узел был создан. |
|
Атрибут |
Хранит время, когда узел, его пользовательские атрибуты или некоторые системные атрибуты в последний раз изменялись. Не учитывает изменение сыновей узла, т.е. атрибут |
|
Атрибут |
Обновляется системой при создании и при каждом изменении узла. Хранит неотрицательное целое число. Изменяется одновременно с Гарантируется, что ревизия с течением времени растет строго монотонно. Ревизии можно использовать для проверки того факта, что узел не изменился. |
|
Атрибут |
Хранит время последнего обращения к содержимому узла. Обращение к атрибутам при этом не учитывается (обращением к атрибуту считается указание полного пути к атрибуту внутри YPath). Также не учитываются запросы с включенной опцией Для повышения эффективности система не изменяет данный атрибут на каждое обращение, а накапливает факты обращений и обновляет атрибут |
Внимание
В редких случаях возможна ситуация, когда к узлу было обращение, но в результате сбоя мастер-сервера атрибут access_time не будет обновлен.
Внимание
Атрибуты modification_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интервал времени, в течение которого к узлу должны отсутствовать обращения, чтобы узел (и все его поддерево, если узел композитный) был удален.
Для учета времени последнего запроса используется время из атрибута touch_time.
Особенности атрибута touch_time
-
Атрибут
touch_timeпо аналогии сaccess_timeхранит время последнего обращения к узлу. Данный атрибут присутствует только у узлов с присутствующим атрибутомexpiration_timeout. -
В отличие от
access_time,touch_timeобновляется при обращении к атрибутам узла, а также при обращениях к узлу через веб-интерфейс. -
Атрибут
touch_timeне учитывает изменение сыновей узла, т.е. атрибутtouch_timeуmap_nodeне меняется, если где-то в глубине дерева происходят обращения. Такжеtouch_timeне обновляется в запросах с включенной опциейsupress_expiration_timeout_renewal.
Внимание
Данные, удаленные с помощью описанного механизма, невозможно восстановить. Используйте его с осторожностью.
Пример
Момент времени необходимо указать либо строкой в 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
Внимание
Указывать expiration_timeout на директориях следует с чрезвычайной осторожностью. Время жизни директории продлевают только непосредственные обращения к ней, но не к ее поддереву. Так, например, чтение таблицы, содержащейся в директории с expiration_timeout, не продлевает ее время жизни.
Что важно знать про TTL
Атрибуты TTL можно менять в транзакциях, однако эффект имеют только их закоммиченные значения.
-
Чтобы выставлять данные атрибуты для узла, необходимо иметь право
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.