绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Mnesia数据库集群(基础)
2022-04-11 15:33:15

Mnesia是Erlang OTP分发套件中一个非常重要的分布式数据库管理系统,官方文档指出该数据库适合于电信通讯类应用以及其他要求一致性和实时性的应用。Mnesia提供了专门的查询语言QLC,使用户可以使用类似SQL的方式操作数据库。数据库中的数据可以驻留内存以提高读写效率,也可写入磁盘以进行持久化。得益于Erlang消息复制式进程通信及其在通讯原语中所做的大量简化,使用Mnesia可以轻易实现数据库的集群及备份,同时数据具有位置透明性,开发者根本不必关心数据具体存储在哪个节点上。

我自己今天整了一天的数据库的分布式配置,发现网上有很多资料是错的,如下是一些需要注意的地方:

1)以A、B两节点为例,分别启动两节点后,需要使之建立连接,可用的函数有net_adm:ping和net_kernel:connect。net_adm:ping成功建立连接后返回pong,失败返回pang;net_kernel:connect成功连接返回true,失败返回false。

2)在A、B形成互联节点后,在其中任一节点上,假设为A节点,调用mnesia:create_schema(Nodelist)函数建立schema,关于Nodelist如何取值,网上开始出现谬误,有些同学给的值[nodes()],明显是错误的。nodes()函数本身返回的就是一个列表,在本例中应该是[B@xxx],create_schema函数接到参数后,直接遍历列表元素来获取要创建schema的网络节点,即B@xxx。如果设置为[nodes()],获取的节点值便是一个列表,[B@xxx],简直差之毫厘谬以千里。

那是不是Nodelist直接取成nodes()就行了呢,当然可以,这样做不会出现错误的,但只会在当前节点生成schema的磁盘备份,而远程节点上是空的,而如果把本地节点的名称放进列表里,这时的参数值是[Nodelist],则会成功在本地及远程机器建立schema磁盘备份。

3)何时开始在集群上创建数据表呢?经过2)以后,节点间的连接建立了,schema也建好了,还记得吗,咱们是在A节点上进行操作的。记住,此时mnesia还没有被启动。如果直接调用mnesia:create_table(name,[{disc_copies,Nodelist}])的话会提示远程节点未激活,即not_active,此时需要B节点的mneisa启动,可以调用rpc:call(‘B@xxx’,mnesia,start,[])从A节点启动,然后再调用建表函数,函数执行完毕后,在A、B两节点都可以看到所见的数据表,调用mnesia:info()可以看到如下输出。


下面,再B节点上添加一条记录,然后再A节点进行查找,看看数据是否同步了:


在B添加了一条记录{usr,’Yang’,18,1},从A节点可以查到新添加的记录,实验成功。这样就实现了一个小规模的数据库集群,而且库之间的数据同步mnesia已经做好了,而且互为备份,提高了数据的安全性,不需要我们额外配置或编码处理,实在是方便。

至此,建立好了小集群,但假如B机器因为故障挂掉了,故障修复之后,其上的数据已经不复存在或已缺失、陈旧,那怎么在B上进行数据的恢复呢。很简单,按照下面的步骤,你就可以恢复灾难:

1)启动B节点,并与A连接

2)启动Mnesia,调用mnesia:start()

3)执行mnesia:change_config(extra_db_nodes,[A@xxx])

神奇的一幕发生了,本来B上的数据是无用的,现在,经过上述简单的3不,数据在B节点上完全恢复了,有图有真相:

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Mnesia
创建时间:2022-04-11 15:30:34
Mnesia
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~