Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1707046
  • 博文数量: 607
  • 博客积分: 10031
  • 博客等级: 上将
  • 技术积分: 6633
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-30 17:41
文章分类

全部博文(607)

文章存档

2011年(2)

2010年(15)

2009年(58)

2008年(172)

2007年(211)

2006年(149)

我的朋友

分类:

2009-07-16 16:04:51

Erlang 与 Mnesia 分布式初探

:          2009-03-31 17:57
前几天尝试了下Mnesia的分布式,分享下经验
首先,创建一个分布式环境
我们讨论的是分布式是内网通过相同的cookie来实现的,按照书上的方法,
让2台服务器的/root/.erlang.cookie 文件的内容相同就好了。
 
在服务器A上打开个节点
erl -sname server01 -mnesia -dir '"/server/db"'
在服务器B上打开另外一个节点
erl -sname server02 -mnesia -dir '"/server/db"'
 
在服务器A上创建数据库,如果已经存在,先mnesia:delete_schema([node()])) 删除
server01@NBCTC-5-60> mnesia:create_schema([node(),'server02@NBCTC-5-62']).
然后通过 运行相关创建表的erlang程序,创建个表player (内存表)
服务器A和B,通过 mnesia:info(). 就可以看到,这个表player已经被分布到 server01 , server02 上了
这样一来,2台服务器都可以调用player这张表了,并且Mnesia会通过内网同步这个表。
 
Erlang程序的分布式:
让一套程序代码 分别 运行在 server01,server02上,
程序都可以访问player这张表,实现了共享在线数据
 
当一个连接accpet后,会生成个socket,erlang里面是一个#Port<0.xxx> 这样的数据,
我把它保存在 player 这张表里面,
 
连接到服务器A的用户UA   向  连接到服务器B 的用户UB   发送消息的时候
我们无需中转机,直接通过Erlang的远程调用库来实现,非常的方便
send_to_client(Socket,Sname,Data)   ->                   %%Sname是Socket所在的节点名字
    Local   =node(),
    case Sname of
        Local                 ->                                           %%如果是本地的节点,直接调用
            gen_tcp:send(Socket,Data);
        _   ->
            rpc:cast(Sname,gen_tcp,send,[Socket,Data])   %%使用异步调用,无需关心返回值
    end.
 
 
Erlang实现分布式非常容易,而且无需中转服务器,不知道这会不会勾起你学习Erlang的兴趣
阅读(1016) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~