Apache Ignite 2.13.0集群重启后崩溃及分区丢失问题求助
集群基础信息
- Ignite版本:2.13.0
- JDK环境:OpenJDK 64-Bit Server VM Zulu11.52+13-CA (build 11.0.13+8-LTS, mixed mode)
- 集群架构:3个基线服务器节点,启用持久化,每周操作系统自动更新后逐一重启
故障发生时序
- 3月28日19:03,节点2完成重启
- 19:13,节点2与节点3的Ignite服务同时崩溃,核心报错:
[19:13:17,302][SEVERE][sys-stripe-5-#6][] JVM will be halted immediately due to the failure: [failureCtx=FailureContext [type=SYSTEM_WORKER_TERMINATION, err=java.lang.IllegalStateException: Failed to find security context for subject with given ID : 74f979dd-342d-4055-bda4-58535b8ab282]]
- 故障后仅1个节点保持活跃
- 次日节点3自动重启后成功加入集群,未再崩溃
更新:集群不可用与分区丢失问题
故障导致剩余节点及重启故障节点后的集群完全不可用,应用侧报错:
Caused by: org.apache.ignite.IgniteException: Failed to execute the cache operation (all partition owners have left the grid, partition data has been lost) [cacheName=datastructures_ATOMIC_PARTITIONED_1@default-ds-group, partition=299, key=GridCacheQueueItemKey [queueId=d6743312681-6ddd800e-39e6-473f-915a-39c576ef32be, queueName=cluster_processing_6-queue, idx=1322]]
当前仅能通过全量重启所有服务器和客户端恢复集群,无法对该缓存执行重置丢失分区操作,需咨询:
- 能否将
datastructures_ATOMIC_PARTITIONED_1这类系统缓存配置为2个备份(默认1个),避免双节点故障引发的分区丢失? - 如何从根源避免此类违背高可用设计的故障?
故障原因解析
安全上下文同步bug触发节点崩溃
报错中的Failed to find security context for subject with given ID是Ignite 2.13.0版本的已知bug:节点重启重新加入集群后,系统线程处理跨节点安全相关操作时,会出现上下文引用丢失的情况,触发SYSTEM_WORKER_TERMINATION级别故障,直接终止JVM。系统缓存默认备份数不足引发分区丢失
datastructures_ATOMIC_PARTITIONED_1是Ignite存储分布式数据结构(如队列)的内部系统缓存,默认备份数为1。当2个节点同时崩溃时,部分分区的主、备节点均离线,导致分区丢失;由于系统缓存不支持常规的resetLostPartitions恢复操作,最终造成集群不可用。
解决方案建议
升级Ignite版本
该安全上下文bug在Ignite 2.14.0及后续版本已修复,建议升级至稳定版本(如2.15.0),从根源解决节点崩溃问题。调整系统缓存备份数
可通过配置修改系统缓存的备份数为2,需确保集群节点数(3个)满足备份数+1 ≤ 节点数的要求,配置示例:<bean class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- 其他集群配置 --> <property name="systemCacheConfiguration"> <list> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="datastructures_ATOMIC_PARTITIONED_1"/> <property name="backups" value="2"/> <property name="cacheMode" value="PARTITIONED"/> <property name="atomicityMode" value="ATOMIC"/> </bean> <!-- 按需添加其他系统缓存配置 --> </list> </property> </bean>注:修改系统缓存配置需全量重启集群后生效。
优化节点重启流程
延长节点重启间隔至30分钟以上,确保节点完全加入集群、集群状态稳定后,再重启下一个节点,避免短时间内多节点波动。调整故障处理策略
配置故障处理策略,避免单个系统线程异常直接终止JVM,示例:<bean class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="failureHandler"> <bean class="org.apache.ignite.failure.StopNodeFailureHandler"> <property name="failOnIgniteWorkerBlocked" value="false"/> </bean> </property> </bean>
内容的提问来源于stack exchange,提问作者Sven Borkert

