mnesia是erlang提供的乙個基於分布式的資料庫管理系統。它的分布式和erlang一樣都是」天生的」。集群,備份,主從這些在mnesia上面都非常簡單。
mnesia中的表有三種儲存形式:ram_copies, disc_copies, disc_only_copies。
表的儲存形式可以在表的建立中指出,預設為ram_copies。也可以在建立表後通過change_table_copy_type/3
來修改。
表的屬性由mnesia:create_table(name, tabledef)
中的tabledef指定,tabledef是乙個tuple list,其中比較重要的屬性有:
schema表是mnesia資料庫一張特殊的表,又叫模式表。它記錄資料庫中其它表的資訊,schema表只能有ram_copies或disc_copies兩種儲存形式。並且一旦schema表儲存為ram_copies,那麼該節點上的其它表,也將只能儲存為ram_copies。
mnesia需要schema表的初始化自身,可在mnesia啟動前,通過create_schema/1
來建立乙個disc_copies型別的schema表,如果不呼叫create_schema/1
,直接啟動mnesia:start/0
,預設生成乙個ram_copies型別的schema表,此時我們稱該mnesia節點為」無盤節點」,因為其所有表都不能儲存於磁碟中。
➜ ~ erl -mnesia dir '"tmp/erldb/test"'
erlang/otp 17 [erts-6.3.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
eshell v6.3.1 (abort with ^g)
# 建立disc_copies儲存型別的schema表 但其它表的預設儲存型別仍然為ram_copies
1> mnesia:create_schema([node()]).
ok2> mnesia:start().
ok3> rd(person, ).
person
# 建立disc_copies儲存型別的table,table的fields即為person記錄的fields
4> mnesia:create_table(person, [, ]).
# 等價於mnesia:dirty_write()
5> mnesia:dirty_write(#person).
ok6> mnesia:dirty_read(person, "wdj").
[#person]
record_info(fileds, person)
返回[name,***,age]
。mnesia:create_table/2
預設將attributes屬性中的第乙個field作為key,即name。
mnesia:read, mnesia:write, mnesia:select等api均不能直接呼叫,需要封裝在事務(transaction)中使用:
f = fun() ->
rec = #person,
mnesia:write(rec)
end,
mnesia:transaction(f).
而對應的mnesia:dirty_read mnesia:dirty_write,即」髒操作」,無需事務保護,也就沒有鎖,事務管理器等。dirty版本的讀寫一般要比事務性讀寫快十倍以上。但是失去了原子性和隔離性。
mnesia表由記錄組成,記錄第乙個元素為是記錄名,第二個元素為標識記錄的鍵。可以唯一標識表中特定記錄,又稱為記錄的物件標識(oid)。
mnesia要求表中所有的記錄必須為同乙個record的例項,前面的例子中,表名即為記錄名,表字段則為記錄的域。而實際上,記錄名可以是但不一定是表名,記錄名可通過record_name屬性指出,沒有指定table_name則記錄名預設為create_table第一引數指定的表名。
mnesia:dirty_write(record) ->
tab = element(1, record),
mnesia:dirty_write(tab, record). % 這裡提取出表名,表名和表中記錄原型實際上是分離的
表名和記錄名不一致使我們可以定義多個以同一record的原型的table。
這篇faq中歸納了mnesia集群的大多數問題。
erlang中,乙個節點(node)即為乙個erlang虛擬機器,比如乙個erl shell終端就是乙個節點。前面我們啟動erl shell時,使用的是單節點模式,要使本節點能與其它的節點通訊,需要在erl shell啟動時,通過-name abc
或-sname abc
指定節點名字。erlang 節點名字規範為nodename@hostname
,nodename即我們指定的abc,hostname則分為longname(-name
)和shortname(-sname
),longname包含本地完整網域名稱位址,適合廣域網使用。而shortname則是本地在區域網上的名字,適合區域網和本機使用。
erl -sname mynode
(mynode@t4f-mbp-15)1>
在erlang指令碼中啟動節點,需要呼叫net_kernel:start([nodename, nametype])
.
schema模式表本身帶有集群節點的資訊,因此我們可以通過create_schema(['node1@host,'node2@host'])
來將node1,node2初始化乙個集群,並且指定schema表為disc_copies。在啟動的時候,mnesia使用其模式表來確定應該與哪些節點嘗試建立聯絡。如果其它節點已經啟動,啟動的節點將其表定義與其它節點帶來的表定義合併。這也應用於模式表自身的定義。
應用引數 extra_db_nodes 包含乙個 mnesia 除了在其模式表中找到的節點之外也應該建立聯絡的節點列表。其預設值為空列表[ ]。因此,當無盤節點需要從乙個在網路上的遠端節點找到模式定義時,我們需要通過應用引數-mnesia extra_db_nodes nodelist
提供這個資訊。沒有這個配置引數集,mnesia 將作為單節點系統啟動。也有可能在 mnesia 啟動後用mnesia:change_config/2
賦值給』extra_db_nodes』強制建立連線, 即mnesia:change_config (extra_db_nodes, nodelist)
。
mnesia會同步集群中節點上所有的表資訊,如果某節點需要自己本地維護一張表而不希望共享該錶,可以在建立表時指定local_content屬性。
此時執行mnesia:info()
,可以看到集群中的資料表,並且型別為remote,即遠端資料庫。事實上,remote可以看做mnesia集群中,表的第四種儲存形式。
在新增乙個節點入集群時,mnesia會嘗試合併(merge)新節點和集群中的schema表,這種合併往往會在新節點已有disc_copies的schema表時失敗:{error,{merge_schema_failed,"incompatible schema cookies. ...
通過mnesia:del_table_copy(schema, 'mynode@host')
將會把』mynode@host』移出集群,但需要先將』mynode@host』上的mnesia停止執行。如果在』mynode@host』節點上有乙個磁碟駐留模式(disc_copies),應該將整個 mnesia目錄刪除。可用mnesia:delete_schema/1
來完成。如果 mnesia 再次在』mynode@host』節點上啟動並且目錄還沒有被清除,mnesia 的行為是不確定的。
如果我們希望取得更快的訪問速度,或者需要對遠端資料庫備份的話,可以通過mnesia:add_table_copy(tab, node, type)
備份遠端資料庫,type欄位為ram_copies, disc_copies, disc_only_copies之一,但仍受限於schema(schema表為ram_copies,則本節點上其它表只能為ram_copies)。
集群中的每張表,在不同的node上,可以有不同的儲存形式(remote, ram_copies, disc_copies, disc_only_copies)。通過mnesia:info()
可以檢視各個表在不同的node上的儲存形式。
新增備份後,mnesia會自動同步各節點對同一張表的更新操作。
mnesia問題集錦
網上的示例,大多以單節點為例,集群中的使用方法參考。注意scheme的設定,節點之間沒有主從之分。分布式環境中很多時候需要我們動態的增加或減少節點。mnesia change config extra db nodes,nodelist 引數是新的node的節點,如果成功,返回,其中resnodel...
iTop常用文件位址
目錄 目錄 1 itop faq itop中文常見問題列表 2 一步一步實施itop 手冊 3 itop使用手冊 4 官方社群英文版 5 中文社群 7 itop菜鳥之路 8 qq群 本手冊完全根據自己的經驗和官方文件進行編寫,告訴大家怎麼使用itop這套itsm工具,包括服務台 問題管理 事件管理 ...
Mnesia啟動過程
mnesia是erlang下的分布式資料庫管理系統,有以下主要特性 1 適合於電信應用的 關係 物件 混合資料模型 2 特別設計的dbms查詢語言,qlc 3 永續性,資料表既可以存在磁碟也可以全部保留在主存 4 複製,資料表可以在幾個節點之間複製 5 原子事務,一系列的表操作可以組合成乙個事務 6...