AEM 6 の AEM プラットフォームは、Apache Jackrabbit Oak に基づいています。
Apache Jackrabbit Oak は、昨今の世界規模の web サイトや、要求の厳しいその他のコンテンツアプリケーションの基盤として使用する、スケーラビリティとパフォーマンスに優れた階層構造のコンテンツリポジトリを実装するための取り組みです。
これは Jackrabbit 2 の後継であり、コンテンツリポジトリである CRX のデフォルトのバックエンドとして AEM 6 で使用しています。
Oak は JSR-283(JCR 2.0)仕様を実装します。その設計の主な目的は次のとおりです。
ストレージレイヤーの目的は次のとおりです。
Oak Core は、ストレージレイヤーに複数のレイヤーを追加します。
Oak JCR の主な目的は、JCR セマンティクスをツリー操作に変換することです。また、次の役割も果たします。
また、Oak JCR の概念の一環として、Java 以外の実装も可能になりました。
Oak ストレージレイヤーは、コンテンツの実際のストレージに抽象化レイヤーを提供します。
現在、AEM6 では 2 つのストレージ実装(Tar ストレージと MongoDB ストレージ)を使用できます。
Tar ストレージでは tar ファイルを使用します。このストレージは、規模の大きいセグメント内の様々なタイプのレコードとしてコンテンツを格納します。リポジトリの最新の状態の追跡にはジャーナルが使用されます。
設計の中心となる重要な原則を次に示します。
コンテンツは、最大 256 KiB のサイズのセグメントに格納されます。このセグメントは不変であり、そのため、頻繁にアクセスされるセグメントを簡単にキャッシュして、リポジトリの破損につながるシステムエラーを削減できます。
各セグメントは一意の識別子(UUID)によって識別されます。各セグメントには、コンテンツツリーの連続したサブセットが格納されます。また、セグメントは他のコンテンツを参照できます。各セグメントには、参照先の他のセグメントの UUID のリストが保持されます。
通常、関連するレコード(ノードやその直下の子など)は同じセグメントに格納されます。これにより、リポジトリの検索が迅速化され、セッションごとに複数の関連ノードにアクセスする一般的なクライアントの大部分のキャッシュミスを回避できます。
I/O コストを削減し、可能な限りキャッシュにコンテンツを収めるように、レコードの形式がサイズに合わせて最適化されます。
MongoDB ストレージは、MongoDB を活用してシャーディングとクラスター化をおこないます。リポジトリツリーは 1 つの MongoDB データベースに保持されます。このデータベースでは、各ノードは個別のドキュメントになります。
このストレージには、次に示すいくつかの特徴があります。
コンテンツの更新(コミット)ごとに、新しいリビジョンが作成されます。基本的に、リビジョンは次の 3 つの要素で構成される文字列です。
ブランチがサポートされます。ブランチを使用すると、クライアントで複数の変更をステージングして、それらを 1 回のマージの呼び出しで表示できます。
MongoDB ストレージは、変更のたびにデータをドキュメントに追加します。ただし、クリーンアップが明示的にトリガーされた場合は、データの削除だけをおこないます。特定のしきい値を満たすと、古いデータが移動されます。以前のドキュメントには、不変のデータだけが格納されます。つまり、コミットおよびマージ済みのリビジョンだけが格納されます。
クラスターの操作を容易におこなうために、アクティブおよび非アクティブなクラスターノードに関するデータがデータベースに保持されます。
MongoDB ストレージを使用した一般的な AEM クラスターのセットアップは次のようになります。
Oak は JCR 1.0 標準との下位互換性を確保するように設計されているので、ユーザーレベルでの変更はほとんどありません。ただし、Oak ベースの AEM インストールをセットアップする場合に考慮しなければならない顕著な違いがいくつか存在します。
AEM プラットフォームについて詳しくは、以下の記事も参照してください。