我如何在Inifinispan下为Jgroups编写健康检查?

时间:2017-03-07 17:19:50

标签: java hibernate-search infinispan jgroups

因此,我们遇到一个问题,即12小时内运行的渗透检查程序导致Jgroup断开连接,然后无法恢复。

显然我们需要fix Jgroups so that it does recover,但如果Jgroups关闭,我也不希望负载均衡器像服务器一样对待它。我已经想出了如何将它传达给负载均衡器,但是我在弄清楚如何实际检查通道通信的健康状况时遇到了问题,特别是因为Infininispan负责创建它们(它本身就是由创建者创建的)休眠/搜索)。

我想如果我可以抓住Channel,我可以使用它们,虽然可能有更好的方法,但我看不到获取频道的方法。好吧,我确实找到this,它显示了如何从DefaultCacheManager获取频道,但这只是问我如何获得缓存管理器。我们正在使用Spring,它似乎没有在jndi中定义,所以这样,初始化这些东西的参数只是传递给hibernate的xml配置。注意:Tomcat和Spring 4没有应用服务器。

jgroups 3.6.13
infinispan 8.1.0, 
hibernate search 5.3

如何检查Jgroup中的频道是否已连接?

3 个答案:

答案 0 :(得分:1)

最新的Infinispan版本包含所谓的HealthCheckAPI,它可以满足您的需求:http://blog.infinispan.org/2017/03/checking-infinispan-cluster-health-and.html

答案 1 :(得分:0)

通过断开我认为你的意思是群集崩溃并分成多个子群集?

当你说JGroups down 时,你是什么意思?在断开或关闭通道之前,通道永远不会停机;换句话说,即使群集可能被拆分为多个子群集,通道也总是会愉快地发送消息。

您可以通过调整配置来降低群集拆分(网络分区)的可能性,例如:通过增加故障检测协议(FD或FD_ALL)中的超时。

Re:如何获得一个频道。如果你运行Infinispan,你必须定义一个缓存,不是吗?因为如果您没有缓存,则不会创建任何通道(它们仅在需要时创建)。如果您有缓存,则您引用的链接将向您显示如何从缓存中获取JChannel。

How can I check to see if my channels in JGroups are connected?

不确定你的意思。如果您有一个群集{A,B,C,D,E.F}并且它分为{A,B,C}{D,E,F},那么第一个子群集中的所有成员都具有相同的视图,而第二个子群集中的所有成员都有不同的但是他们之间的观点相同。

答案 2 :(得分:0)

jChannels是Spring JChannel Bean的列表,@Autowired,如果master我们不需要向下报告,因为它可以自行运行,HealthState是只是我们作为HTTP响应主体返回的枚举。这不是一个完整的答案,因为我们还没有处理过infinispan。

    return jChannels.stream()
        .peek( jChannel -> logDebug( () -> jChannel.toString( false ) ) )
        .map( jChannel -> ( jChannel.getView() != null && (!isSlave || jChannel.getView().size() > 1 ) ) )
        .filter( Predicate.isEqual( false ) )
        .findAny()
        .map( b -> HealthState.CLUSTER_DISCONNECTED );

显然,重要的是检查jChannel.getView()