[Erlang]Mnesia分布式应用
http://blog.csdn.net/erlib/article/details/40743687
情景:
设计一个图书管理系统,需求:
1. 基本的增删查改功能;
2. 支持多节点备份(其中一个节点挂了进,对外接口不影响)。
方案一:

Erlang 代码如下:https://gist.github.com/zhongwencool/28f7db8d52134b082f97
启动shell:
erl -name cloud_server@127.0.0.1 -pa "../ebin/" -setcookie best -run cloud_server start_link
erl -name server0@127.0.0.1 -pa "../ebin/" -run deal_book_server -extra server0@127.0.0.1
erl -name server1@127.0.0.1 -pa "../ebin/" -run deal_book_server -extra server1@127.0.0.1
.......
erl -name server9@127.0.0.1 -pa "../ebin/" -run deal_book_server -extra server9@127.0.0.1
Tip: 实现的关键在于:每个节点起来后会自动连接到Cloud Center Node 上,并在每15scheck一下与Cloud的连接,Cloud时刻保证最新了节点连接状态数据,并定时广播给连上来的所有节点。
如果你自己写完这个例子,就会对节点互接有更深认识。
方案二:
使用Mnesia的分布特性:
1. 首先我们来实现一个简单的1+1(一个数据处理节点 + 一个备份节点)

-module(db_sync).
-author("zhongwencool@gmail.com"). %% API
-export([create_schema/0, create_table/0,i/0]).
-export([add_account/3,del_account/1,read_account/1]).
-record(account, {id = 0, name = "", phone = 138000001}).
create_schema() –>
net_kernel:connect('two@E7D4C9EFE9C405'),
io:format("Self:~w,Connect Nodes:~w",[node(),nodes()]),
mnesia:create_schema([node()|nodes()]).
create_table() –>
mnesia:create_table(account,
[{disc_copies,[node()|nodes()]},
{attributes,
record_info(fields, account)}]
).
%%查看数据库状态
i() –>
mnesia:system_info().
add_account(ID, Name, Phone) –>
mnesia:transaction(
fun() –>
mnesia:write(#account{id = ID, name = Name, phone = Phone})
end).
del_account(ID) –>
mnesia:transaction(
fun() –>
mnesia:delete({account, ID})
end).
read_account(ID) –>
mnesia:transaction(
fun() –>
mnesia:read({account, ID})
end).

1.1 在xterm 1中:
> erl erl -sname one -mnesia dir "one"
1.2 在xterm 2中:
> erl -sname two -mnesia dir "two"
> db_sync:create_schema().
1.3 分别在one shell ,two shell中启动mnesia
> mnesia:start().
1.4 在任意节点中创建account表
> db_sync:create_table().
这里的account表就是one , two 节点所共享的了,你可以在节点one上增加一个数据,在节点two上查询这个数据,对于用户来说:这完全是透明的!!
1.5 Test:
one 节点上增加数据:

two 节点上查询数据:

2. 节点one挂了后,重启怎么把从two数据同步到节点one?
节点one重启后把数据库表重新建一次就可以啦,如果数据在one挂掉至重启过程中在节点two上发生了变化了,也可以使用mnesia:add_table_copy来做到数据同步。
相信如果掌握了mnesia这2个特性,就可以实现比方案一更加简洁的分布系统啦!
看Mnesia文档里发现一个有意思的点:
是不是觉得mnesia只有使用一个key(当然你可以使用复杂的match表达式来做实现复杂查询条件),但因为match的效率比较低,所有如果你频繁的使用,是不推荐的,这里你应该看看下面这个函数:可以增加一个index哦!【真福利】
add_table_index(Tab, AttrName) -> {aborted, R} | {atomic, ok}
Table indices can and should be used whenever the user wants to frequently use some other field than the key field to look up records. If this other field has an index associated with it, these lookups can occur in constant time and space. For example, if our application wishes to use the name field of accountto efficiently find all account with a specific name, it might be a good idea to have an index on the namefield. This can be accomplished with the following call:
mnesia:add_table_index(account, name).
Indices do not come free, they occupy space which is proportional to the size of the table. They also cause insertions into the table to execute slightly slower.
这样做总比再做一张表来对应Id和Name好多了。
个人觉得Mnesia的源码写得真好,值得精读.
[Erlang]Mnesia分布式应用的更多相关文章
- [Erlang12] Mnesia分布式应用
[Erl_Question12] Mnesia分布式应用 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个节点挂了进,对外接口不影响). 方案一: Er ...
- erlang mnesia 数据库实现SQL查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...
- erlang mnesia数据库设置主键自增
Mnesia是erlang/otp自带的分布式数据库管理系统.mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足.mnesia数据表没有主键自增的功能,但在mnesi ...
- erlang mnesia 数据库查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...
- erlang mnesia数据库简单应用
mnesia是erlang自带的分布式数据库,基于ets和dets实现的.mnesia兼顾了dets的持久性和ets的高性能,可以自动在多个erlang节点间同步数据库.最关键的是,mnesia实现了 ...
- [erlang] mnesia
原文地址: http://www.cnblogs.com/bluefrog/archive/2012/05/16/2504625.html 本来是项目合作的,可是你却一而再再而三的使用这招,我处理愤怒 ...
- erlang 分布式数据库Mnesia 实现及应用
先推荐一篇:mnesia源码分析(yufeng) - linear hash ETS/DETS/mnesia 都使用了linear hash算法 http://en.wikipedia.org ...
- 一位Erlang程序猿的自白
12.00 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style De ...
- [转]Erlang不能错过的盛宴
Erlang不能错过的盛宴 (快步进入Erlang的世界) 作者:成立涛 (litaocheng@gmail.com) 作为程序员,我们曾经闻听很多“业界动态”,“技术革新”,曾经接触很多“高手箴言” ...
随机推荐
- js面向对象1----了解构造函数
一.构造函数与实例的区别 1 构造函数 构造函数主要是一种用于生成对象的饼干模具,这些对象具有默认属性和属性方法,它可以创建多个共享特定特性和行为的对象. 构造函数只是一个函数,但当函数遇到了ne ...
- 修饰器&高阶组件
一.修饰器 1.类的修饰 修饰器是一个函数,用来修改类的行为 function testable(target) { target.isTestable = true; } @testable cla ...
- VC++ 6.0 BUG BUG BUG BUG BUG
http://blog.163.com/amao831@126/blog/#m=0 我经常在的VC++6.0中 定义某个类的对象时 再用.访问或者->访问时不自动弹出他的成员函数或者成员变量 最 ...
- [React] Configure a React & Redux Application For Production Deployment and Deploy to Now
In this lesson, we’ll make a few small changes to our scripts and add some environment variables tha ...
- Android开发之搜芽项目的图片载入问题(使用Volley进行网络图片载入)
搜芽的移动开发这几天进度相对来说很的快. 可是美中不足的就是网络图片的载入问题. 我有两套方案: 1)沿用迅雷动漫的图片载入.迅雷动漫也是用的一个开源的库.可是不知道是我使用出了问题还是真的是它的问题 ...
- Android---- 获取当前应用的版本号和当前android系统的版本号
Android 应用程序获得版本号 我们可以在AndroidManifest.xml中设置程序的版本号等,如android:versionName="1.0",那如果想在代码中获取 ...
- 【MemSQL Start[c]UP 3.0 - Round 1 A】 Declined Finalists
[链接]h在这里写链接 [题意] 在这里写题意 [题解] max(最大值-25,0) [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> ...
- xcode 各种项目设置
1:语言环境设置:项目–>PROJECT–>info–>Locailzation 2 : 手动加入项目依赖 Build Settings–>Search path–>Li ...
- AS2.0鼠标尾随和拖动代码
1,鼠标尾随. a: Mouse.hide();//隐藏鼠标.Mouse.show()显示鼠标. MC1.startDrag(true);//直接利用函数实现. b: Mouse.hide(); on ...
- C++——多态性实现机制
C++的多态性实现机制剖析 1. 多态性和虚函数 #include <iostream.h> class animal { public: void sleep() { cout<& ...