如何停止和关闭 hazelcast 集群?我从测试中观察到的是,每当节点被 HazelcastInstance#shutdown() 停止时,集群就会尝试重新平衡或备份数据。如何先"停止"集群,然后再关闭它?(还是我的观察是错误的?
您可以使用isClusterSafe,如以下示例所示:
public class ShutdownCluster {
public static void main(String[] args) throws Exception {
HazelcastInstance member1 = Hazelcast.newHazelcastInstance();
HazelcastInstance member2 = Hazelcast.newHazelcastInstance();
HazelcastInstance member3 = Hazelcast.newHazelcastInstance();
if(member1.getPartitionService().isClusterSafe()) {
IExecutorService executorService = member1.getExecutorService(ShutdownCluster.class.getName());
executorService.executeOnAllMembers(new ShutdownMember());
}
}
private static class ShutdownMember implements Runnable, HazelcastInstanceAware, Serializable {
private HazelcastInstance node;
@Override
public void run() {
node.getLifecycleService().shutdown();
}
@Override
public void setHazelcastInstance(HazelcastInstance node) {
this.node = node;
}
}
}
现在回答
,以防止数据丢失永远不会太晚:)
如果不要在关闭期间触发迁移事件,可以将群集状态更改为 PASSIVE:
hazelcastInstance.getCluster().changeClusterState(PASSIVE);
如果出现以下情况,我建议在此类内部执行此操作:
if (partitionService.isClusterSafe()) {
hazelcastInstance.getCluster().changeClusterState(PASSIVE);
hazelcastInstance.getCluster().shutdown();
// or send exit command to each node, as in mrck answer - remember that then action must be an AllowedDuringPassiveState
}
在被动和冻结状态下,Hazelcast 不会执行迁移,因此,关闭群集时不会出错。如果阻止有助于确定,则更改状态和关闭是安全的
在测试时,我经常使用 Hazelcast.shutdownAll()
这将杀死所有实例。
试试这个。
HazelcastInstance.getLifecycleService().shutdown();