Exchange ストレージ アーキテクチャ

 

Exchange サーバーは, .edb ファイルと .stm ファイルの 2 つのファイルにデータを格納します。.edb ファイルと .stm ファイルを併せて Exchange ストア リポジトリを形成します。たとえば、Exchange サーバー上の既定のメールボックス ストアは、Priv1.edb と Priv1.stm という名前のファイルを使用します。既定のパブリック フォルダ ストアは、Pub1.edb と Pub1.stm ファイルを使用します。.edb ファイルには、MAPI メッセージのコンテンツの他に、Exchange ストア内のすべての電子メール メッセージ、その他のアイテムに対するメタデータを保持する多くのテーブルが含まれています。.edb ファイルは ESE データベースであり、主に MAPI メッセージと添付ファイルを格納するために使用されることから、MAPI ベースのデータベースとも呼ばれています。これに対し, .stm ファイルは、ネイティブ インターネット コンテンツを格納します。インターネット コンテンツはネイティブ形式で記述されているため、メッセージやその他のアイテムを Exchange の形式に変換する必要はありません (Exchange 5.5 およびそれ以前と同様)。.stm ファイルはストリーミング データベースと呼ばれる ESE データベースでもあります。.edb および .stm ファイルはペアで機能し、データベース署名 (データベースの作成時間を組み合わせた 32 ビットの乱数) がヘッダーとして両方のファイルに格納されます。.stm ページの内部スキーマは, .edb ファイルに格納されます。

note注 :
.edb および .stm データベースの名前を変更し、それらを Exchange システム マネージャで別のディレクトリに移動することができます。.edb ファイルと .stm ファイルが一緒になって完全な Exchange ストア リポジトリが作成されるため、これらのファイルはまとめておき、異なる拡張子 (.edb と .stm) を持つ共通の名前を割り当てる必要があります。

Exchange Server 2003 は、トランザクションを使用して、ストレージ グループの変更を制御します。これらのトランザクションは、従来のデータベースにトランザクションが格納されるのと同様の方法で、トランザクション ログに記録されます。変更は、トランザクションの成否に基づいてコミットされるか、ロール バックされます。障害が発生した場合、トランザクション ログを (データベース ファイル、さらに場合によってはチェックポイント ファイルと共に) 使用して、データベースを復元します。トランザクションを管理する機能は、Microsoft Exchange Information Store サービス (Store.exe) です。また、次の図に示すように、コミットされていないトランザクション ログ エントリも、現在の Exchange データベースの一部として見なされます。

c236b0b1-1e8b-4f56-9643-4813d0d54acc

Exchange Server 2003 では、次の 2 種類のデータベースが使用可能です。

  • プライベート ストア データベース   MAPI ベースのメッセージング コネクタのメールボックスとメッセージ キューを格納します。
  • パブリック ストア データベース   パブリック フォルダ階層とパブリック フォルダ コンテンツを格納します。

次の図は、内部の Exchange ストア アーキテクチャを示しています。Microsoft Exchange Information Store サービス (Store.exe) は、Extensible Storage Engine (ESE) を使用してファイル システムのデータベース ファイルにアクセスし、MAPIsvr、ExPOP、ExIMAP、ExSMTP、ExOLEDB などのさまざまなインターフェイスを経由したデータへのアクセスを提供します。クライアント アプリケーションや、CDOEX (Collaboration Data Objects for Exchange) などのアプリケーション プログラミング インターフェイスは、これらのインターフェイスを使用したり、メッセージング データベース (MDB) モジュールと通信したりすることができます。

40668745-b91e-4505-a7b9-ab88974a9ad0

ストレージ グループ

各ストレージ グループは、ストレージ グループ内のすべてのデータベース (.edb ファイル, .stm ファイル) に対する一連のログファイルと補助ファイル (内部一時データベース、チェックポイント ファイル、予約ログ) で構成されています。Exchange Server 2003 では、複数のストレージ グループ、およびストレージ グループごとに複数のデータベースをサポートしています。Exchange Server 2003 では、1 台のサーバーが最大 4 個のストレージ グループをサポートし、1 個のストレージ グループが最大 5 個のデータベースをサポートしています。複数のデータベースがサポートされているため、多数のメールボックスとパブリック フォルダを多数の小規模データベースにわたって分散することができ、データベース管理が容易になります。Exchange 2000 Server および Exchange Server 2003 は、1 台のサーバー上で最大 20  個のメールボックス データベースとパブリック フォルダ データベースをサポートできます。

ストレージ グループのアーキテクチャ

次の図に示すように、すべてのストレージ グループが同じ Store.exe プロセスからホストされます。各ストレージ グループは、ESE インスタンスによって表されます。

6ff925c2-ec78-489a-b8ed-30891a3d25f2

各ストレージ グループ内では、それぞれの .edb および .stm データベースの組み合わせでメールボックス ストアまたはパブリック フォルダ ストアを表します。図 10.3 に示すように、特定のストレージ グループ内のすべてのメールボックスとパブリック フォルダ ストアは、共通のログファイル、その他のシステム ファイルのセットを共有します。これらのファイルにより、トランザクション指向の処理が行えるようになります。

各ストレージ グループのログ ファイルとその他のシステム ファイルには、次のような目的があります。

  • <ログの先頭文字>xxx.chk   どのトランザクションにトランザクション ログ ファイルからデータベースに移動する処理が必要かを判断するチェックポイント ファイルです (たとえば、E00.chk など)。チェックポイント ファイルの更新は、ESE が特定のトランザクションをディスク上のデータベース ファイルに書き込んだ時点で行われます。この更新によって、チェックポイント ファイルは常に、データベースへの移動が正常に終了した最後のトランザクションをポイントします。この更新によって、高速の回復メカニズムが提供されます。ただし、チェックポイント ファイルがトランザクションをデータベースにコミットする必要はありません。ESE には、直接トランザクション ログ ファイルを処理し、どのトランザクションがまだ移動されていないか自分自身で判断する機能があります。この処理は、チェックポイントを使用する場合よりも大幅に時間がかかります。

    note注 :
    Extensible Storage Engine は、トランザクションがデータベースに何度も書き込まれないことを保証します。
  • Exx.log   ストレージ グループ用の現在のトランザクション ログ ファイルです。トランザクション ログ ファイルにより、ESE は高速かつ効率的にデータ ストレージを管理できるようになります。ESE は、メッセージの配信などの新規のトランザクションをメモリ キャッシュとトランザクション ログに同時に格納します。データはシーケンシャルに書き込まれます。新しいデータは、複雑なデータベース操作を行うことなく、既存のデータに追加されます。トランザクションは後からまとめて、メモリ キャッシュから実際のデータベースに移動されます。これにより、データベースの更新が行われます。
    既定では、"最初のストレージ グループ" という名前の既定のストレージ グループは先頭文字に E00 を使用します。したがって、トランザクション ログ ファイルの名前は E00.log になります。E00.log は、このストレージ グループ内のすべてのメールボックスとパブリック ストアに使用されます。追加のストレージ グループを作成する場合、先頭文字の数値を E01、E02、E03 と増やします。

  • <ログの先頭文字>XXXXX.log   これ以上データを格納する余裕のないトランザクション ログ ファイルです。既定では、トランザクション ログ ファイルのサイズは、常に 5,242,880 バイト (5 MB) になっています。ログ ファイルのサイズを変更することは理論的に可能ですが、お勧めできません。ログがいっぱいになると、ファイル名が変更され、新規の空のトランザクション ログ ファイルを作成できるようになります。名前が変更されたトランザクション ログ ファイルには、以前のログ ファイルの名前が付けられます。以前のログ ファイルの名前付け形式は <ログの先頭文字>XXXXX.log (E00XXXXX.logなど) です。XXXXX は、00000 ~ FFFFF の 5 桁の 16 進数を表します。以前のログファイルは、現在のトランザクション ログ ファイルと同じディレクトリに存在します。

  • Res1.log と Res2.log   ストレージ グループ用に予約されたトランザクション ログ ファイルです。予約されたログ ファイルは、トランザクションの緊急時のリポジトリです。これらのファイルは、サーバーのディスクがいっぱいで新しいトランザクションをログ ファイル書き込めない場合でも、メモリからハード ディスクにトランザクションを書き込む十分なディスク領域を提供します。予約されたログ ファイルは、トランザクション ログ ディレクトリに含まれています。これらのファイルは、データベースが初期化されると自動的に作成されます。これらのファイルは、後から作成することはできません。
    ESE は、予約されたトランザクション ログ ファイルを、現在のトランザクション処理を完了するためにのみ使用します。次に、Store.exe にエラー通知を送信し、Exchange ストアのマウントを安全に解除します。アプリケーション イベント ログには、問題を示すエントリがあります。このような状況では、データベースを再度マウントする前に、ハード ディスクの追加の空き領域を作成する (たとえば、新しいハード ディスクを追加する) 必要があります。

  • Tmp.edb   トランザクションを処理するための一時的なワークスペースです。Tmp.edb には、ストレージ グループ内のすべてのストアのマウントが解除されたり、Exchange Information Store サービスが停止されたりすると削除される一時的な情報が含まれています。

    note注 :
    Tmp.edb はオンライン バックアップには含まれません。
  • <ファイル名>.edb   個々のプライベートまたはパブリック ストアのリッチ テキスト形式のデータベース ファイルです。既定のプライベート ストアに対するリッチ テキスト形式のデータベース ファイルは、"Priv1.edb" という名前になります。既定のパブリック ストアに対するファイルは、"Pub1.edb" という名前になります。

  • <ファイル名>.stm   個々のデータベースに対するストリーミング インターネット コンテンツ ファイルです。既定のプライベート ストアに対するストリーミング データベース ファイルは、"Priv1.stm" という名前になります。既定のパブリック ストアに対するファイルは、"Pub1.stm" という名前になります。

Active Directory 内のストレージ グループ属性

ストレージ グループのトランザクション ログ ファイルへのパスとログ ファイル名は、Exchange システム マネージャで特定できます。目的のストレージ グループを右クリックし、[プロパティ] をクリックして、[全般] タブの [トランザクション ログの場所] フィールドと [ログ ファイルの先頭文字] フィールドの情報を参照します。[参照] ボタンを使用して、トランザクション ログ ファイルとシステム ファイルを別の物理ドライブなどの新しい場所に移動できます。

ストレージ グループの構成設定は Active Directory に格納されます。ADSI Edit を使用してストレージ グループのディレクトリ オブジェクトを選択する場合は、構成名前付けコンテキストを開き、Services ノード、CN=Microsoft Exchange の順に展開します。次に、Exchange 組織オブジェクト、管理グループ、サーバー コンテナの順に展開します。その下に、CN=InformationStore という名前のコンテナが確認できます。このコンテナには、CN=最初のストレージ グループなどのストレージ グループが含まれています。ストレージ グループ オブジェクトのオブジェクト クラスは、msExchStorageGroup です。カスタム スクリプトを使用して Exchange ストア リソースを管理する場合は、Active Directory Service Interfaces (ADSI) を使用して msExchStorageGroup オブジェクトにアクセスできます。

次のコード例は、Contoso という名前の Exchange 組織にある SERVER01 という名前のサーバー上の既定のストレージ グループにアクセスする方法を示しています。そのストレージ グループのトランザクション ログ ファイルへの現在のパスが表示されます。

strStorageGroupDN = "CN=First Storage Group," _
                  & "CN=InformationStore," _
                  & "CN=SERVER01,CN=Servers," _
                  & "CN=First Administrative Group," _
                  & "CN=Administrative Groups," _
                  & "CN=Contoso,CN=Microsoft Exchange," _
                  & "CN=Services,CN=Configuration," _
                  & "DC=Contoso,DC=com"
Set oStorageGroup = GetObject("LDAP://" & strStorageGroupDN)
MsgBox oStorageGroup.Get("msExchESEParamLogFilePath")

ADSI に基づいて、カスタム スクリプトで使用できる msExchStorageGroup オブジェクトの重要な Exchange 属性を以下に示します。

  • msExchESEParamCircularLog   循環ログが有効か無効かを判断する論理値のフラグです。値 0 は循環ログが無効なことを示し、値 1 は有効なことを示します。
    コミットされた変更がディスク上のデータベース ファイルに転送されると、循環ログのために ESE はトランザクションを破棄します。チェックポイント ファイルは、データベースに正常にコミットされたログ ファイルとトランザクション エントリを示します。既存の以前のログはすべて削除されますが、その一方で、現在のトランザクション ログ ファイルのトランザクションは古いログ ファイルとしてマークされます。新しいトランザクションは、新しいログ ファイルが作成される前に現在のトランザクション ログから古いエントリを上書きします。

    note注 :
    トランザクションを削除することによって、循環ログはディスクの使用量を減らすことができます。ただし、循環ログはフォールト トレランスを持つ高度な構成、および既存のトランザクション ログに依存するいくつかの種類のオンライン バックアップとは互換性がありません。循環ログが有効な場合、実行できるのは完全バックアップのみです。差分または増分のバックアップなど、トランザクション ログ ファイルに依存するバックアップは実行できません。データを回復すると、トランザクション ログ ファイルの再生はできません。したがって、最新のバックアップ後のデータを回復することはできません。これに対し、循環ログによってトランザクションが自動削除されない場合、ハード ディスク上に存在するトランザクションを再生することで、最新のバックアップ以降のデータを回復できる場合があります。Exchange Server 5.5 では、循環ログが既定で有効になっていますが、Exchange 2000 Server と Exchange Server 2003 では既定で無効になっています。
  • msExchESEParamEventSource   言語に依存しないプロセス記述子の文字列です。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services の下のレジストリ内の Microsoft Exchange Information Store サービス キー (MsExchangeIS) をポイントします。

  • msExchESEParamLogFilePath   C:\Program Files\Exchsrvr\mdbdata などのストレージ グループのトランザクション ログ ファイルへのパスを決定する属性です。

  • msExchESEParamLogFileSize   ログ ファイルのサイズをキロバイト (KB) 単位で指定する属性です。既定値は 5,120 です。この値は変更できません。

  • msExchESEParamSystemPath   存在する可能性のある一時データベースへのパスに加え、C:\Program Files\Exchsrvr\mdbdata などのチェック ポイント ファイルを指すパスを指定する属性です。

  • msExchESEParamZeroDatabaseDuringBackup   バックアップ操作中に削除されたレコードと long 値が 0 で上書きされるかどうかを判断する論理値のフラグです。値 0 は、レコードが上書きされないことを示します。値 1 は、データベースがゼロで上書きされることを示します。

  • msExchESEParamEnableOnlineDefrag   Microsoft Exchange Information Store サービスが、オンラインでのデータベースの最適化を実行するかどうかを決定する論理値のフラグです。値 0 は、オンラインでの最適化を実行しないことを示します。値 1 は、スケジュールされた管理サイクル中に、オンラインでの最適化を実行することを示します。

    note注 :
    オンラインでの最適化はデータベースの領域を解放しますが、データベース ファイルのサイズが小さくなるわけではありません。ソフト リカバリと呼ばれるプロセスでサーバーの起動とシャットダウンを実行するごとに、データベース間の不整合が訂正されます。
  • msExchESEParamEnableIndexChecking   オペレーティング システムのバージョンで Unicode インデックスを確認するかどうかを判断する論理値のフラグです。値 0 は、インデックスの確認が実行されないこと示します。値 1 は、インデックスの確認が実行されることを示します。このパラメータは、新しいバージョンへのアップグレードや、Service Pack の適用によるオペレーティング システムの変更内容を検出します。このフラグによって、Unicode の並べ替え順序が変更されたかどうかを判断します。この方法でオペレーティング システムが変更された場合はいつでも、自動的に再インデックス処理が発生します。

  • msExchESEParamBaseName   このストレージ グループ内のログ ファイルの基本名を指定します。たとえば、基本名が E00 の場合、トランザクション ログ ファイルの名前は E00.log です。

  • msExchESEParamDbExtensionSize   データベースの拡張サイズをページ単位で指定します。既定値は 2 MB です。

  • msExchESEParamPageTempDBMin   一時データベースの最小サイズをページ単位で指定します。既定値は 0 です。

  • msExchESEParamCheckpointDepthMax   適した (困難でない) チェックポイントの最大の深さをバイト単位で指定します。

ストレージ グループに必要なディスクの最小空き領域

各ストレージ グループは、約 50 MB の空きディスク領域を消費します。ストレージ グループに必要な上記のファイルは、最低で 11 MB のディスク領域を使用します。プライベート ストアおよびパブリック ストアの最小ディスク容量は、それぞれ 5 MB と 8 MB です。合計の消費ディスク容量は約 24 MB ですが、実際にストレージ グループを作成したり、読み取りおよび書き込み操作を行ったりする場合には追加のディスク領域が必要です。

ストレージ グループを操作する場合は、次のことに注意してください。

  • Exchange Server 2003 を実行しているサーバーは、最大 5 個のストレージ グループを持つことができます。ストレージ グループの 1 つがデータベース回復操作のために予約されているため、クライアントがアクセス可能なデータベースとして保持できるのは 4 つのストレージ グループのみです。5 個以上のストレージ グループを作成しようとすると、エラー メッセージが表示されます。
  • 1 個のストレージ グループには 5 つのデータベースしか作成できません。5 個以上のデータベースを作成しようとすると、エラー メッセージが表示されます。

Exchange ストア データベース

Exchange Server は、データベースの構造を決定し、メモリを管理する埋め込みデータベース エンジンとして ESE を使用します。データベース エンジンは、4 KB 単位 (ページ単位) でデータをメモリから出し入れすることによって、データベースをメモリにキャッシュします。データベース エンジンはメモリのページを更新し、新しいページ、または更新されたページをディスクに書き込みます。システムに要求が送信されると、データベース エンジンはデータをメモリにバッファすることができるので、常時ディスクにアクセスする必要はありません。メモリへの書き込みはディスクへの書き込みよりも 200,000 倍も高速であることから、システムの効率が向上します。ユーザーが要求を行うと、データベース エンジンによって要求のメモリへの読み込みが開始され、そのページは "ダーティ" としてマークされます。ダーティ ページは、データを含むメモリ内のページのことです。これらのダーティ ページは、後からディスク上の Microsoft Exchange Information Store サービス データベースに書き込まれます。

データのメモリへのキャッシュは、最も高速で、最も効率的にデータを処理できる方法ですが、Exchange の実行中は、ディスク上の情報は完全に最新の状態ではありません。最新バージョンのデータベースがメモリに存在し、メモリ内の多くの変更内容がまだディスクに反映されていないために、データベースとメモリが同期されていません。メモリにまだディスクへの転送と書き込みが行われていないダーティ ページが存在する場合、データベースは "不整合" のフラグが付けられます。Exchange データベースは、メモリ内のすべてのダーティ ページがディスクに転送された場合にのみ同期されます。これは、Microsoft Exchange Information Store サービスが正常にシャットダウンされた場合に行われます。シャットダウン プロセスの実行中、Microsoft Exchange Information Store サービスはすべてのページをディスクにフラッシュします。

MAPI データベース ファイル

Exchange Server 2003 MAPI データベース ファイルには、すべての電子メール メッセージ、データベース内のその他オブジェクト、および MAPI メッセージの内容に対するメタデータを保持するテーブルが含まれています。Microsoft Office Outlook で表示されるすべてのフォルダは、Exchange ストア内の個別のデータベース テーブルです。フォルダの表示に使用される並べ替えの順序はすべて、テーブル上の個別のインデックスによって表されます。こうした並べ替えの順序の管理は Store.exe プロセスで行われます。

Outlook などの MAPI クライアントからのメッセージは、以前のバージョンの Exchange サーバーに格納される場合と同様に、MAPI データベースに格納されます。これにより、MAPI ベースのクライアントは、変換を行わずにこれらのメッセージにアクセスできます。ただし、インターネット プロトコル ベースのクライアントがこのデータベース内のメッセージを読み取ろうとすると、メッセージは要求された形式に変換されます。

従来の .edb ファイルは、付属の .stm ファイルと組み合わせて 1 つの単位になります。これらのファイルは、どちらか 1 つだけではほとんど役に立ちません。Microsoft Exchange Server Information Store サービスでは、1 つのデータベースに .edb ファイルと .stm ファイルの 2 つのファイルが含まれていることを理解することが重要です。

.edb ファイルのレコードには、生データを含むストリーミング ファイルのページの一覧を参照する列 (データ型 JET_coltypSLV) が含まれます。.edb ファイルに格納されるのは、ストリーミング ファイルのデータに関するメモリ使用量 (最大 4 KB ×ページ数) とチェックサム データです。

ストリーミング データベース ファイル

Exchange Server 5.5 以前では、メッセージを MDBEF (Message Database Encapsulated Format) で格納します。これは、Outlook クライアントのためのネイティブ形式です。MAPI 以外のクライアントがメッセージを要求すると、Microsoft Exchange Information Store サービスが要求の内容に応じて、コンテンツを MDBEF から適切な形式へと変換します。この変換によって、プロセッサの帯域幅が消費され、サーバーのパフォーマンスが低下します。

新しいバージョンの ESE を使用すると、インターネット メッセージング クライアントは生データをネイティブ形式で格納できます。この生データのリポジトリは、ストリーミング データベース、または単純にストリーミング ファイルと呼ばれます。ストリーミング ファイルには B ツリー (Balanced Tree) のオーバーヘッドがありません。代わりに、2 つの 4 KB ページのヘッダー情報と 4 KB ページの生データが含まれます。このようなフラットなデータ構造は、コンテンツの変換が必要になる可能性が低く、非常に高速に受信および送信することが可能なバイナリ ラージ オブジェクト (BLOB) のデータ用に作成されたものです。

プロパティ昇格

プロパティ昇格は、データを ESE データベースに格納する場所を決める重要な概念であるため、理解する必要があります。Microsoft Exchange Information Store サービスでは, .stm ファイルに保持されているデータの .edb ファイルへのプロパティ昇格をサポートしています。プロパティ昇格によって、フォルダの表示とインデックスの効率的な管理が可能になります。たとえば, .stm ファイルに送信されたメッセージは、送信者、件名、送信日、受信日などのプロパティを持ち, .edb ファイルのメッセージを表すレコードに昇格します。

Microsoft Outlook などの MAPI クライアントが Microsoft Exchange Information Store サービスにメッセージを発信すると、そのメッセージの内容は .edb ファイルに格納されます。MAPI 以外のクライアントがメッセージを開くと、Microsoft Exchange Information Store サービスは一部の変換と IMAIL 呼び出しを実行し、続いて RTFHTML を呼び出して MAPI コンテンツからインターネット形式への直接変換を行います。この変換はいずれも継続的には行われません。したがって、データが .edb ファイル以外の場所に移動されたり, .stm ファイルに書き込まれたりすることはありません。

インターネット クライアントが Microsoft Exchange Information Store サービスにメッセージを送信すると、そのメッセージの内容は .stm ファイルに格納されます。インターネット メッセージから特定のヘッダーが .edb ファイルに複製されるため、Microsoft Exchange Information Store サービスはメッセージを検索できます。これを状態 0 変換と呼びます。

クライアントが PR_Subject などのプロパティ、または多くのエイリアスのうちの 1 つを要求すると、Microsoft Exchange Information Store サービスはインターネット メッセージのヘッダー情報をプロパティに昇格させます。これを状態 1 変換と呼びます。

クライアントが添付ファイル情報を要求すると、Microsoft Exchange Information Store サービスはインターネット メッセージのほぼ完全な複製 (MAPI 形式) を作成します。最初、メッセージは .stm ファイルに存在します。ただし、MAPI アクセスに必要なデータの多くは, .edb ファイルにあります。クライアントが、MIME (Multipurpose Internet Mail Extensions) を変える方法でメッセージを変更する場合, .stm ファイルのメッセージは破棄され, .edb ファイルのメッセージが保持されます。これを状態 2 変換と呼びます。

Exchange サーバーが Application/ms-tnef コンテンツを含むインターネット コンテンツを受信する場合、メッセージを Microsoft Exchange Information Store サービスに発信する方法には関係なく、そのメッセージは最初に .stm ファイルに配信されますが、すぐにデコードされ, .edb ファイルに移されます。同じことが、UUEncode を使用してエンコードされた、winmail.dat が添付したメッセージにも当てはまります。TNEF (Transport Neutral Encapsulation Format) と Winmail.dat は、MAPI に対応していないトランスポート上で MAPI プロパティを保持するための MAPI メッセージをカプセル化する方法です。したがって、MAPI メッセージは .edb ファイルに格納され、インターネット メッセージは .stm ファイルに格納されるという一般的な原則は正しいと言えます。現在の機能には、いずれかの MAPI プロパティの読み取りが行われる前にデコードされる TNEF があります。