【问题标题】:Setting up Jackrabbit in a cluster environment在集群环境中设置 Jackrabbit
【发布时间】:2011-10-30 20:56:00
【问题描述】:

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

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

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

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

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

以下是问题:

  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>

【问题讨论】:

    标签: liferay cluster-computing jackrabbit


    【解决方案1】:

    Jackrabbit 是强制性的吗? Liferay 使用存储引擎来存储“只是”二进制数据,所有元数据都在 Liferay 的数据库中,因此您不会从 JCR 存储库中获得太多收益。这是不幸的,但当前实现的工作方式。

    下一步:您是在设置 Jackrabbit 集群还是 Liferay 集群?对于 Jackrabbit 集群(在单个 Liferay 节点环境中),我真的无能为力。如果你集群 Liferay,你会在 administration guide 中找到一些信息(单击 pdf 链接 - 遗憾的是,html 中指向 clustering chapter 的直接链接已损坏,但你会在 pdf 中找到该章节 - 它正在工作.)

    Liferay 集群的一些细节:

    Liferay 期望文档库是“原子的”——即:写在 Liferay 的一个节点上的文档应该可以立即在 Liferay 集群中的每个其他节点上读取。您在管理指南中找到的 jackrabbit 解决方案使 jackrabbit 使用数据库进行共享。但是你会看到推荐的解决方案不是你使用 Jackrabbit,而是 AdvancedFilesystemHook - 除了默认的 FileSystemHook 之外,它将文档存储在多个子目录中(适用于网络共享,推荐 SAN)。默认的 FileSystemHook 受限于单个目录中允许的文件数量(由操作系统),AdvancedFileSystemHook 将通过创建多个子目录(如 unix 邮件池目录)来规避这一点。如果它只是用于“一些”文档 - 没有达到任何操作系统限制 - 我希望 FileSystemHook 在共享目录上也能正常工作,但我不太确定那里的文件锁定问题。

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

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

    【讨论】:

    • 感谢您的详细回答。我将赏金奖励给了第一响应者,因为他也建议使用 AdvancedFileSystemHook。我也会奖励你,但不幸的是系统不允许。你的回答是我所做的 - 我使用了 FileSystemHook,我认为我不会得到比文件系统允许的更多的东西,我认为不会很快,我可以创建新目录。虽然我没有看到有 AdvancedFileSystemHook,但在 portal.properties 中偶然发现了 FileSystemHook。
    • 没问题 - 我没有回答赏金问题。顺便说一句:如果以后需要,您可以从 FileSystemHook 迁移到 AdvancedFileSystemHook(甚至 Jackrabbit)。控制面板/服务器设置中有一个数据迁移选项卡,您可以使用它来回移动数据
    • 谢谢,很高兴知道,可能会。除了文件数量之外,AdvancedFileSystemHook 还有其他好处吗?
    【解决方案2】:

    Liferay 的官方文档建议在集群场景中使用数据库而不是文件系统来共享 Jackrabbit 数据。

    假设您在每个 Liferay 节点上使用文件系统(即开箱即用的 Liferay 配置)。节点 A 将无法访问节点 B 上的 Jackrabbit 数据,反之亦然。随着时间的推移,节点变得越来越不同步。为了解决这个问题,您可以创建一个网络共享并将每个节点配置为指向该共享。这样做的问题是,如果每个 Liferay 节点同时写入,可能会导致文件损坏。

    这让您有两个选择;保持独立的文件系统并集成同步实用程序或将数据放入数据库中。由于文件系统同步充其量是 hokey,因此您最好的选择是将 Jackrabbit 数据放入数据库中。

    使用数据库有一些优点和缺点。它可能会降低性能,真的。同时,数据现在是常规灾难恢复策略的一部分,有些人可能会认为它更便携。

    编辑 - 添加:在 5.2 版中的某个时间点添加了 AdvancedFileSystemHook,它解决了使用共享网络文件系统时文件损坏和锁定问题的问题。为了实现这一点,请将您的 portal-ext.properties 文件更改为使用 AdvancedFileSystemHook,将您的数据迁移到共享位置,将您的水平节点指向共享位置。

    【讨论】:

    • 其实我也是这么做的,我用了FileSystemHook,指向我们的文件系统。
    • 我们在使用 FileSystemHook 时遇到了一些文件损坏问题,这就是我推荐 AdvancedFileSystemHook 的原因。在很多环境中,使用哪个 Hook 并不重要。在 this Liferay Forum post 上有一个关于它的轻量级讨论
    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2014-09-30
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多