2

我想在集群中设置 Jackrabbit(我正在使用 Liferay 进行设置)。

我读了这个文件 - http://wiki.apache.org/jackrabbit/Clustering,不幸的是它很短,所以我不理解一些概念和最佳实践。让我先解释一下我的设置是什么:

我们有 2 个共享相同文件系统的 weblogic 服务器,我们将相同的战争部署到两个 weblogics。我使用 Oracle 作为数据库(我在 WL 中配置了连接池并希望使用 JNDI 进行连接)

正如我从文档中了解到的,每个节点都必须有一个单独的配置,包括它自己的存储库目录、工作区文件系统和搜索索引。

两个节点共享 PersistranceManager、存储库文件系统和数据存储(如果我有的话)

以下是问题:

  1. 什么是工作区文件系统,它与存储库文件系统有何不同。什么是工作区-据我了解,它是存储库的一部分,存储库可以有多个工作区,但文档中没有描述什么是工作区。

  2. 我希望性能是最好的,我不需要太多的内容和用户(10 多个同时用户),所以我想优化页面加载时间以更快地呈现页面。最佳实践是什么 - 我应该配置 PersistanceManager 去数据库吗?

  3. 每个节点上的存储库文件系统应该指向哪里?

  4. 每个节点上的工作空间应该指向哪里?

  5. 工作区文件系统应该指向哪里?

我试图将它们全部指向我的数据库,但我似乎有死锁(或数据库工作太慢)。

而且我启用了日志记录,我看到很多不必要的读取,看起来像每次上传文件jackrabbit打开连接,预先缓存所有文件,关闭并执行几次(大约需要一分钟)上传非常小的文件,我的配置很可能有问题。

这是我的配置文件:

<?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 节点同时写入,可能会导致文件损坏。

这使您有两个选择;保持独立的文件系统并集成同步实用程序或将数据放入数据库中。由于文件系统同步充其量只是做作,因此最好的选择是将 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 的一个节点上编写的文档应该可以立即在 Liferay 集群中的每个其他节点上读取。您在管理指南中找到的 jackrabbit 解决方案使 jackrabbit 使用数据库进行共享。但是你会看到推荐的解决方案不是你使用 Jackrabbit,而是 AdvancedFilesystemHook - 除了默认的 FileSystemHook 之外,它将文档存储在多个子目录中(适用于网络共享,推荐 SAN)。默认的 FileSystemHook 受限于单个目录中允许的文件数量(由操作系统),AdvancedFileSystemHook 将通过创建多个子目录(如 unix 邮件池目录)来规避这一点。如果只是为了“几个”

正如您所说,您有 10 位用户,关心最高性能似乎是最重要的。我不希望任何可能的解决方案有任何不同。这个数量级的集群更关乎故障转移(例如高可用性)而不是性能——至少从Liferay 的角度来看是这样。

如果您正在设置 Liferay 集群,请确保您还遵循该章节中提到的所有其他主题——尤其是缓存同步。否则,您可能会误以为您的文档库集群在它只是一个不同步的缓存时不起作用。

于 2011-08-27T20:41:00.123 回答