This documentation is for Dovecot v2.x, see wiki1 for v1.x documentation.

Индексные файлы Dovecot

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

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

Если индексные файлы отсутствуют, то Dovecot создаст их автоматически, при открытии почтового ящика. В случае если создание индексного файла или его рост приводят к ошибке "недостаточно места на диске", структура индексов прозрачно будет перемещена в память до конца сессии.

Более подробно о том как обрабатываются индексные файлы можно прочитать в статье Design/Indexes

Основной индекс

Основной индекс хранит в себе о каждом почтовом сообщении следующую информацию:

В целом, эту же информацию обрабатывают и другие IMAP-сервера, храня всю структуру индекса в памяти пока почтовый ящик открыт. Преимущество Dovecot в том, что он хранит данные на на диске и считывает их только в момент открытия почтового ящика.

Заголовок индексного файла так же содержит некоторую дополнительную информацию, как например, сколько сообщений в почтовом ящике, сколько из них непрочитано и сколько помечено флагом "удалено". Таким образом, открывая почтовый ящик и запрашивая команду STATUS клиент получает данные из заголовка индексного файла. Вот почему эти операции выполняются Dovecot крайне быстро по-сравнению с другими серверами, которые не используют подобный индексный файл.

Синхронизация почтового ящика

Заголовок основного индексного файла помимо прочего содержит информацию о статусе синхронизации почтового ящика:

Индексный файл синхронизируется с почтовым ящиком только если данные о синхронизации были изменены.

Кэш-файл

Кэш-файл содержит следующую информацию:

IMAP-клиенты можно разделить на два основных типа, по принципу работы:

  1. Online-клиенты, которые запрашивают одну и ту же информацию несколько раз (например, web-почта, Pine)
  2. Offline-клиенты, которые прежде всего скачивают заголовки интересующих их сообщений и только после этого тело сообщения (возможно автоматическое скачиваение или же тело скачивается, когда пользователь открывает сообщение). Большинство IMAP-клиентов ведут себя подобным образом.

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

Для клиентов второго типа кэш-файл будет полезен в случае использования большого числа клиентов или при сохранении сообщения, тогда данные могут быть кэшированны (Dovecot версии 1.1 и выше это поддерживает). Некоторые данные особенно полезны, например, прежде чем скачать сообщение необходимо знать виртуальный размер письма. Если бы эти данные не хранились в кэше, Dovecot приходилось бы считывать всё сообщение каждый раз, чтобы посчитать его виртуальный размер.

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

Dovecot может кэшировать поля как временно так и постоянно. Временно кэшированные поля будут удалены из кэш-файла приблизительно через неделю. Для определения типа кэширования (временное или постоянное) Dovecot использует два правила:

  1. Клиент запрашивал сообщения непоследовательно в пределах одной сессии. Обычно это означает, что этих сообщений нет в локальном кэше.
  2. Клиент запросил сообщение более чем недельной давности.

Статья Design/Indexes/Cache поясняет причины принятия этих правил.

Лог транзакций

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

  1. Этот подход позволяет получить список изменений настолько быстро, что IMAP-клиенты могут быть уведомлены об изменениях. Альтернативой этому было бы сравнение двух индексов, что собственно и делает большинство IMAP-серверов.
  2. Включение параметра mmap_disable=yes указывает Dovecot, что необходимо работать с логом транзакций. Таким образом, вместо повторного прочтения всего основного индекса при каждом изменении достаточно прочесть всего лишь несколько байт из лога транзакций.

В Dovecot версии 1.1 и выше лог транзакций играет ещё более важную роль. Основной индексный файл обновляется очень редко, чтобы снизить количество обращений к диску. Поэтому первое что делается при обращении к основному индексу - это запись последних изменений из лога транзакций в начало индекса. В случае с пустыми почтовыми ящиками (например download+delete POP3 users) было бы возможным удалить весь основной индекс и оставить только лог транзакций (к сожалению на текущий момент это не сделано).

None: ru/ИндексныеФайлы (last edited 2010-08-20 10:52:55 by Alex Fomin)