Apache Ignite 2.16.0集群重平衡监控及状态查询问题咨询
Apache Ignite 2.16.0 重平衡监控与状态查询方案
一、系统模式表查询重平衡状态
Ignite内置了系统视图,可直接通过SQL查询重平衡的实时状态:
SYS.REBALANCING_STATUS:查看每个缓存的整体重平衡进度SELECT CACHE_NAME, PARTITIONS_TOTAL, PARTITIONS_DONE, STATUS FROM SYS.REBALANCING_STATUS;字段说明:
PARTITIONS_TOTAL:缓存总分区数PARTITIONS_DONE:已完成同步的分区数STATUS:重平衡状态(ACTIVE表示正在进行,INACTIVE表示已完成)
SYS.CACHE_PARTITIONS:查看单个分区在节点上的同步状态SELECT NODE_ID, CACHE_NAME, PARTITION_ID, IS_PRIMARY, STATE FROM SYS.CACHE_PARTITIONS;字段说明:
STATE:分区状态(OWNING表示正在同步,OWNED表示同步完成,MOVING表示分区正在迁移)
二、通过API跟踪重平衡进度
如果是通过代码集成Ignite,可以用API直接监控重平衡过程:
触发并等待重平衡完成
IgniteCache<?, ?> cache = ignite.cache("你的测试表缓存名"); // 触发重平衡并获取异步结果对象 IgniteFuture<?> rebalanceFuture = cache.rebalance(); // 同步等待重平衡完成(可根据数据量调整超时时间) try { rebalanceFuture.get(30, TimeUnit.MINUTES); System.out.println("重平衡已完成"); } catch (Exception e) { System.err.println("重平衡超时或失败:" + e.getMessage()); }监听分区级重平衡事件
cache.addRebalanceListener(new RebalanceListener() { @Override public void onRebalanceStarted(RebalanceEvent evt) { System.out.println("缓存 " + evt.cacheName() + " 开始重平衡"); } @Override public void onRebalanceStopped(RebalanceEvent evt) { System.out.println("缓存 " + evt.cacheName() + " 重平衡结束"); } @Override public void onRebalancePartitionsDone(RebalanceEvent evt) { System.out.println("完成 " + evt.partitionsCount() + " 个分区同步"); } });
三、日志与JMX监控
- 日志跟踪:Ignite默认会在节点日志中输出重平衡细节,搜索关键词
Rebalancing、partition sync、rebalance done即可查看分区同步的进度、开始/结束时间,以及异常信息。 - JMX监控:通过JConsole/VisualVM连接Ignite节点,在
org.apache.ignite域下找到对应缓存的MBean,可查看RebalancingStatus、RebalancingTotalPartitions、RebalancingDonePartitions等实时指标。
四、针对你的场景的优化建议
你遇到的计数异常,大概率是Ignite B重启后重平衡未完成就关闭了Ignite A,导致部分数据未同步到B节点。建议:
- 在关闭Ignite A前,必须通过系统表或API确认重平衡已完成(
SYS.REBALANCING_STATUS的STATUS为INACTIVE,且PARTITIONS_DONE等于PARTITIONS_TOTAL)。 - 根据数据量调整重平衡配置:
- 增加
rebalanceThreadPoolSize(默认4),提升同步线程数; - 调大
rebalanceBatchSize(默认512),减少网络交互次数; - 设置
rebalanceTimeout避免无限等待。
- 增加
- 开启持久化后,确保节点重启时能正确加载本地持久化数据,重平衡会自动同步节点缺失的分区数据。
内容的提问来源于stack exchange,提问作者seunghun Yoo
相关产品推荐
相关产品推荐

