Hazelcast - 客户端模式 - 集群故障后如何恢复?
Hazelcast - Client mode - How to recover after cluster failure?
我们正在我们的产品中使用 hazelcast 分布式锁和缓存功能。分布式锁的使用对我们的业务逻辑至关重要。
目前我们使用的是嵌入式模式(每个应用节点也是一个hazelcast集群成员)。我们将切换到客户端-服务器模式。
我们注意到客户端-服务器的问题是,一旦集群停机一段时间后,经过几次尝试,客户端就会被销毁,并且从该客户端检索到的任何对象(地图、集合等)都会被销毁。不再可用。
此外,即使在 Hazelcast 集群恢复后客户端实例也不会恢复(我们收到 HazelcastInstanceNotActiveException )
我知道这个问题已经解决了好几次并最终成为一个功能请求:
我的问题:恢复客户端的策略应该是什么?目前我们正计划在客户端进程中排队任务,如下所示。根据条件,它将尝试重新启动客户端实例...
我们将通过 clientInstance.getLifecycleService().isRunning() check.
检查客户端是否为 运行
任务代码如下:
private class ClientModeHazelcastInstanceReconnectorTask implements Runnable {
@Override
public void run() {
try {
HazelCastService hazelcastService = HazelCastService.getInstance();
HazelcastInstance clientInstance = hazelcastService.getHazelcastInstance();
boolean running = clientInstance.getLifecycleService().isRunning();
if (!running) {
logger.info("Current clientInstance is NOT running. Trying to start hazelcastInstance from ClientModeHazelcastInstanceReconnectorTask...");
hazelcastService.startHazelcastInstance(HazelcastOperationMode.CLIENT);
}
} catch (Exception ex) {
logger.error("Error occured in ClientModeHazelcastInstanceReconnectorTask !!!", ex);
}
}
}
这种做法合适吗?我也尝试过监听 LifeCycle 事件,但无法通过事件使其工作。
此致
在 Hazelcast 3.9 中,我们更改了连接和重新连接在客户端中的工作方式。您可以在文档中阅读有关新行为的信息:http://docs.hazelcast.org/docs/3.9.1/manual/html-single/index.html#configuring-client-connection-strategy
希望对您有所帮助。
在 Hazelcast 3.10 中,您可以将连接尝试限制从 2(默认)增加到最大值:
ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig().setConnectionAttemptLimit(Integer.MAX_VALUE);
我们正在我们的产品中使用 hazelcast 分布式锁和缓存功能。分布式锁的使用对我们的业务逻辑至关重要。
目前我们使用的是嵌入式模式(每个应用节点也是一个hazelcast集群成员)。我们将切换到客户端-服务器模式。
我们注意到客户端-服务器的问题是,一旦集群停机一段时间后,经过几次尝试,客户端就会被销毁,并且从该客户端检索到的任何对象(地图、集合等)都会被销毁。不再可用。 此外,即使在 Hazelcast 集群恢复后客户端实例也不会恢复(我们收到 HazelcastInstanceNotActiveException )
我知道这个问题已经解决了好几次并最终成为一个功能请求:
我的问题:恢复客户端的策略应该是什么?目前我们正计划在客户端进程中排队任务,如下所示。根据条件,它将尝试重新启动客户端实例... 我们将通过 clientInstance.getLifecycleService().isRunning() check.
检查客户端是否为 运行任务代码如下:
private class ClientModeHazelcastInstanceReconnectorTask implements Runnable {
@Override
public void run() {
try {
HazelCastService hazelcastService = HazelCastService.getInstance();
HazelcastInstance clientInstance = hazelcastService.getHazelcastInstance();
boolean running = clientInstance.getLifecycleService().isRunning();
if (!running) {
logger.info("Current clientInstance is NOT running. Trying to start hazelcastInstance from ClientModeHazelcastInstanceReconnectorTask...");
hazelcastService.startHazelcastInstance(HazelcastOperationMode.CLIENT);
}
} catch (Exception ex) {
logger.error("Error occured in ClientModeHazelcastInstanceReconnectorTask !!!", ex);
}
}
}
这种做法合适吗?我也尝试过监听 LifeCycle 事件,但无法通过事件使其工作。
此致
在 Hazelcast 3.9 中,我们更改了连接和重新连接在客户端中的工作方式。您可以在文档中阅读有关新行为的信息:http://docs.hazelcast.org/docs/3.9.1/manual/html-single/index.html#configuring-client-connection-strategy
希望对您有所帮助。
在 Hazelcast 3.10 中,您可以将连接尝试限制从 2(默认)增加到最大值:
ClientConfig clientConfig = new ClientConfig(); clientConfig.getNetworkConfig().setConnectionAttemptLimit(Integer.MAX_VALUE);