[Документация Yandex Cloud](../../../../index.md) > [Monium](../../../index.md) > Поставка данных > [Unified Agent](index.md) > Конфигурирование > Хранилища

# Хранилища

Хранилища перечисляются в секции `storages`, ссылки на хранилища добавляются в секцию `pipe`. Количество хранилищ не ограничено, но сослаться на одно хранилище можно только один раз.

## Описание хранилищ в секции storages {#storages_section}

Описание хранилища состоит из следующих элементов:

- `name` — имя хранилища, по которому на него можно сослаться из цепочки обработки;
- `plugin` — [плагин хранилища](#storages);
- `config` — конфигурация входа.

Пример секции `storages`:

```yaml
storages:
- name: main
  plugin: fs
  config:
    directory: ./data/storage/main
    max_partition_size: 500mb
- name: secondary
  plugin: fs
  config:
    directory: ./data/storage/secondary
    max_partition_size: 100mb
```

## Добавление хранилища в секцию pipe {#pipe_section_storage}

Чтобы сослаться на хранилище, используется директива `storage_ref` с параметрами:

- `name` — имя хранилища, определенное в секции `storages`;
- `flow_control` — настройки [механизма создания сессий](#flow_control).

Пример цепочки обработки со ссылкой на хранилище:

```yaml
pipe:
  - storage_ref:
      name: main  # обязательный, имя хранилища, определенное в секции storages

      # Конфигурация инфраструктуры работы с сессиями.
      flow_control:
        new_sessions_rate_limit: null  # необязательный, по умолчанию не задан
```

## Плагин хранилища fs {#fs_storage}

Поддерживается только один плагин – файловое хранилище `fs`. Сообщения сохраняются в партициях. Партиции — это директории, содержащие файлы-сегменты с данными сообщений, а также файлы с метаданными.

{% note warning %}

Не рекомендуется использовать файловое хранилище вместе с опцией монтирования файловой системы `nobarrier`. При потере питания не гарантируется сохранность данных, может потребоваться ручное вмешательство.

{% endnote %}

Описание параметров:

```yaml
storages:  # необязательный
  
  # Имя хранилища. По этому имени на хранилище можно сослаться из цепочек преобразований при помощи storage_ref.
  # На одно хранилище можно сослаться только 1 раз.
- name: main  # обязательный
  # Имя плагина. Пока поддерживается только плагин fs для бинарного хранилища в файловой системе.
  plugin: fs  # обязательный

  config:
    # Директория с данными хранилища.
    # В ней создаются поддиректории для партиций.
    directory: ./data/storage  # обязательный

    # Максимальный размер партиции.
    # По умолчанию в хранилище есть только одна партиция с именем default.
    # Новая партиция создается только если пользователь явно этого потребовал, указав имя партиции в ключе _partition в метаданных сессии.
    # В основных сценариях партиция только одна, поэтому этот параметр можно считать лимитом на размер всего хранилища.
    max_partition_size: 10mb  # обязательный

    # Директория для хранения служебной информации хранилища.
    # По умолчанию — .state внутри directory
    state_directory: {directory} / .state  # необязательный, по умолчанию .state внутри directory

    # Максимальный размер сегмента (одного файла) внутри партиции.
    # По умолчанию — десятая часть размера партиции.
    max_segment_size: {max_partition_size} / 10  # необязательный, по умолчанию десятая часть от max_partition_size

    # Размер блока для записи.
    # Для снижения накладных расходов на системные вызовы перед вызовом write сообщения группируются в блок.
    # Вызов write осуществляется, если размер блока превышает указанный.
    block_flush_size: 1mb  # необязательный, по умолчанию 1mb

    # Время жизни блока для записи.
    # Вызов write будет осуществляться, если с момента поступления первого сообщения в блок прошло больше указанного времени.
    block_flush_period: 10ms  # необязательный, по умолчанию 10ms

    # Размер буфера для вызова syscall read.
    # По умолчанию совпадает с block_flush_size.
    read_buffer_size: {block_flush_size}  # необязательный, по умолчанию совпадает с block_flush_size

    # Время хранения информации о сессии.
    # Как только входящая сессия будет закрыта, хранилище перестанет хранить информацию о об этой сессии.
    # Соответствие sessionId->last_seq_no и метаданные сессии будут удалены.
    # Сессия удаляется только в том случае, если все данные по ней были записаны в выходы.
    session_retention_time: 1h  # необязательный, по умолчанию 1h

    # Время хранения данных партиции.
    # Партиция будет удалена через указанное время, если:
    # * все ее данные записаны в выходы и по ним получены подтверждения;
    # * нет активных сессий, пишущих в эту партицию.
    partition_retention_time: 1h  # необязательный, по умолчанию: 1h

    # Частота выполнения проверки на время хранения session_retention_time и partition_retention_time.
    retention_check_period: 1m  # необязательный, по умолчанию 1m

    # Частота выполнения fsync.
    # Чем чаще выполняется fsync, тем меньше данных нужно проверять при восстановлении после сбоя, и тем быстрее произойдет запуск агента.
    checkpoint_period: 1s  # необязательный, по умолчанию не задан

    # Параметр описывает условия, при которых сегменты с данными сохраняются после получения подтверждения от выхода.
    # Когда ни одно условие не выполнено, сегменты удаляются в порядке от старых к новым.
    # Под старым сегментом здесь понимается противоположный от того, в который запись идет на данный момент.
    #
    # Условия проверяются:
    # * в момент получения подтверждения от выхода;
    # * в момент поступления новых данных;
    # * регулярно с периодичностью retention_check_period.
    #
    # На уровне партиции поддерживаются счетчики TrailingMessageAgeMs и TrailingSegmentAgeMs.
    # TrailingMessageAgeMs определяется по timestamp первого сообщения самого старого сегмента.
    # Этот счетчик примерно (без учета возможной немонотонности timestamp) показывает период времени, за который в партиции имеются данные.
    # TrailingSegmentAgeMs определяется аналогично по следующему за ним сегменту.
    # Этот счетчик показывает, когда последний сегмент будет удален (при достижении значения свойства by_age).
    # Значения обоих счетчиков — в миллисекундах.
    # Если в партиции нет ни одного сегмента, оба счетчика равны нулю.
    # Если в партиции только один сегмент, значение TrailingSegmentAgeMs равно нулю.
    #
    # Параметр не задан по умолчанию, т.е. самый старый сегмент удаляется при получении подтверждения от выхода для последнего сообщения этого сегмента.
    data_retention:  # необязательный
      # Сегмент не удаляется, пока в нем есть более свежие сообщения.
      # Актуальность сообщений определяется по времени в поле timestamp первого сообщения предпоследнего сегмента.
      # В партиции будут храниться данные примерно за указанный период.
      by_age: 10d  # необязательный, по умолчанию не задан

      # Сегмент не удаляется, пока размер данных партиции, исключая собственный размер сегмента, остается меньше указанного.
      # То есть размер партиции будет поддерживаться не меньше указанного.
      # Если указать by_size: max, то данные будут удаляться только по достижении лимита на размер партиции.
      by_size: 500mb  # необязательный, по умолчанию не задан

    # Уровень логирования, который будет использован при удалении неподтвержденных данных.
    # Обычно мониторинг агента смотрит на значение счетчика `Errors` — общее число событий внутри агента, залогированных с уровнем ERROR.
    # Если переполнение хранилища — потенциально возможный сценарий (например, в агент записываются данные интенсивнее, чем лимит, указанный в параметре `new_sessions_rate_limit` секции `flow_control`), этим параметром можно отключить зажигание алертов в этом случае.
    # Возможные значения: EMERG, ALERT, CRITICAL_INFO, ERROR, WARNING, NOTICE, INFO, DEBUG, RESOURCES.
    unacknowledged_eviction_log_priority: ERROR  # необязательный, по умолчанию ERROR
```