Dovecotサーバに、DSyncというメールデータの同期機能があるようだ。 これを利用することで、ストレージなどにメールデータを配置することなくIMAP/POP3サーバの冗長化を行うことが可能らしい。 SMTPサーバ(Postfix)はそのまま同じ構成で2台構築し、DovecotのみDSyncによる同期処理を行わせる。 なお、すでに2台ともPostfix+Dovecotはインストール済み(細かい設定はまだ)とする。

一応、tcpで任意のポートを指定した同期設定ができるようなのだが、面倒なので今回はrootでのsshを用いた同期を行わせる。 事前に互いのサーバへパスワードなしでssh接続できるよう鍵を配置しておくこと。

設定は簡単で、Dovecotの設定を一部書き換えてサービス再起動してやるだけで設定可能だ。 まず、「/etc/dovecot/conf.d/10-mail.conf」の設定を書き換え、「replication」プラグインを読み込むようにする。

/etc/dovecot/conf.d/10-mail.conf
mail_plugins = notify replication

次に、「/etc/dovecot/conf.d/30-dsync.conf」というファイルを手動で作成する。

/etc/dovecot/conf.d/30-dsync.conf
service replicator { process_min_avail = 1 } dsync_remote_cmd = ssh -l%{login} %{host} doveadm dsync-server -u%u plugin { mail_replica = remote:root@対象サーバ } service aggregator { fifo_listener replication-notify-fifo { user = mail } unix_listener replication-notify { user = mail } } service replicator { unix_listener replicator-doveadm { mode = 0600 } } replication_max_conns = 10 plugin { # When saving a new mail via IMAP or delivering a mail via LDA/LMTP, # wait for the mail to be synced to the remote site. If it doesn't finish # in 2 seconds, return success anyway. replication_sync_timeout = 2s }

あとは、dovecotを再起動するだけだ。

systemctl restart dovecot

以上、無事DSyncを用いてのメールサーバの冗長化が行えた。 pam認証だと両方のサーバにユーザやエイリアスを定義してやらないといけないので、ちゃんと運用するのならLDAP連携などを行ってユーザを自動生成させてやるといいだろう。

メールエイリアスについては、LSyncdなどを使って片方でファイルを編集したらもう片方にちゃんと連携されるようにするといいだろう(newaliasesの実行は必要だけど)。