Roc*_*igh 6 erlang mnesia distributed-computing
我有一个当前在四个节点上运行的erlang应用程序,其中有一个复制的mnesia db,它存储有关已连接客户端的最小数据.mnesia复制过去一直在无缝工作(据我所知),但客户最近注意到其中一个节点缺少与他的应用程序相关的一些ID.
我不确定这是怎么发生的.我们的网络当时可能已经打了个嗝.也许?但是,目前更紧迫的是使数据在所有节点上都处于良好状态.有没有办法告诉mnesia从一个已知良好的节点复制?
Mnesia 在这个问题上颇具传奇色彩。这是一个巨大的皮塔饼。
从 CAP 定理的角度来看,大多数用 Mnesia 构建的系统最终都是 CA(一致性可用性,无分区容错)系统。大多数时候你拥有(并且严重依赖)它的硬一致性。然后发生网络分区...它仍然可用于写入,但这些写入破坏了一致性。后来Mnesia就没有自动修复数据的机制了。
每个在集群中使用 Mnesia 的人都应该熟悉这些权衡。你的问题清楚地表明使用 Mnesia 是一个糟糕的选择。如果此数据对您很重要,则加倍。
我也以这种方式使用 Mnesia(有时我们都需要速度,你知道)。但我确保只使用它来存储我可以轻松重建的数据。一般来说,如果你需要将其存储在磁盘上,Mnesia 就没什么用了,除了玩具项目。
我确保手边始终有这个功能:
reinit_mnesia_cluster() ->
rpc:multicall(mnesia, stop, []),
AllNodes = [node() | nodes()],
mnesia:delete_schema(AllNodes),
mnesia:create_schema(AllNodes),
rpc:multicall(mnesia, start, []).
Run Code Online (Sandbox Code Playgroud)
仅在网络分区已解决并且所有节点均可访问后才使用它。这将删除所有 Mnesia 副本并重新启动。再说一遍,如果您无法忍受它的功能,那么使用 Mnesia 是一个糟糕的选择。
对于需要硬一致性的重要数据,请使用SQL。对于需要可用性的重要数据,请使用 Riak。对于需要速度的共享状态,请使用 Redis。Mnesia 并不能替代这些系统,尽管乍一看确实如此。
编辑于2014年11月16日:这是一篇关于该主题的更好的文章,详细解释了我上面所说的https://medium.com/@jlouis666/mnesia-and-cap-d2673a92850