Mnesia數據庫集羣(基礎)

MnesiaErlang OTP分發套件中一個非常重要的分佈式數據庫管理系統,官方文檔指出該數據庫適合於電信通訊類應用以及其他要求一致性和實時性的應用。Mnesia提供了專門的查詢語言QLC,使用戶可以使用類似SQL的方式操作數據庫。數據庫中的數據可以駐留內存以提高讀寫效率,也可寫入磁盤以進行持久化。得益於Erlang消息複製式進程通信及其在通訊原語中所做的大量簡化,使用Mnesia可以輕易實現數據庫的集羣及備份,同時數據具有位置透明性,開發者根本不必關心數據具體存儲在哪個節點上。

我自己今天整了一天的數據庫的分佈式配置,發現網上有很多資料是錯的,如下是一些需要注意的地方:

1)以AB兩節點爲例,分別啓動兩節點後,需要使之建立連接,可用的函數有net_adm:pingnet_kernel:connectnet_adm:ping成功建立連接後返回pong,失敗返回pangnet_kernel:connect成功連接返回true,失敗返回false

2)在AB形成互聯節點後,在其中任一節點上,假設爲A節點,調用mnesia:create_schema(Nodelist)函數建立schema,關於Nodelist如何取值,網上開始出現謬誤,有些同學給的值[nodes()],明顯是錯誤的。nodes()函數本身返回的就是一個列表,在本例中應該是[B@xxx]create_schema函數接到參數後,直接遍歷列表元素來獲取要創建schema的網絡節點,即B@xxx。如果設置爲[nodes()],獲取的節點值便是一個列表,[B@xxx],簡直差之毫釐謬以千里。

那是不是Nodelist直接取成nodes()就行了呢,當然可以,這樣做不會出現錯誤的,但只會在當前節點生成schema的磁盤備份,而遠程節點上是空的,而如果把本地節點的名稱放進列表裏,這時的參數值是[Nodelist],則會成功在本地及遠程機器建立schema磁盤備份。

3)何時開始在集羣上創建數據表呢?經過2)以後,節點間的連接建立了,schema也建好了,還記得嗎,咱們是在A節點上進行操作的。記住,此時mnesia還沒有被啓動。如果直接調用mnesia:create_table(name,[{disc_copies,Nodelist}])的話會提示遠程節點未激活,即not_active,此時需要B節點的mneisa啓動,可以調用rpc:call(‘B@xxx’,mnesia,start,[])A節點啓動,然後再調用建表函數,函數執行完畢後,在AB兩節點都可以看到所見的數據表,調用mnesia:info()可以看到如下輸出。



下面,再B節點上添加一條記錄,然後再A節點進行查找,看看數據是否同步了:



B添加了一條記錄{usr,’Yang’,18,1},從A節點可以查到新添加的記錄,實驗成功。這樣就實現了一個最小規模的數據庫集羣,而且庫之間的數據同步mnesia已經做好了,而且互爲備份,提高了數據的安全性,不需要我們額外配置或編碼處理,實在是方便。

 

至此,建立好了最小集羣,但假如B機器因爲故障掛掉了,故障修復之後,其上的數據已經不復存在或已缺失、陳舊,那怎麼在B上進行數據的恢復呢。很簡單,按照下面的步驟,你就可以恢復災難:

1)啓動B節點,並與A連接

2)啓動Mnesia,調用mnesia:start()

3)執行mnesia:change_config(extra_db_nodes,[A@xxx])

神奇的一幕發生了,本來B上的數據是無用的,現在,經過上述簡單的3不,數據在B節點上完全恢復了,有圖有真相:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章