Сделать последовательную копию maildir
Предполагается, что я использую Dovecot и его формат maildir для сохранения и доступа к почте на сервере. Как избежать условий гонки при копировании maildir?
Я прочитал учебник о резервном копировании и использовании maildir, но никто не писал об этом. Они просто используют cp
или же rsync
скопировать каталог в другое место. Разве невозможно, чтобы maildir стал несовместимым при копировании или мне нужна какая-то блокировка?
РЕДАКТИРОВАТЬ: Я хочу делать регулярные резервные копии, но я не думаю, что это действительно метрики для вопроса. Я знаю, что могу остановить почтовый сервер (Dovecot и Postfix), но я думаю, что это возможно без этого. Насколько я знаю, maildir поддерживает одновременный доступ различных приложений.
2 ответа
Я только что прочитал документацию по 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
из вашей резервной копии.
Обновленный ответ на этот вопрос - использовать команду doveadm или dsync от dovecot. пример:
dsync -f -u <user> backup maildir:<backup_location>