mnesia分布式探寻—无盘节点上运行mnesia深入分析

Mnesia需要schema来初始化自己, schema表可以位于一个或多个节点上, schema表的存储类型可以是disc_ copies或ram_copies(不能是disc only_copies)。 Mnesia在启动时,使用schema表来决定应该和哪些节点建立 联系, 如果其他节点已经启动, 则启动节点将其他节点的表定义和自己的表定义合并, 参数extra_db_nodes包含一个节点list, Mnesia除了schema里的节点, 还要和该参数的节点建立联系,默认值为[] 。因此, 当无盘节点需要从网络上的一个远程节点找到schema定义, 则我们需要从-mnesia extra_db_nodes参数节点列表支持该信息如果没有这个配置参数,Mnesia会以一个单节点系统启动。
1、mnesia:change_config(extra_ db_nodes,a@zcc),告诉无盘节点到a@ zcc上去找schema的定义, 默认将远端schema拉到本地内存,然后通过mnesia: change_table_copy_type(schema, node(),disc_copies) 真正将schema放到磁盘上,此时执行mnesia: info()可以看到remote字段会显示远端表, 此时对表的一切操作都反映到远端表上,当远端节点退出时, 便不能写入数据。
2、在无盘节点上,执行完1的mnesia:change_ config(..,..)后,在远端节点执行mnesia: add_table_copy(Tab,无盘节点,ram_ copies) 会把Tab表从远端节点真正拷贝到本地无盘节点的ram内, 此时在无盘节点上的操作均是操作本地表。

附:

a、 schema在内存中,则只能将表拷贝到内存,当schema在disc时,既能将表拷到内存,又能将表拷到磁盘;

b、 不同的schema间,表不能拷贝, schema与表具有一定的对应关系,即a@ zcc建了一个schema,b@zcc建了一个schema, 则b@zcc上的表不能拷贝 到a节点上,会报{aborted, {not_active,schema,a@zcc}};
c、schema默认都是创建在磁盘上的。

你可能感兴趣的:(mnesia分布式探寻—无盘节点上运行mnesia深入分析)