日期:2014-05-16  浏览次数:20493 次

分布式数据库mnesia管理

? ? ? 经过上两篇博客的学习大伙已经初步了解了mnesia的创建和库内表的创建,已经各种对表的操作。

? ? ??

? ? ? 接下来我们就要了解一下mnesia数据库和其他关系型数据区别最大的特性,就是它的分布式特性。首先需要介绍的是mneisa分布式架构的拓扑图:

? ? ? ? ?通过上图我们可以了解到,先由一个以上的erlang节点组成一个相互之间的对等的master集群,这个master集群中的任何一台master节点宕机的话,都不会影响master集群对外发布的数据服务。master集群中的表需要设置为disc_copies类型的数据表,那么宕机之后恢复节点并且重启之后并不会丢失数据,而且会自动同步在宕机这段时间中其他master节点上的增量数据。

? ? ? ?

? ? ? ? 在master节点之外,可以启动若干个mnesia的slaver节点,在slaver节点上存放的数据是master节点内存副本,所以一旦slaver节点宕机之后,重启slaver节点会发现数据库中的表已经全部丢失,需要重新连接到master节点上把master节点上的数据同步到本地的内存中来。

? ? ??

? ? ? ? 现在就来详细介绍一下如何构建这个分布式mnesia数据库集群。

? ? ? ? 首先需要构建一个全联通的erlang节点网络,这个没有什么难度通过epmd框架,在节点启动的时候在命令行上设置节点名称,命令是, erl -name mst -setcookie xxxxxx -mnesia dir ‘“/tmp/mnesia_store”’,设置不同的name启动若干个erlang节点,需要保证每个节点使用相同的cookie值,否者节点之间无法联通了。

? ? ? ?

? ? ? ? 通过以下步骤创建master节点:

? ? ? ? 1. 启动集群中准备用来作为master角色的节点启动, ?

? ? ? ? 2. 通过net_adm:ping('mst1@node1'). 这样的命令打通所有节点,

? ? ? ? 3. 使用nodes().函数确认所有节点是否已经联通

? ? ? ? 4. 调用mnesia:create_schema([nodes()]). 注意,这里参数是用的nodes()函数,他会取得集群中所有节点,通过这个函数在所有master节点上创建了一份schema文件,在各个节点上执行 ls /tmp/mnesia_store命令可以在文件夹中看到已经创建的schema文件。

? ? ? ? 5. 启动mneisa数据库,调用mnesia:start() 启动数据库,执行mneisa:info() 查看mneisa数据库的状态,如下:


? ? ? ? ? ?从上图我们可以了解到,本地d:/tmp/mnesia 保存数据的目录已经启用,并且数据库的两个副本:'baisui@aliyun-18097n.taobao.ali.com','mynode@aliyun-18097n.taobao.ali.com'已经启动,另外还有两个副本节点(stopped db nodes)尚未启动。在所有master节点上重复执行mnesia:info() 命令显示的结果应该是一样的。

? ? ? ? ? ?至此,所有所有master节点已经启动完毕。

? ? ? ? ? ?

? ? ? ? ??通过以下步骤创建slaver节点:

? ? ? ? ??

?通过