Предполагая, что я использую Dovecot и его формат maildir для сохранения и доступа к почте на сервере. Как мне избежать состояния гонки при копировании maildir?
Я читал учебник по резервному копированию и использованию maildir, но не видел, чтобы кто-нибудь писал об этом. Они просто используют cp
или rsync
чтобы скопировать каталог в другое место. Возможно ли, чтобы maildir перешёл в несовместимое состояние при копировании, или мне нужна какая-то блокировка?
РЕДАКТИРОВАТЬ: Я хочу делать регулярные резервные копии, но не думаю, что это действительно ответ на вопрос. Я знаю, что могу остановить почтовый сервер (Dovecot и Postfix), но я думаю, что это должно быть возможно и без этого. Насколько мне известно, maildir поддерживает одновременный доступ для разных приложений.
Я только что прочитал документация для Maildir в Dovecot и несколько других документов о Maildir и Maildir ++. Надеюсь, что не упустил ничего важного.
Maildir разработан для работы без блокировок. Большинство необходимых операций в современных файловых системах атомарны. Это означает, что вам не нужно особо заботиться об условиях гонки, таких как несогласованное чтение. Но есть еще некоторые проблемы, если вы хотите сделать резервную копию Maildir во время работы почтового сервера.
Резервное копирование и восстановление tmp/
бесполезно. Каждый Maildir содержит каталоги new/
, cur/
и tmp/
. Каталог tmp/
содержит письма, которые в данный момент записываются на диск. Они перемещены в new/
когда они написаны успешно. Это означает, что файлы в tmp/
может быть еще не полным. Даже если файл завершен, процесс, который записывал файл, больше не выполняется после восстановления резервной копии. Это означает, что если такой файл будет восстановлен, он никогда не будет добавлен в почтовый ящик и, возможно, никогда не будет удален.
Возможно, имеет смысл исключить dovecot-uidlist.lock
из резервной копии. Dovecot использует расширение Maildir под названием Maildir ++. Это расширение требует блокировки. Получение блокировки для чтения не требуется для расширения, но может быть разумным исключить файл блокировки из резервной копии.
Приобретать dovecot-uidlist.lock
или используйте снимок файловой системы. В принципе, вы можете просто скопировать каталог, но некоторые письма можно пропустить из-за условий гонки. Причина в том, что перечисление и копирование содержимого каталога (рекурсивно) не атомарно. Это означает, что можно пропустить электронное письмо при создании резервной копии, когда пользователь изменяет тег (например, виден / невидим) или перемещает почту. Чтобы справиться с такими ситуациями, Dovecot получает файл блокировки (такой же, как указано выше) для каждого действия. Если вы используете Dovecot, вы можете решить проблему, установив блокировку перед созданием резервной копии. Это можно сделать с помощью /usr/lib/dovecot/maildirlock
. Другая возможность - использовать снимки вашей файловой системы. Поскольку создание моментального снимка является атомарным, проблема не возникает в моментальных снимках.
Вкратце: Если вы хотите сделать резервную копию во время работы Dovecot, вы должны сначала получить файл блокировки. dovecot-uidlist.lock
или создайте снимок вашей файловой системы. Затем вы можете скопировать Maildir. Возможно, имеет смысл исключить tmp/
и dovecot-uidlist.lock
из вашей резервной копии.
Обновленный ответ на этот вопрос - использовать команду dovecot doveadm или dsync. пример:
dsync -f -u <user> backup maildir:<backup_location>