我们使用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>
)已显示在节点恢复时干净地恢复索引 . 在脱机期间,另一个节点接管主节点,集群平稳运行 .