Sun Java System Messaging Server 6 2005Q4 管理ガイド

同一メッセージのストレージが重複するためメッセージストアのサイズを小さくする

1 つのメッセージが複数の受取人に送信されると、そのメッセージは各受取人のメールボックスに格納されます。一部のメッセージングシステムでは、同じメッセージのそれぞれのコピーを各受取人のメールボックスに格納します。それに対して、Sun Java System Messaging Server では、そのメッセージが格納されているメールボックスの数に関係なく、メッセージのコピーを 1 つだけ保持するよう努めます。このために、そのメッセージが含まれているメールボックス内にそのメッセージへのハードリンクを作成します。

ほかのメッセージングシステムが Sun Java Messaging Server に移行されると、移行プロセスによってメッセージの複数のメッセージコピーが作成されることがあります。メッセージストアが大きい場合、大量のメッセージが不必要に重複することになります。また、IMAP append 操作やほかのソースからなど、通常のサーバー操作で同じメッセージの複数のコピーが蓄積される可能性もあります。

Messaging Server には、余分のメッセージコピーを削除し、それらを 1 つのコピーへのハードリンクに置き換える relinker という新しいコマンドが用意されています。

Relinker の動作方式

再リンク機能は、コマンド行モードでもリアルタイムモードでも実行できます。relinker コマンドを実行すると、メッセージストアのパーティション全体がスキャンされ、MD5 メッセージダイジェストリポジトリがハードリンクとして作成または更新され、余分のメッセージファイルが削除されて、必要なハードリンクが作成されます。

ダイジェストリポジトリは、メッセージストアに格納されているメッセージへのハードリンクから構成されます。このリポジトリは、ディレクトリ階層 partition_path/=md5 に格納されます。このディレクトリは、ユーザーメールボックスの階層 partition_path /=user に対応しています (図 18–1 を参照)。ダイジェストリポジトリのメッセージは、その MD5 ダイジェストによって一意に識別されます。たとえば、fredb/00/1.msg のダイジェストが 4F92E5673E091B43415FFFA05D2E47 である場合、 partition/=user/hashdir/hashdir /=fredb/00/1.msg は partition/=md5/ hashdir/hashdir/4F92E5673E091B43415FFFA05D2E47EA.msg にリンクされます。別のメールボックスに同じメッセージ (partition_path /=user/hashdir/hashdir/gregk/00/17.msg など) があると、そのメッセージもまた partition_path/=md5/4F/92/4F92E5673E091B43415FFFA05D2E47EA.msg にハードリンクされます。図 18–5 はこのことを示しています。

図 18–5 メッセージストアのダイジェストリポジトリ

図は、メッセージストアのリポジトリを示しています。

このメッセージの場合、リンクカウントは 3 になります。両方のメッセージが fredb および gregk というメールボックスから削除されると、リンクカウントは 1 になり、メッセージを消去できます。

relinker プロセスは、リアルタイムモードで実行しても同じように機能します。詳細については、「リアルタイムモードで relinker を使用する」を参照してください。

コマンド行モードで relinker を使用する

relinker は、メッセージストアのパーティション全体をスキャンし、MD5 メッセージリポジトリをハードリンクとして作成または更新して、余分のメッセージファイルを削除します。relinker がストアパーティションをスキャンし終わると、再リンク前後の一意のメッセージ数とパーティションのサイズに関する統計情報が出力されます。すでにハッシュされているストアを迅速に処理するために、relinker は =md5 にまだ存在しないメッセージのダイジェストだけを計算します。また、ダイジェストリポジトリ全体を消去することもできます (ユーザーメールボックスに影響しない場合)。

コマンドの構文は次のとおりです。

relinker [-p partitionname] [-d]

ここで、partitionname は処理されるパーティション (デフォルト: すべてのパーティション) を示し、-d はダイジェストリポジトリが削除されること示します。出力例を次に示します。


# relinker

Processing partition: primary
Scanning digest repository...
Processing user directories..............................
---------------------------------------------------------
Partition statistics           Before            After 
---------------------------------------------------------
Total messages                 4531898         4531898
Unique messages                4327531         3847029
Message digests in repository        0         3847029
Space used                       99210Mb         90481Mb
Space savings from single-copy    3911Mb         12640Mb
---------------------------------------------------------


# relinker -d 
Processing partition: primary
Purging digest repository...
---------------------------------------------------------
Partition statistics                 Before         After
---------------------------------------------------------
Message digests in repository       3847029             0
---------------------------------------------------------

relinker は、特にリポジトリにメッセージがまったく存在しない場合の最初の実行は、時間がかかることがあります。これは、すべてのメッセージのダイジェストを計算しなければならないためです (relinker 条件がすべてのメッセージを含めるように設定されている場合)。relinker 条件の設定については、「relinker を設定する」を参照してください。たとえば、100G バイトのメッセージストアを処理するのに 6 時間を要するとします。ただし、実行時再リンクが有効になっている (「リアルタイムモードで relinker を使用する」を参照) 場合は、relinker コマンドを実行する必要はありません。

relinker コマンド行モードが排他的に使用され、実行時オプションが有効でない場合は、ダイジェストリポジトリ (=md5) を消去する必要があります。そうしないと、ストア (=user) 内に消去されたメッセージがダイジェストリポジトリ内にリンクを持ち続ける (孤立する) ため、それらのディスク領域が解放されません。移行後などにストアの最適化を 1 回だけ行なっている場合は、relinker を一度実行してから、relinker -d でリポジトリ全体を削除できます。移行中に消去を何度も行なった場合は、実行するたびに期限切れや孤立したメッセージがリポジトリから消去されるので、relinker コマンドを繰り返し実行するだけで十分です。

異なるパーティションの各処理と並行して、relinker の複数のインスタンスを実行しておくと安全です (-p オプションを使用)。メッセージは同じパーティション内でのみ再リンクされます。

リアルタイムモードで relinker を使用する

リアルタイムモードで relinker 機能を有効にするには、configutil パラメータの local.store.relinker.enabledyes に設定します。リアルタイムモードで relinker を使用すると、設定された relinker 条件 (「relinker を設定する」を参照) に一致する、配信された (または復元された、IMAP によって追加された、など) すべてメッセージのダイジェストが計算され、そのダイジェストがリポジトリにすでに存在するかどうかが確認されます。ダイジェストが存在する場合は、メッセージの新しいコピーを作成する代わりに、そのダイジェストへのリンクが宛先メールボックスに作成されます。ダイジェストが存在しない場合は、メッセージが作成され、あとでそのメッセージへのリンクがリポジトリに追加されます。

stored は、各パーティションのダイジェストリポジトリをスキャンし、リンクカウントが 1 か、relinker 条件に一致しないメッセージを消去します。スキャンは、設定可能な期間内に一度に 1 つのディレクトリで実行されます。これは、入出力負荷が均等に分散され、ほかのサーバー操作に著しい影響を及ぼさないようにするためです。デフォルトでは、消去サイクルは 24 時間です。これは、メッセージがストアから削除されるか、設定可能な最長保存期間を過ぎたあとも、24 時間までは存在するということを意味します。このタスクは、relinker のリアルタイムモードが有効になっている場合にのみ使用できます。

relinker を設定する

表 18–13 に、relinker 条件を設定するためのパラメータを示します。

表 18–13 relinkerconfigutil パラメータ

パラメータ 

説明 

local.store.relinker.enabled

append コードと stored 消去でのリアルタイムによるメッセージの再リンクを有効にします。このオプションがオフになっている場合でも relinker コマンド行ツールを実行できますが、stored によってリポジトリが消去されないため、relinker -d でこのタスクを実行する必要があります。このオプションをオンにすると、ディスク容量の節約と引き換えにメッセージ配信のパフォーマンスが低下します。

デフォルト: no

local.store.relinker.maxage

メッセージをリポジトリに保存しておく最長保存期間、または relinker コマンド行によって考慮されるメッセージの最長保存期間 (時間数) です。-1 は保存期間に制限がない、つまり孤立したメッセージのみがリポジトリから消去されることを意味します。relinker の場合は、保存期間に関係なく既存のメッセージが処理されることを意味します。この値を小さくすると、リポジトリが小さい状態で保たれるため、relinker または stored による消去の実行速度が上がり、ディスク領域を速く回復できます。この値を大きくすると、長期間にわたって重複するメッセージの再リンクを実行できます (ユーザーが数日違いで同じメッセージをストアにコピーしたり、数日間または数週間にわたって移行を行なったりする場合など)。

デフォルト: 24 

local.store.relinker.minsize

実行時またはコマンド行の relinker によって考慮されるメッセージの最小サイズ (K バイト) です。ゼロ以外の値に設定すると、小さいリポジトリと引き換えに小さいメッセージがもたらす relinker のさまざまなメリットが受けられません。

デフォルト: 0 

local.store.relinker.purgecycle

stored による消去サイクル全体のおおよその期間 (時間数) です。実際の期間は、リポジトリ内の各ディレクトリのスキャンにかかる時間によって異なります。この値が小さいと、入出力操作が増し、この値が大きいと、ディスク領域の回復が遅くなります。0 に設定すると、ディレクトリ間で途切れることなく、連続的に消去が実行されます。-1 に設定すると、stored による消去が実行されません (relinker -d コマンドを使用して消去を実行する必要がある)。

デフォルト: 24