web-dev-qa-db-ja.com

maildirの一貫したコピーを作成する

私がDovecotを使用していて、サーバーでメールを保存してアクセスするのにmaildir形式であると仮定します。 maildirのコピー中に競合状態を回避するにはどうすればよいですか?


私はバックアップとmaildirの使用についてのチュートリアルを読みましたが、これについて書いている人は誰もいませんでした。 cpまたはrsyncを使用して、ディレクトリを別の場所にコピーします。 maildirがコピーによって不整合な状態になることは不可能ですか、それとも何らかのロックが必要ですか?

編集:定期的にバックアップを作成したいのですが、質問に答えるのは難しいと思います。メールサーバー(DovecotとPostfix)を停止できることはわかっていますが、これを行わなくても可能だと思います。私が知る限り、maildirはさまざまなアプリケーションによる同時アクセスをサポートしています。

7
JojOatXGME

私は DovecotのMaildirのドキュメント と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を除外するのが賢明な場合があります。

7
JojOatXGME

この質問に対する更新された回答は、dovecotのdoveadmまたはdsyncコマンドを使用することです。例:

dsync -f -u <user> backup maildir:<backup_location>
4
Toushin