2017-03-07 56 views
0

所以我們有一個問題,滲透檢查器運行12小時之類的東西導致Jgroups斷開連接,然後它不能恢復。如何在Inifinispan下爲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 

如何檢查Jgroups中的通道是否已連接?

回答

0

通過斷開我假設你的意思是集羣分裂並分裂成多個子集羣?

你是什麼意思,當你說JGroups是下降?在您斷開連接或關閉它之前,通道永遠不會關閉;換句話說,即使集羣可能被拆分爲多個子集羣,信道也會始終愉快地發送消息。

通過調整配置,您可以始終減少集羣拆分(網絡分區)的可能性,例如,通過增加故障檢測協議(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}和,則第一個子集羣中的所有成員具有相同的視圖,第二個子集羣中的所有成員在它們之間具有不同但相同的視圖。

+0

是的,可是,該鏈接假設我有機會獲得的CacheManager ...這是由其他東西創建的...我假設,也許不正確,我必須有CacheManager的實例,這已創建,我無法弄清楚如何做到這一點。 但是是羣集崩潰,有時我們會分裂大腦,有時會發生其他錯誤,但節點永遠不會重新加入羣集,並且我試圖檢測到 – xenoterracide

+0

我的問題可能不正確,只是試圖分辨羣集是健康的,如果不是,則向負載均衡器報告適當的狀態。 – xenoterracide

+0

不,你不需要一個CacheManager,一個簡單的緩存會做(轉換省略):cache.getAdvancedCache()。getRpcManager()。getTransport()將爲你提供傳輸。接下來,向下轉換爲JGroupsTransport,然後調用getChannel() –

1

最新的Infinispan版本包含所謂HealthCheckAPI,這不正是你需要:http://blog.infinispan.org/2017/03/checking-infinispan-cluster-health-and.html

+0

好吧,對我們來說很酷我猜從現在開始2年......當所有的星星和月亮與版本一致時......但這個問題仍將是...... 我該如何獲得'EmbeddedCacheManager'? – xenoterracide

+0

這是DefaultCacheManager實現的接口:) – altanis

+0

我知道......並且我一直在提出的觀點是我不知道如何使用這個實例,因爲它是由hibernate search/infinispan xml構建的。 – xenoterracide

0

jChannels是春天JChannel豆類,@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()