使用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
分享到:
相关推荐
1.2.Mnesia.数据库管理系统(DBMS 2、开始.Mnesia 2.1.首次启动.Mnesia 2.2.一个示例 3、构建.Mnesia.数据库 3.1.定义模式 3.2.数据模型 3.3.启动.Mnesia 3.4.创建新表 4、事务和其他上下文存取 ...
Management System, appropriate for telecommunications applications and other Erlang applications which require continuous operation and soft real-time properties. It is one section of the Open Telecom...
erlang的高性能集群服务器,erlang解决方案。 供大家学习使用
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 如何做 Mnesia ...
erlang-mnesia-19.3.6.4-1.el7.x86_64.rpm
高性能集群服务器Erlang解决方案
Examples are included how to start an Erlang session, specify a Mnesia database directory, initialize a database schema, start Mnesia, and create tables. Initial prototyping of record definitions is ...
nkcluster, 在大型Erlang集群中,管理作业的框架 Intoduction快速入门用例和部署方案启动和发现功能操作指南请求,任务和作业类失败方案失败配置文件简介NkCLUSTER是创建任何规模的Erlang节点集群,并将它的分配和...
erlang系统自带的数据库mnesia的官方文档。
Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时 特性的Erlang应用。
RabbitMq+earlang otp_src_22.1.tar.gz (erlang) rabbitmq-server-3.8.1-1.el7.noarch.rpm
Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,是构建电信应用的控制系统平台——开放式电信平台(OTP)的一部分。
Mnesia table fragmentation 过程及算法分析。erlang就算在64位下dets的空间限制仍旧是2g,同样影响了mnesia,如果有更大需求,就必须使用Mnesia的 table fragmentation 技术
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
erlang 安装包
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
ecto_mnesia:Mnesia Erlang术语数据库的Ecto适配器
“即便我已经使用Erlang多年,在编程的时候仍然需要参考《Erlang编程指南》。..., • 使用内置的Mnesia数据库和其他表存储功能。, 《Erlang编程指南》每章末尾都提供了练习题,并且由简单的示例贯穿全书。
erlang otp25 win安装包
Erlang及其应用Erlang及其应用Erlang及其应用