[cyrus-imapd] 複数パーティションによる運用

Cyrus IMAPを用いたサーバにおいて、パーティションは、partition-default 1つのみで運用していたが、管理しているサーバのメールスプールが危険水域となり困っていた。
事前に複数パーティションを設定できるということは知っていたので、あらかじめ複数パーティションを用意していたのだが、設定方法がわからず放置していた。

最近ある方から方法を教えていただき予備パーティションへの切り替えを実行してみたのでまとめてみる。(多謝)

パーティションの構成

 既存 /var/spool/imap 1TB
 新規 /spool1/imap    1TB
 新規 /spool2/imap    1TB

手順

(1) /usr/local/etc/imapd.confの設定
 partition-default: /var/spool/imap

に加えて

 partition-spool1: /spool1/imap
 partition-spool2: /spool2/imap

を追加する。

(2) /usr/local/cyrus/bin/mkimap を実行

mkimapは、imapd.confの設定に従って、既存および追加のパーティションに対して設定をする。
ここで困ったことに、partition-default内のメールが溜まりすぎていたため、とても時間がかかってしまった。(後述)
また、/var/imapのuid/gid設定が cyrus:mail から cyrus:cyrus に変更されてしまい、配送エラーとなったので、

 chgrp mail /var/imap

を実行しなおした。

(3) ユーザアカウント毎のメールスプール切り替え
 cyradm -u <admins: で指定したユーザ> localhost

を実行し、プロンプトから

 localhost> rename user.foo user.foo spool1

のように、rename コマンドを実行する。
書式は

 rename <移動元メールボックス名> <移動先メールボックス名> <移動先パーティション名>

である。

移動先パーティション名を省略するとデフォルトパーティション内の移動になり、移動元と移動先を同じ名前にして、パーティション名を変えると、名前を変えずにパーティション間の移動となる。


できれば会話型ではなくバッチ処理的に処理をしたかったが、方法がわからず、local> のプロンプトで、実行したいコマンドをカット&ペーストしてどうにか切り抜けた。
移動したユーザアカウントは1000名近くあったので、1週間以上かかりとても難儀した。


ちなみに、新規ユーザアカウントを spool1 に割り当てる場合は、

 localhost> cm user.foo spool1

とすれば良い。

また、メールアドレスに"."を前提とし、imapd.confにて、unixhierarchysep: yes を定義しているので、上記の user.foo は、user/foo に置き換えてコマンドを実行している。

後記

約2年間運用していたためか partition-default には、大量のメールが溜まっていた。
2000程度のユーザアカウントがあるが、あまり使用していない1000程度のユーザアカウントをspool1に移行する作業をしたが、いくつか気になる点をまとめる。

(1) renameの挙動

rename コマンドによるパーティション間のメール移動時の挙動を監視していたが、メールはサーバ内でコピーが発生し、その間に届いたメールは、LMTPでユーザ単位でtime outもしくはIO Errorとなってローカル配送がされなかった。
またメールのコピーが完了した時に旧パーティションのメールは削除された。
LMTPで配送エラーとなり mail queue に溜まったメールは、再送により新パーティションに配送されるのでメールはロストはしない、という仕組みのようだ。

(2) renameの処理時間

4GByte溜まっているユーザアカウントのメールに対して、rename処理をした時の時間は以下の通りである。

 defalutからspool1へのコピー 約40分
 defaultのメールを削除       約10分

計約50分程度かかった。

(3) フラグメンテーション

quota設定をすれば分かるのかもしれませんが、時々ユーザアカウント単位のメール消費量を調べるために du を実行していた。

 du -s /var/spool/imap/user/*

運用が進むにつれ、処理時間が増え続け、最近では3日以上かかることが多々あった。

今回のrename処理で約半数のアカウントを default から spool1 に移行したら、

 du -s /var/spool/imap/user/*     約11時間
 du -s /spool1/imap/user/*        約5分

となり短縮された。
パーティションの消費されているサイズとしては、renameした結果、spool1 が default より上回っている状況であるが、この結果である。

上述の mkimap も、chown処理のために、3日程度かかっていたので、Windowsで言う defrag 相当の処理が必要なのかと思っているが、HDDがヘタっているのか、フラグメンテーションの問題なのか、なんだろうか...

(4) メールスプールの日付

メールクライアントソフトはいろいろ試しているが、rename処理の結果、1つ問題が発生した。
squirrelmail-devel-1.5.1_1 を使ってみたが、1.4系と違ってとても早くなって快適なので、最近のお気に入りなのだが、squirrelmail-devel-1.5.1_1 では、メールの一覧は、ファイル日付で表示しているようである。
rename処理を実行した結果、新パーティションに移行されたメールの1通1ファイルの日付が移動した時間に変更されていた。
メール本文をみると正しく表示されるため、処理速度向上のためにファイル日付で一覧を表示しているように思われる。

(5) Thunderbirdの索引

もうひとつメールクライアントソフトで問題があった。
WindowsThunderbird において、メール一覧が表示されない、もしくは壊れてしまう現象である。
default から spool1 にrename処理をした場合、メール一覧が表示されなくなる。
default から spool1 に rename して、また default に rename で元のパーティションにした場合は、一部のメール一覧表示がおかしくなった。
Thunderbirdにおいて索引を再作成をしたら正しく表示された。
SquirrelMail等違うメールクライアントでは問題が無いので、Thunderbird で、何らかのサーバ側のパーティション情報を内部で持っているようである。

これは問題が無かった模様。無茶な移動を繰り返し等いくつかの意地悪テストをしていたためのようです。(2007/12/30訂正)

今の悩み

ちなみに現在のサーバOSは、FreeBSD 4.11-RELEASE である。
不意のダウンを考えるとfsckは2時間以上かかるため、background fsck が使える5系以降に早く切り替えたく、6系のサーバを新規に準備中であるが、上記のように du も chown の処理も多々かかっているので、移行作業に大変時間がかかることが想定される。
全てのメールを spool1 に移行してからやるべきか悩み中である。
7系から採用される ZFS はとても魅力的だが、そんな勇気はまだない。。。^^;;;
Cyrus-imapd も 2.2系なので、2.3系への移行作業も入るので、いろいろ手順を考えているところである。