我们使用hibernate-search对wildfly 8.2中的实体进行全文索引(使用hibernate / hibernate-search和infinspan库,包括wildfly 8.2) . 作为独立节点运行或在具有专用hibernate搜索主机和 org.hibernate.search.store.impl.FSDirectoryProvider 的域中运行已经好几年(和jboss版本) .

我们现在想要将此系统部署到HA集群环境中,并在负载 balancer 代理后面运行wildfly 8.2 . 我们希望拥有一个动态可扩展的集群,在域主服务器或hibernate-search主服务器的意义上没有故障点,并且已针对没有域的独立节点进行了配置 . 为了选举HS主控,我们正在使用jgroups后端并复制我们正在使用infinispan提供程序的hibernate-search数据 file-store 以在重新启动之间保留数据 .

我很快就开始运行,并且非常兴奋,因为它看起来像一个强大且可扩展的场景,但我有点犹豫是否将这个配置投入 生产环境 ,因为jgroups后端被称为“实验性”(并且在一些论坛中) “非常实验性的”) . 后端的当前状态是什么?人们目前是否在 生产环境 中使用它?我们可以做些什么来最小化使用此配置的风险?

另外,有没有人有过在这个星座中使用infinispan和hibernate-search的经验?关于 replicated-cache 的大多数设置只是从现有的例子中重复使用,如果有人对这些设置有一些提示或建议,例如它会扩展到索引~50GB?我非常感谢任何有关类似场景的反馈或经验 .

配置主要使用此处的参考资料放在一起:

我们采取的详细步骤包括在下面 .

  • 作为基础,我们采取并扩展了 standalone-ha-full.xml

  • 配置jgroups以使用TCP堆栈

  • 运行TCPPING而不是MPing(我们计划在 Cloud 环境中运行,其中multicast / udp会导致问题 - 我们可能会转向JDBCPing以使其在某些时候更加灵活) .

  • 我们运行每个节点的以下系统属性(当然每个节点的名称/端口更改)

系统属性:

<system-properties>        
   <property name="jboss.node.name" value="node2" />  
   <property name="jboss.socket.binding.port-offset" value="889" />  
   <!-- Automatic master election via JGroups, requires Infinispan directory provider -->
   <property name="hibernate.search.default.worker.backend" value="jgroups"/>
   <!-- Enable cluster-replicated index, but the default configuration does not enable any 
   form of permanent persistence for the index, we do this with cache-container/file-store below  -->
   <property name="hibernate.search.default.directory_provider" value="infinispan" />
   <property name="hibernate.search.infinispan.chunk_size" value="300000000" />
   <property name="hibernate.search.reader.strategy" value="shared" />
   <property name="hibernate.search.worker.execution" value="sync" />
   <property name="hibernate.search.default.optimizer.operation_limit.max"    value="10000"/>
   <property name="hibernate.search.default.optimizer.transaction_limit.max"    value="1000"/>
   <!-- Use CacheManager defined in WildFly configuration file, e.g., standalone.xml -->
   <property name="hibernate.search.infinispan.cachemanager_jndiname" value="java:jboss/infinispan/container/hibernate-search"/>
</system-properties>

我们为infinispan定义了以下 <cache-container>

<!-- BEGIN HIBERNATE INFINISPAN CACHE -->
<cache-container name="hibernate-search" jndi-name="java:jboss/infinispan/container/hibernate-search" start="EAGER">
    <transport lock-timeout="330000"/>
    <replicated-cache name="LuceneIndexesMetadata" start="EAGER" mode="SYNC" remote-timeout="330000">
        <locking striping="false" acquire-timeout="330000" concurrency-level="500"/>
        <transaction mode="NONE"/>
        <eviction strategy="NONE" max-entries="-1"/>
        <expiration max-idle="-1"/>
        <state-transfer enabled="true" timeout="480000"/>
        <file-store preload="true" purge="false" passivation="false" relative-to="jboss.home.dir" path="..\namespaces\mc\infinispan-file-store">
            <write-behind/>
        </file-store>
        <indexing index="NONE"/>
    </replicated-cache>
    <replicated-cache name="LuceneIndexesData" start="EAGER" mode="SYNC" remote-timeout="25000">
        <locking striping="false" acquire-timeout="330000" concurrency-level="500"/>
        <transaction mode="NONE"/>
        <eviction strategy="NONE" max-entries="-1"/>
        <expiration max-idle="-1"/>
        <state-transfer enabled="true" timeout="480000"/>
       <file-store preload="true" purge="false" passivation="false" relative-to="jboss.home.dir" path="..\namespaces\mc\infinispan-file-store">
            <write-behind/>
        </file-store>
        <indexing index="NONE"/>
    </replicated-cache>
    <replicated-cache name="LuceneIndexesLocking" start="EAGER" mode="SYNC" remote-timeout="25000">
        <locking striping="false" acquire-timeout="330000" concurrency-level="500"/>
        <transaction mode="NONE"/>
        <eviction strategy="NONE" max-entries="-1"/>
        <expiration max-idle="-1"/>
        <state-transfer enabled="true" timeout="480000"/>
        <indexing index="NONE"/>
    </replicated-cache>
</cache-container>
<!-- END HIBERNATE INFINISPAN CACHE -->

根据我的理解(我的测试似乎在实践中),infinispan会将其数据序列化为已配置的 <file-store> ,然后在节点重新启动之间保留数据 . 甚至一些灾难性测试(例如 kill -9 <jboss-pid> )已显示在节点恢复时干净地恢复索引 . 在脱机期间,另一个节点接管主节点,集群平稳运行 .