JGroups自动选举集群中Infinispan SIFS索引启停报错咨询
我之前处理过类似的Infinispan集群索引场景问题,结合你的日志、数据规模和代码,给你梳理下关键信息和解决方向:
核心问题定位
首先可以明确:这个错误和你的Hibernate Search实体字段类型完全无关。日志里的异常出现在org.infinispan.persistence.sifs.Index$Segment.shutdown方法中,是Infinispan内置的Simple Indexed File Store(SIFS)组件在处理索引段缓冲区时的内部错误,和你定义的dateCreated、eventType等字段类型没有关联。
关于实验模式的疑问
你提到的“实验模式”是准确的:在2018年对应的Infinispan版本(大概率是9.x系列)中,SIFS属于技术预览/实验性组件,官方明确说明不适合在大规模生产环境(比如你这种1.8亿条记录的场景)中使用。这个启动/关闭时的线程异常,正是SIFS早期实现中存在的线程安全或缓冲区处理bug导致的——在高数据量下,关闭时索引更新线程和段关闭逻辑并发操作,引发了HeapByteBuffer.putLong的索引越界。
是否需要关注?
虽然当前索引和查询功能正常,但这个错误绝对不能忽略:
- 短期来看,异常退出的线程可能无法正确释放索引段资源,存在内存泄漏风险;
- 长期来看,频繁的异常可能导致索引段损坏,下次启动时出现数据丢失或加载失败;
- 集群环境下,节点关闭时的异常可能引发索引同步的不一致问题。
所以建议你优先处理这个问题,避免后续出现更严重的生产事故。
具体解决思路
1. 优先升级Infinispan版本
Infinispan在10.x及以后的稳定版本中,对SIFS组件做了大量bug修复和性能优化,甚至重构了部分核心逻辑。升级到最新的稳定版(比如12.x或13.x)是最彻底的解决方案,能直接规避早期版本的已知bug。
2. 替换为稳定的持久化存储
如果暂时无法升级版本,可以考虑将SIFS替换为Infinispan官方推荐的生产级持久化存储:
- JDBC Store:适合需要关系型数据库持久化的场景,稳定性高;
- RocksDB Store:适合大数据量的键值存储场景,性能和兼容性都优于SIFS。
3. 临时Workaround(不推荐长期使用)
如果以上两种方案都暂时无法实施,可以尝试调整SIFS的配置参数来缓解问题:
- 增大
segment-size参数,减少索引段的数量,降低关闭时的并发冲突; - 调整索引更新线程池的大小,避免在关闭时过多线程同时操作索引段;
- 优化集群关闭流程:先停止所有业务写入请求,等待索引更新完成后再关闭节点,减少关闭时的并发操作。
附你提供的错误日志和实体代码:
启动时错误日志
2018-01-16 08:46:43,315 ERROR [org.infinispan.persistence.sifs.Index] (BCS-IndexUpdater-2) Error in indexer thread: java.lang.IndexOutOfBoundsException
关闭时错误日志
2018-01-16 09:22:12,538 INFO [org.hibernate.search.backend.jgroups.impl.DispatchMessageSender] (ServerService Thread Pool -- 77) HSEARCH200017: Disconnecting and closing JGroups Channel to cluster 'Hibernate Search Cluster'
2018-01-16 09:22:12,579 ERROR [org.infinispan.persistence.sifs.Index] (BCS-IndexUpdater-0) Error in indexer thread: java.lang.IndexOutOfBoundsException at java.nio.Buffer.checkIndex(Buffer.java:546) at java.nio.HeapByteBuffer.putLong(HeapByteBuffer.java:432) at org.infinispan.persistence.sifs.Index$Segment.shutdown(Index.java:368) at org.infinispan.persistence.sifs.Index$Segment.run(Index.java:265)
2018-01-16 09:22:12,583 ERROR [org.infinispan.persistence.sifs.Index] (BCS-IndexUpdater-2) Error in indexer thread: java.lang.IndexOutOfBoundsException at java.nio.Buffer.checkIndex(Buffer.java:546) at java.nio.HeapByteBuffer.putLong(HeapByteBuffer.java:432) at org.infinispan.persistence.sifs.Index$Segment.shutdown(Index.java:368) at org.infinispan.persistence.sifs.Index$Segment.run(Index.java:265)
实体代码
@Id @Type(type="objectid") @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @Temporal(TemporalType.TIMESTAMP) @Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO, norms=Norms.NO) @DateBridge(resolution = Resolution.SECOND) private Date dateCreated; @Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO, norms=Norms.NO) private String eventType; @Embedded private Location location; @Embedded private EventStatus status;
内容的提问来源于stack exchange,提问作者Panos

