`
amornio19840908
  • 浏览: 55800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


启动
启动两个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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics