0 0

Erlang - mnesia:del_table_copy的问题6

今天尝试了下erlang-mnesia的分布式应用(基于OTP-R13B02),发现分布方式的节点在某种情况下退出时有点问题,导致所有的db操作(例如select, write等)失效.

测试如下:
  前提:2台机器A, B分别运行一个Node()
  Case-1 : A机器Mensia启动,B机器Mensia启动
               --> 结果:A机器一切正常,B机器一切正常 (数据同步正常)
  Case-2 : A机器Mensia启动,B机器Mensia启动,B机器Mensia退出.
             --> 结果: A机器一切正常
  Case-3 : A机器Mensia启动,B机器Mensia启动,B机器Mensia退出,B机器Mensia再启动
             --> 结果: A机器一切正常,B机器一切正常 (数据同步正常)
  Case-4 : A机器Mensia启动,B机器Mensia启动,B机器Mensia退出,A机器Mensia退出,B机器Mensia再启动
             --> (NOTICE HERE) 结果: B机器DB操作失效


问题如下:
按照Case-4的描述,应该是退出以后的机器(B机器)检测不到比它"后退出"机器(A机器)的运行状态,所以导致该Node失效,那么尝试使用mnesia:del_table_copy来解决问题,结果却被告知:{failed,{no_exists,XXX-Table}}.....

不知道如果解决该问题,google下了也没有发现很好的答案,甚至有人说这是一个BUG?
哪位前辈知道这个问题如果解决?谢谢.


问题补充
问题补充:
  又测试基于3个节点的分布式Mnesia,原本以为应该会很简单,结果有些出乎意料...

问题描述:
  想在已经运行Mnesia的A,B节点的前提下, 新增加一个节点C,即让C成为额外的备份节点.尝试如下:
  首先尝试了在A节点运行mnesia:change_config(extra_db_nodes, [xxx]),提示错误,后来想是否直接调用mnesia:add_table_copy/3即可呢,结果还是错误...
  google下也有人遇到和我类似的问题,详细见:http://www.erlang.org/pipermail/erlang-questions/2001-July/003401.html, 不过也没有很好的解决方案
  当然,如果把3个节点都停止掉,然后重新调用create_schema([A,B,C])应该是可以的,或者,按照某人的提示单独在C机器上create_table(...)以确保其和A,B节点具有相同的Schema,应该也是可以的,不过这样做比较麻烦...

  有没有更好的方法呢,学习mnesia不久,类似的问题还比较困惑....
问题补充
20.Shadow 写道
问题补充:
  又测试基于3个节点的分布式Mnesia,原本以为应该会很简单,结果有些出乎意料...

问题描述:
  想在已经运行Mnesia的A,B节点的前提下, 新增加一个节点C,即让C成为额外的备份节点.尝试如下:
  首先尝试了在A节点运行mnesia:change_config(extra_db_nodes, [xxx]),提示错误,后来想是否直接调用mnesia:add_table_copy/3即可呢,结果还是错误...
  google下也有人遇到和我类似的问题,详细见:http://www.erlang.org/pipermail/erlang-questions/2001-July/003401.html, 不过也没有很好的解决方案
  当然,如果把3个节点都停止掉,然后重新调用create_schema([A,B,C])应该是可以的,或者,按照某人的提示单独在C机器上create_table(...)以确保其和A,B节点具有相同的Schema,应该也是可以的,不过这样做比较麻烦...

  有没有更好的方法呢,学习mnesia不久,类似的问题还比较困惑....


郁闷了,刚用mnesia:change_config(extra_db_nodes, [xxx])成功了...C节点能正确同步了.
原因是C节点的mnesia要确保在运行状态....刚开始怎么没发现这点???
彻底郁闷了.........
2010年2月04日 16:07
目前还没有答案

相关推荐

Global site tag (gtag.js) - Google Analytics