如何停止和关闭整个 hazelcast 群集



如何停止和关闭 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();

最新更新