2009-12-13 59 views
3

我想有一個Erlang節點的主從設置,其中讀寫操作只發生在主節點上。從屬節點僅保留爲熱備用。Mnesia異步事務

據我所知,Mnesia的默認行爲是在執行寫操作之前在所有節點上同步獲取鎖。這會導致高延遲,特別是對於地理上分散的節點。

我的問題是:Mnesia是否支持異步事務,其中鎖只能在主節點上獲取,並且寫操作之後會向從節點傳播?

回答

2

我認爲如果使用消息隊列系統(rabbitmq或許)從消息隊列提要中自己更新複製數據庫來構建此場外複製,您會更高興。廣域網鏈路更有可能變得擁塞或宕機,並且消息隊列協議有辦法處理這種情況。 Erlang分發只是放棄了,你必須將更新傳播到文件中,直到副本出現並可以使用它。

爲獲得最佳對稱性,請將發佈到消息隊列作爲更新數據庫的主要方法。所以即使是從消息隊列中消耗主機也是如此。如果需要響應,則當前主控可以將消息發送回消息的發佈者。

Mnesia確實有幾種不同的mnesia transaction contexts,但沒有什麼真正符合你想要的。

+0

我也調查了一下,因爲我看到這個問題:Christian的建議聽起來很明智。 – jldupont 2009-12-14 01:50:18

0

有趣的Q和同樣有趣的A!

基本上,你的建議是基督徒,例如,有一個gen_server - 序列化對數據庫的訪問。 第一次我做到了,然後我意識到:堅持下去! Mnesia是事務性的,所以對於首次序列化訪問聽起來有點奇怪,然後通過事務更新數據庫來重新做一遍。

但是,我仍然有點困惑,因爲mnesia強制執行事務性語義我傾向於認爲你不應該序列化訪問你自己,特別是因爲mnesia的實現者可能比我更瞭解系統做;)

據我所知,這不是一個直接回答你的問題,但是,我會說使用mnesia + memorynodes + disknodes。用於快速接管的內存節點以及在崩潰/備份後用於恢復的磁盤節點。

HTH, haavee