[Erl_Question12] Mnesia分布式应用

情景:

设计一个图书管理系统,需求:

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的源码写得真好,值得精读.
              
------------------------------------------------------------------------------------------------------------------
                
  一个男人背后的心酸,是旁人无法想象的
  

[Erlang12] Mnesia分布式应用的更多相关文章

  1. [Erlang]Mnesia分布式应用

    http://blog.csdn.net/erlib/article/details/40743687 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个 ...

  2. 使用Masstransit开发基于消息传递的分布式应用

    Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必要普及一下这个框架的使用. 值得一提的是Masstran ...

  3. 解析大型.NET ERP系统 分布式应用模式设计与实现

    C/S架构的应用程序,将一些复杂的计算逻辑由客户端转移到服务器端可以改善性能,同时也为了其它方面的控制..NET Remoting在局域网内调用的性能相当不错.ERP系统中基于.NET Remotin ...

  4. erlang 分布式数据库Mnesia 实现及应用

    先推荐一篇:mnesia源码分析(yufeng)   - linear hash   ETS/DETS/mnesia 都使用了linear hash算法 http://en.wikipedia.org ...

  5. 使用Akka.net开发第一个分布式应用

    系列主题:基于消息的软件架构模型演变 既然这个系列的主题是"基于消息的架构模型演变",少不了说说Actor模型.Akka.net是一个基于Actor模型的分布式框架.如果你对分布式 ...

  6. 使用NServiceBus开发分布式应用

    系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)--企业服务总线.NSe ...

  7. RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

    RDIFramework.NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架 ...

  8. 跟我一起学WCF(3)——利用Web Services开发分布式应用

    一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...

  9. 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

    一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...

随机推荐

  1. 在C#中控制ListBox某一行的字体颜色

    例1 private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add("红色"); listBox ...

  2. 用Python将word文件转换成html(转)

    用Python将word文件转换成html   序 最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上.客户大大说,要智能推送!要掌握节奏!要深度学习!要 ...

  3. ajax 回调函数

    回调函数 如果要处理$.ajax()得到的数据,则需要使用回调函数.beforeSend.error.dataFilter.success.complete. beforeSend 在发送请求之前调用 ...

  4. Python修饰器讲解

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 文章先由stackoverflow上面的一个问题引起吧,如果使 ...

  5. minio test

    docker pull minio/minio docker run --name=minio -d  -p 9001:9000 minio/minio server /data https://do ...

  6. 刷题向》一道关于位运算的神题(BZOJ3668)(HARD-)

    个人觉得这道题对于位运算的加深理解很有意义 根据题目所说,我们要求出一个在给定范围里的自变量,使得最终结果最大. 那么因为这道题是针对于位运算的,所以可以想到用对于位运算取极限情况,即对于“0”和“( ...

  7. css3中的transform、transition、translate、animation(@keyframes)的区别

    一.前言 在CSS中,我们经常会使用到transform.transition.translate.animation(@keyframes)这些长得相似,又不好区分的属性(值).每当需要使用它们,都 ...

  8. c# ftp 判断目录是否存在和创建文件夹

    工作中项目一直使用的ftp上传日志文件出现了问题,新的服务器搭建好后,日志无法上传.正好来学习一下ftp. 程序中的流程是,一个计时器,每分钟检测配置文件中本地日志文件路径下有没有日志文件,如果有就上 ...

  9. socket,TCP/IP的理解(转)

    TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间 ...

  10. HEIDSOFT

    HEIDSOFT ENTHUSIASTIC GITHUB USER heidsoft@sina.com GitHub Profile I'm a developer based in China.sh ...