前几天尝试了下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的兴趣