2

Jackrabbit をクラスターにセットアップしたい (Liferay でセットアップしています)。

私はこのドキュメントを読みました - http://wiki.apache.org/jackrabbit/Clustering、残念ながら非常に短いので、概念とベストプラクティスのいくつかを理解していません。最初に、私のセットアップが何であるかを説明しましょう。

同じファイルシステムを共有する 2 つの weblogic サーバーがあり、同じ war を両方の weblogic にデプロイします。Oracle をデータベースとして使用しています (WL で構成された接続プールがあり、JNDI を使用して接続したい)

ドキュメントから理解しているように、各ノードには、独自のリポジトリディレクトリ、ワークスペースファイルシステム、および検索インデックスを備えた個別の構成が必要です。

両方のノードが PersistranceManager、リポジトリ ファイルシステム、およびデータストアを共有します (ある場合)

質問は次のとおりです。

  1. ワークスペース ファイルシステムとは何か、リポジトリ ファイルシステムとはどう違うのか。ワークスペースとは - 私が理解しているように、それはリポジトリの一部であり、リポジトリは複数のワークスペースを持つことができますが、ワークスペースとはドキュメントに記載されていません。

  2. 私はパフォーマンスを最高にしたいと考えています。多くのコンテンツとユーザー (数十人の同時ユーザー) を必要としないため、ページのレンダリングを高速化するためにページの読み込み時間を最適化したいと考えています。ベストプラクティスは何ですか - PersistanceManager を db に移動するように設定する必要がありますか?

  3. リポジトリファイルシステムは各ノードのどこを指す必要がありますか?

  4. ワークスペースは各ノードのどこを指す必要がありますか?

  5. ワークスペースのファイルシステムはどこを指す必要がありますか?

それらすべてを自分のデータベースに向けようとしましたが、デッドロックが発生しているようです (またはデータベースの動作が遅すぎます)。

そして、ログを有効にすると、多くの不要な読み取りが表示されます。ファイルのアップロードごとに、jackrabbit が接続を開き、すべてのファイルを事前にキャッシュし、閉じて、非常に小さなファイルをアップロードするために数回 (約 1 分かかります)、ほとんどの場合、私の設定に何か問題があります。

ここに私の設定ファイルがあります:

<?xml version="1.0"?>
<Repository>
<FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem">
        <param name="driver" value="javax.naming.InitialContext"/>
        <param name="url" value="ISG" />

    <param name="schema" value="oracle"/>
    <param name="schemaObjectPrefix" value="J_R_FS_"/>
</FileSystem>
<Security appName="Jackrabbit">
    <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager" />
    <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
        <param name="anonymousId" value="anonymous" />
    </LoginModule>
</Security>
<Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="liferay" />
<Workspace name="${wsp.name}">
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.db.OraclePersistenceManager">
            <param name="driver" value="javax.naming.InitialContext"/>
            <param name="url" value="ISG" />
        <param name="tableSpace" value="" />

        <param name="schema" value="oracle" />
        <param name="schemaObjectPrefix" value="J_PM_${wsp.name}_" />
        <param name="externalBLOBs" value="false" />
    </PersistenceManager>

    <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem">
            <param name="driver" value="javax.naming.InitialContext"/>
            <param name="url" value="ISG" />
        <param name="tableSpace" value="" />

        <param name="schema" value="oracle"/>
        <param name="schemaObjectPrefix" value="J_FS_${wsp.name}_"/>
    </FileSystem>
</Workspace>
<Versioning rootPath="${rep.home}/version">
    <FileSystem class="org.apache.jackrabbit.core.fs.db.OracleFileSystem">
            <param name="driver" value="javax.naming.InitialContext"/>
            <param name="url" value="ISG" />

        <param name="schema" value="oracle"/>
        <param name="schemaObjectPrefix" value="J_V_FS_"/>
    </FileSystem>
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.db.OraclePersistenceManager">
            <param name="driver" value="javax.naming.InitialContext"/>
            <param name="url" value="ISG" />
        <param name="tableSpace" value="" />

        <param name="schema" value="oracle" />
        <param name="schemaObjectPrefix" value="J_V_PM_" />
        <param name="externalBLOBs" value="false" />
    </PersistenceManager>
</Versioning>

<Cluster id="node_1" syncDelay="2000">
  <Journal class="org.apache.jackrabbit.core.journal.OracleDatabaseJournal">
        <param name="revision" value="${rep.home}/revision.log"/>
            <param name="driver" value="javax.naming.InitialContext"/>
            <param name="url" value="ISG" />
        <param name="tableSpace" value="" />

        <param name="schema" value="oracle"/>
        <param name="schemaObjectPrefix" value="J_C_"/>
    </Journal>
</Cluster>
</Repository>
4

2 に答える 2

2

Liferay の公式ドキュメントでは、ファイル システムではなく、クラスタ化されたシナリオでデータベースを使用して Jackrabbit データを共有することを推奨しています。

各Liferayノードでファイルシステムを使用しているとしましょう(これは、すぐに使用できるLiferay構成です)。ノード A はノード B の Jackrabbit データにアクセスできず、その逆も同様です。時間が経つにつれて、ノードはますます同期しなくなります。これを回避するには、ネットワーク共有を作成し、各ノードがその共有を指すように構成します。これを行う際の問題は、各 Liferay ノードが同時に書き込みを行っている場合にファイルが破損する可能性があることです。

これには 2 つのオプションがあります。独立したファイル システムを維持し、同期ユーティリティを統合するか、データをデータベースに配置します。ファイル システムの同期はせいぜい面倒なので、Jackrabbit のデータをデータベースに格納するのが最善の方法です。

データベースの使用には、いくつかの長所と短所があります。パフォーマンスが低下する可能性があります。同時に、データは現在、通常の災害復旧戦略の一部であり、移植性が高いと主張する人もいます。

編集 - 追加: バージョン 5.2 のある時点で AdvancedFileSystemHook が追加されました。これにより、共有ネットワーク ファイル システムを使用する際のファイルの破損とロックの問題が解決されます。これを実装するには、Portal-ext.properties ファイルを変更して AdvancedFileSystemHook を使用し、データを共有場所に移行し、水平ノードを共有場所に向けます。

于 2011-08-26T18:56:49.127 に答える
1

Jackrabbit は必須ですか? Liferay はストレージ エンジンを使用して「単なる」バイナリ データを保存します。すべてのメタ データは Liferay のデータベースにあるため、JCR リポジトリから多くを得る必要はありません。これは残念ですが、現在の実装の仕組みです。

次へ: Jackrabbit クラスターまたは Liferay クラスターをセットアップしていますか? Jackrabbit クラスター (単一の Liferay ノード環境) の場合、私は本当に助けられません。Liferay をクラスター化すると、管理ガイドにいくつかの情報が表示されます (pdf リンクをクリックします。残念ながら、HTML のクラスター化の章への直接リンクは壊れていますが、pdf で章を見つけることができます。動作しています)。

Liferay クラスタリングの詳細:

Liferay は、ドキュメント ライブラリが「アトミック」であることを期待しています。つまり、Liferay のノードの 1 つで書かれたドキュメントは、Liferay クラスタ内の他のすべてのノードですぐに読み取れる必要があります。管理ガイドにある jackrabbit-solution により、jackrabbit はデータベースを使用して共有できます。ただし、推奨される解決策は、Jackrabbit を使用するのではなく、AdvancedFilesystemHook を使用することであることがわかります。デフォルトの FileSystemHook 以外に、ドキュメントを複数のサブディレクトリに保存します (ネットワーク共有で動作し、SAN を推奨します)。デフォルトの FileSystemHook は、1 つのディレクトリで (OS によって) 許可されるファイルの数によって制限されます。AdvancedFileSystemHook は、複数のサブディレクトリ (UNIX の mailspool ディレクトリなど) を作成することでこれを回避します。「少しだけ」なら

何十人ものユーザーがいるとおっしゃっているように、最大​​のパフォーマンスを気にするのは行き過ぎのようです。考えられる解決策のいずれにも違いはないと思います。この程度のクラスタリングは、少なくとも Liferay の観点からは、パフォーマンスよりもフェイルオーバー (例: 高可用性) に関するものです。

Liferay クラスターをセットアップする場合は、その章で名前が挙げられている他のすべてのトピック、特にキャッシュ同期にも従うことを確認してください。そうしないと、ドキュメント ライブラリ クラスターが同期していないキャッシュだけでは機能しないと誤解される可能性があります。

于 2011-08-27T20:41:00.123 に答える