2010-08-26 65 views
8

我正在運行兩個具有複製mnesia數據庫的erlang節點。每當我嘗試啓動其中一個,而mnesia不在另一個上運行時,mnesia:wait_for_tables(?TABS,?TIMEOUT)將掛起其調用的節點上。我需要一個結構(如果兩個節點都沒有運行),我可以開始使用一個,而另一個停止運行,然後決定讓另一個節點繼續運行。我需要確保運行的第一個節點在啓動後更新。這是否一定要我有一個作爲主人?集羣中Mnesia主節點的重要性

%%%編輯.......................................... .................................

哦,我明白了。我使用的數據庫有一些碎片表。一些片段已經在網絡中分佈以進行負載平衡。所以,一個主機上的Mnesia會嘗試通過網絡加載它們,並且會失敗,因爲另一個主機上的mnesia已經關閉了!

我想這與mnesia主節點沒有任何關係。但我仍然很想理解相同的意義,因爲我之前沒有使用它,但是我總是玩分佈式模式。再次

謝謝...

回答

4

的Mnesia主節點用於解決一個相當殘酷的方式腦裂的情況。如果mnesia發現裂腦情況,它會發出一個事件,「運行分區網絡」。對此做出響應的一種方法是將主節點設置爲要保留的「島」,然後重新啓動其他節點。當它們恢復時,它們將無條件地從主節點加載表。

mnesia中有另一種機制,稱爲force_load。一個人應該非常小心,但是在有兩個節點A和B的情況下,終止B(A日誌B爲關閉),然後終止A,然後重新啓動B,B將不知道A何時停止,所以會拒絕加載在A上有副本的表。如果你知道A很快就不會回來,你可以選擇在B上調用mnesia:force_load_tables(Ts),這會導致它以它自己的副本運行。一旦A恢復正常,它會檢測到B已啓動,並會從中加載表格。正如您所看到的,還有其他幾種可能導致數據庫不一致的情況。 Mnesia不會解決這個問題,但會嘗試提供工具來解決這種情況。在上面的情況中,不幸的是,mnesia會給你提示,但是可以創建一個檢測問題的應用程序。

+0

謝謝user6834 – 2010-10-11 10:39:51

+0

uwiger,謝謝。你認爲(在未來),mnesia會根據最近的更新機制或某種類型的簽名來合併兩個副本,特別是當檢測到「正在運行的分區網絡」致命錯誤時? – 2011-05-31 16:06:25

+1

今天可以做到這一點,雖然沒有非常好的記錄或在所有部分進行測試。 http://github.com/esl/unsplit是一個在netsplits之後自動合併mnesia表的庫。最近的mnesia版本已被仔細地增強以支持這一點,並且R14B03還增加了一種法定檢查形式('多數')來減少難以解決的不一致性的風險。 – uwiger 2011-06-11 14:26:33