&引用;“实验性”;hibernate搜索和infinispan的JGroups主/从后端状态

&引用;“实验性”;hibernate搜索和infinispan的JGroups主/从后端状态,hibernate,wildfly,hibernate-search,infinispan,jgroups,Hibernate,Wildfly,Hibernate Search,Infinispan,Jgroups,我们在wildfly 8.2中使用hibernate搜索对实体进行全文索引(使用hibernate/hibernate搜索和包含wildfly 8.2的infinspan库)。作为独立节点运行或在具有专用hibernate搜索主机和org.hibernate.search.store.impl.FSDirectoryProvider的域中运行多年来(以及jboss版本) 我们现在希望将此系统部署到HA集群环境中,并在负载平衡代理后运行wildfly 8.2。我们希望拥有一个动态可扩展的集群,没有

我们在wildfly 8.2中使用hibernate搜索对实体进行全文索引(使用hibernate/hibernate搜索和包含wildfly 8.2的infinspan库)。作为独立节点运行或在具有专用hibernate搜索主机和
org.hibernate.search.store.impl.FSDirectoryProvider
的域中运行多年来(以及jboss版本)

我们现在希望将此系统部署到HA集群环境中,并在负载平衡代理后运行wildfly 8.2。我们希望拥有一个动态可扩展的集群,没有域主机或hibernate搜索主机意义上的故障点,并为此配置了没有域的独立节点。为了选择HS主机,我们使用jgroups后端,为了复制hibernate搜索数据,我们使用infinispan提供程序和
文件存储来在重启之间保存数据

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

另外,有没有人有在这个星座中使用infinispan和hibernate搜索的经验?大多数有关
复制缓存的设置都是从现有示例中重复使用的,如果有人对这些设置有一些提示或建议,例如,它是否会使用~50GB的索引进行扩展?我将非常感谢任何反馈或类似场景的经验

配置主要使用以下参考资料进行组合:

我们已采取的详细步骤如下所示

  • 作为基础,我们采用并扩展了
    独立的ha full.xml
  • 配置jgroups以使用TCP堆栈
  • 运行tcping而不是MPing(我们计划在多播/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定义了以下

<!-- 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会将其数据序列化到配置的
,然后在节点重新启动之间保留数据。甚至一些灾难性的测试(例如,
kill-9
)也表明,当节点重新启动时,可以干净地恢复索引。在脱机期间,另一个节点作为主节点接管,集群平稳运行

~50 GB索引意味着您需要100 GB以上的JVM堆才能进行复制缓存。除非您使用的是Azul Zing,否则请告诉您的用户在GC期间喝杯咖啡,并确保JGroups FDx协议能够正确处理分钟暂停。wrt文件存储-使用复制缓存也很好,因为所有数据都在每个节点上。但您需要在重新启动时将其清除,否则此节点可能会提供过时的数据。感谢您的反馈。我们当前基于目录的方法(复制到每个节点)的吸引力在于索引非常大,但不必在内存中。为了减少jvm中不断保存的数据量,另一个缓存存储实现是否更可取?好的,我在第一条评论中没有意识到索引将主要在磁盘上,而不是内存中。对此很抱歉-在这种情况下,它可以工作,但处理崩溃需要一些管理-清除崩溃节点上的缓存存储数据。但这一限制适用于所有非共享缓存存储。对于Lucene目录,即使对于大型索引,密钥集也非常小。因此,CacheStore的类型不是一个因素,但CacheStore的性能可能是一个限制。最好选择一个快速的。大约50GB的索引意味着您将需要100+GB的JVM堆来进行复制缓存。除非您使用的是Azul Zing,否则请告诉您的用户在GC期间喝杯咖啡,并确保JGroups FDx协议能够正确处理分钟暂停。wrt文件存储-使用复制缓存也很好,因为所有数据都在每个节点上。但您需要在重新启动时将其清除,否则此节点可能会提供过时的数据。感谢您的反馈。我们当前基于目录的方法(复制到每个节点)的吸引力在于索引非常大,但不必在内存中。为了减少jvm中不断保存的数据量,另一个缓存存储实现是否更可取?好的,我在第一条评论中没有意识到索引将主要在磁盘上,而不是内存中。对此很抱歉-在这种情况下,它可以工作,但处理崩溃需要一些管理-清除崩溃节点上的缓存存储数据。但这一限制适用于所有非共享缓存存储。对于Lucene目录,即使对于大型索引,密钥集也非常小。因此,CacheStore的类型不是一个因素,但CacheStore的性能可能是一个限制。最好选一个快的。