我想有一個Erlang節點的主從設置,其中讀寫操作只發生在主節點上。從屬節點僅保留爲熱備用。Mnesia異步事務
據我所知,Mnesia的默認行爲是在執行寫操作之前在所有節點上同步獲取鎖。這會導致高延遲,特別是對於地理上分散的節點。
我的問題是:Mnesia是否支持異步事務,其中鎖只能在主節點上獲取,並且寫操作之後會向從節點傳播?
我想有一個Erlang節點的主從設置,其中讀寫操作只發生在主節點上。從屬節點僅保留爲熱備用。Mnesia異步事務
據我所知,Mnesia的默認行爲是在執行寫操作之前在所有節點上同步獲取鎖。這會導致高延遲,特別是對於地理上分散的節點。
我的問題是:Mnesia是否支持異步事務,其中鎖只能在主節點上獲取,並且寫操作之後會向從節點傳播?
我認爲如果使用消息隊列系統(rabbitmq或許)從消息隊列提要中自己更新複製數據庫來構建此場外複製,您會更高興。廣域網鏈路更有可能變得擁塞或宕機,並且消息隊列協議有辦法處理這種情況。 Erlang分發只是放棄了,你必須將更新傳播到文件中,直到副本出現並可以使用它。
爲獲得最佳對稱性,請將發佈到消息隊列作爲更新數據庫的主要方法。所以即使是從消息隊列中消耗主機也是如此。如果需要響應,則當前主控可以將消息發送回消息的發佈者。
Mnesia確實有幾種不同的mnesia transaction contexts,但沒有什麼真正符合你想要的。
有趣的Q和同樣有趣的A!
基本上,你的建議是基督徒,例如,有一個gen_server - 序列化對數據庫的訪問。 第一次我做到了,然後我意識到:堅持下去! Mnesia是事務性的,所以對於首次序列化訪問聽起來有點奇怪,然後通過事務更新數據庫來重新做一遍。
但是,我仍然有點困惑,因爲mnesia強制執行事務性語義我傾向於認爲你不應該序列化訪問你自己,特別是因爲mnesia的實現者可能比我更瞭解系統做;)
據我所知,這不是一個直接回答你的問題,但是,我會說使用mnesia + memorynodes + disknodes。用於快速接管的內存節點以及在崩潰/備份後用於恢復的磁盤節點。
HTH, haavee
也許你的應用可以受益使用粘鎖。我想這是非常接近你的需求,但是...不完全是你想要的http://www.erlang.org/documentation/doc-5.8.3/lib/mnesia-4.4.17/doc/html/Mnesia_chap4.html#id70700
我也調查了一下,因爲我看到這個問題:Christian的建議聽起來很明智。 – jldupont 2009-12-14 01:50:18