最近IM雲平臺也好,社交應用也好,大量的使用ejabberd的廠商涌現出來了。不過全部使用ejabberd廠商可能都會遇到Mnesia腦裂的問題。在這裏打算簡單的談談腦裂這個事情。
算法
我在這裏面給個非官方的定義吧。當一個集羣的不一樣部分在同一時間都認爲本身是活動的時候,咱們就能夠將這個現象稱爲腦裂症狀。咱們當如何理解這句話呢?flex
首先咱們須要是個集羣。spa
其次當中有業務是Master-Backup模式或雙星模式。也就是說當主節點掛掉了,備用節點須要接管業務或者是兩個節點直接有數據同步。.net
讓咱們舉個例子(圖片來自https://blog.process-one.net/angie_introducing_flexarch/):router
其中ejabberd front是不存在Router的,只有Client Manager。而ejabberd back是具備Message router 的。那麼咱們能夠將這個圖簡單的抽象爲這樣的:blog
UserA和UserB分別將本身的信息註冊在RouterA和RouterB中。RouterA和RouterB使用數據同步(2PC),來同步信息。那麼當UserA想要向UserB發送一個消息的時候,須要如今RouterA中查詢出UserA到UserB的消息路由路徑,而後再交付給相應的路徑進行路由。圖片
當腦裂發生的時候,至關RouterA和RouterB直接的聯繫丟失了,RouterA認爲整個系統中只有它一個Router,RouterB也是這樣認爲的。那麼至關於RouterA中沒有UserB的信息,RouterB中沒有UserA的信息了,此時UserA再發送消息給UserB的時候,RouterA會認爲UserB已經離線了,而後將該信息進行離線持久化。ci
說到這裏面估計你們已經明白了腦裂是什麼東西了。
路由
paxos算法,使用奇數性質的節點來進行表決,必須選出一個說的算的老大,這個集羣才能正常工做。同步
雙星模式下,使用專線直連,從硬件上保障。
使用額外的探測節點,當雙方直連斷開以後,使用一個約定好的共同節點來探測是不是直連故障。