gpt4 book ai didi

erlang - 一个复制的 mnesia 表变得不同步

转载 作者:行者123 更新时间:2023-12-04 15:23:06 24 4
gpt4 key购买 nike

我有一个 erlang 应用程序,目前在四个节点上运行,并带有一个复制的 mnesia 数据库,该数据库存储有关连接客户端的最少数据。 mnesia 复制过去一直在无缝工作(据我所知),但最近一位客户注意到其中一个节点缺少与他的应用程序相关的一些 id。

我不太确定这是怎么发生的。我们的网络当时可能出现了问题。也许?但是,目前更紧迫的是让所有节点的数据都处于良好状态。有没有办法告诉 mnesia 从已知良好的节点复制?

最佳答案

Mnesia 在这个问题上很有传奇色彩。这是一个巨大的皮塔饼。

从 CAP 定理的角度来看,大多数使用 Mnesia 构建的系统最终都是 C-A(无分区容错的一致性可用性)系统。在大多数情况下,您拥有(并严重依赖)它的硬一致性。然后发生网络分区...
它仍然可用于写入,但这些写入破坏了一致性。后来,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, []).

只有在解决了网络分区并且所有节点都可以访问后才能使用它。这将删除所有 Mnesia 副本并重新启动它。同样,如果你不能忍受它的作用,那么使用 Mnesia 是一个糟糕的选择。

对于需要硬一致性的重要数据,使用SQL。对于需要可用性的重要数据,请使用 Riak。对于需要速度的共享状态,请使用 Redis。 Mnesia 不能替代这些系统,尽管乍一看确实如此。

2014-11-16 编辑:这是一篇关于该主题的更好的文章,详细解释了我上面所说的 https://medium.com/@jlouis666/mnesia-and-cap-d2673a92850

关于erlang - 一个复制的 mnesia 表变得不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19945609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com