使用mnesia,启动为内存存储模式,及集群部署。
第一步:创建online.hrl
-record(chat, {user_name,
pid
}
).
第二步:创建数据库初始化文件,online_init.erl,将chat表创建为ram模式,并且type为bag
-module(online_init).
-include("online.hrl").
-export([init/0]).
init() ->
mnesia:create_table(chat,
[{ram_copies, [aa@localhost, bb@localhost]},
{type, bag},
{attributes, record_info(fields, chat)}]).
第三步:创建测试代码,online_util.erl
add(Who, Pid) ->
F = fun() ->
New = #chat{user_name = Who, pid = Pid},
mnesia:write(New)
end,
mnesia:transaction(F).
remove(Who, Pid) ->
Oid = {chat, Who, Pid},
F = fun() ->
%% 其他类型用mnesia:delete
%% mnesia:delete(Oid)
%% bag类型用mnesia:delete_object
mnesia:delete_object(Oid)
end,
mnesia:transaction(F).
find(Who, Pid) ->
F = fun() ->
io:format("find result, ~p~n", [mnesia:read({chat, Who})])
end,
mnesia:transaction(F).
select(Who) ->
F = fun() ->
Chat = #chat{user_name = Who, pid = '$1', _ = '_'},
io:format("find result, ~p~n", [mnesia:select(chat, [{Chat, [], ['$1']}])])
end,
mnesia:transaction(F).
启动
启动两个console窗口,分别输入
1)
erl -sname aa -mnesia dir '"/test_mnesia/disc/online"'
返回ok
erl -sname bb -mnesia dir '"/test_mnesia/db/online"'
返回ok
2)第一次启动mnesia的时候,在aa或bb点,输入mnesia:create_schema([aa@localhost,bb@localhost]).
返回ok
注意:
1)、schema只能创建一次
2)、实际上,每个节点都保存一份schema拷贝
3)在aa和bb两点分别输入
mnesia:start().
返回ok
4)初始化表,在aa或者bb点输入
online_init:init().
返回 {atomic,ok}
5)查看表信息,在aa和bb点分别输入
mnesia:info().
返回
---> Processes holding locks <---
---> Processes waiting for locks <---
---> Participant transactions <---
---> Coordinator transactions <---
---> Uncertain transactions <---
---> Active tables <---
chat : with 0 records occupying 300 words of mem
...
...
...
说明表创建成功。
验证
验证,集群增,删,查操作
1)在aa点输入 online_util:add("bob", "im").
返回{atomic,ok}
2) 在bb点输入 online_util:find("bob", "im").
返回
find result, [{chat,"bob","im"}]
{atomic,ok}
3)在bb点输入 online_util:add("bob", "hello").
返回{atomic,ok}
4) 在aa点输入 online_util:find("bob", "im").
返回
find result, [{chat,"bob","im"},{chat,"bob","hello"}]
{atomic,ok}
5) 在aa点输入 online_util:remove("bob", "im").
返回
{atomic,ok}
6) 在bb点输入 online_util:select("bob").
返回
find result, ["im"]
{atomic,ok}
验证,宕机处理
1)aa点输入halt(). 宕掉aa点。
2) bb点输入 online_util:select("bob").
返回
find result, ["im"]
{atomic,ok}
说明,mnesia数据库依旧存在。
3) aa点启动,输入erl -sname aa -mnesia dir '"/test_mnesia/disc/online"'
返回ok
输入 mnesia:start().
返回ok
输入 online_util:select("bob").
返回
find result, ["im"]
{atomic,ok}
说明,mnesia数据库,从bb点同步到aa点,数据依旧存在。
参考文献
[1] http://hideto.iteye.com/blog/232881