天天看點

分布式資料庫mnesia管理

      經過上兩篇部落格的學習大夥已經初步了解了mnesia的建立和庫内表的建立,已經各種對表的操作。

      接下來我們就要了解一下mnesia資料庫和其他關系型資料差別最大的特性,就是它的分布式特性。首先需要介紹的是mneisa分布式架構的拓撲圖:

分布式資料庫mnesia管理

         通過上圖我們可以了解到,先由一個以上的erlang節點組成一個互相之間的對等的master叢集,這個master叢集中的任何一台master節點當機的話,都不會影響master叢集對外釋出的資料服務。master叢集中的表需要設定為disc_copies類型的資料表,那麼當機之後恢複節點并且重新開機之後并不會丢失資料,而且會自動同步在當機這段時間中其他master節點上的增量資料。

        在master節點之外,可以啟動若幹個mnesia的slaver節點,在slaver節點上存放的資料是master節點記憶體副本,是以一旦slaver節點當機之後,重新開機slaver節點會發現資料庫中的表已經全部丢失,需要重新連接配接到master節點上把master節點上的資料同步到本地的記憶體中來。

        現在就來詳細介紹一下如何建構這個分布式mnesia資料庫叢集。

        首先需要建構一個全聯通的erlang節點網絡,這個沒有什麼難度通過epmd架構,在節點啟動的時候在指令行上設定節點名稱,指令是, erl -name mst -setcookie xxxxxx -mnesia dir ‘“/tmp/mnesia_store”’,設定不同的name啟動若幹個erlang節點,需要保證每個節點使用相同的cookie值,否者節點之間無法聯通了。

        通過以下步驟建立master節點:

        1. 啟動叢集中準備用來作為master角色的節點啟動,  

        2. 通過net_adm:ping('[email protected]'). 這樣的指令打通所有節點,

        3. 使用nodes().函數确認所有節點是否已經聯通

        4. 調用mnesia:create_schema([nodes()]). 注意,這裡參數是用的nodes()函數,他會取得叢集中所有節點,通過這個函數在所有master節點上建立了一份schema檔案,在各個節點上執行 ls /tmp/mnesia_store指令可以在檔案夾中看到已經建立的schema檔案。

        5. 啟動mneisa資料庫,調用mnesia:start() 啟動資料庫,執行mneisa:info() 檢視mneisa資料庫的狀态,如下:

分布式資料庫mnesia管理

           從上圖我們可以了解到,本地d:/tmp/mnesia 儲存資料的目錄已經啟用,并且資料庫的兩個副本:'[email protected]','[email protected]'已經啟動,另外還有兩個副本節點(stopped db nodes)尚未啟動。在所有master節點上重複執行mnesia:info() 指令顯示的結果應該是一樣的。

           至此,所有所有master節點已經啟動完畢。

          通過以下步驟建立slaver節點:

 通過