在群集环境中设置Jackrabbit

时间:2011-08-19 19:07:01

标签: liferay cluster-computing jackrabbit

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

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

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

据我所知,每个节点都必须有一个单独的配置,它有自己的存储库目录,工作空间文件系统和搜索索引。

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

以下是问题:

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

  2. 我希望性能最好,我不会有太多的内容和用户(10个并发用户),所以我想优化页面加载时间,以便更快地呈现页面。什么是最佳实践 - 我应该将PersistanceManager配置为db吗?

  3. 存储库文件系统应该指向每个节点吗?

  4. 工作空间应指向每个节点的位置?

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

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

    我启用了日志记录,我看到了很多不必要的读取,看起来每次上传文件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>
    

2 个答案:

答案 0 :(得分:2)

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

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

这给你留下两个选择;保留独立的文件系统并集成同步实用程序或将数据放入数据库。由于文件系统同步最多,因此最好的选择是将Jackrabbit数据放入数据库中。

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

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

答案 1 :(得分:1)

Jackrabbit是强制性的吗? Liferay使用存储引擎存储“仅”二进制数据,所有元数据都在Liferay的数据库中,因此您无法从JCR存储库中获得很多收益。这很不幸,但目前的实施方式仍然有效。

下一步:您是在设置Jackrabbit群集还是Liferay群集?对于Jackrabbit集群(在单个Liferay节点环境中),我无法提供帮助。如果你对Liferay进行聚类,你会在administration guide中找到一些信息(点击pdf链接 - 遗憾的是,html中clustering chapter的直接链接已被破坏,但你会在pdf中找到这一章。 - 它在那里工作。)

有关Liferay聚类的一些细节:

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

正如你所说,你拥有10个用户,关注最高性能似乎是最重要的。我不希望任何可能的解决方案有任何差异。这种数量级的聚类更像是故障转移(例如高可用性)而不是性能 - 至少从Liferay的角度来看。

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