Erlang mnesia 集群

使用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).


[size=x-large][b]启动[/b][/size]
启动两个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
...
...
...

说明表创建成功。

[size=x-large][b]验证[/b][/size]

[size=x-large][b]验证,集群增,删,查操作[/b][/size]
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}

[size=x-large][b]验证,宕机处理[/b][/size]
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值