它是否将所有数据复制到每个节点,还是将数据片段存储在每个节点上,然后在运行时从不同节点获取所需的每个片段?或者这是如何工作的?
如果您使用MySQL而不是Mnesia,群集是否仍能正常工作?
答案 0 :(得分:6)
默认情况下,所有内容都会转到mnesia,大多数内容都会被复制。您也可以选择mnesia表是否转到光盘或内存。基本上,您可以根据需要重新配置mnesia表位置,但通常会将表复制到内存中,以使它们保持接近。
群集ejabberd也是通过mnesia群集上的生成节点完成的,所以可能不值得努力摆脱它。
大多数mod(实现xeps)都使用mnesia,但它们具有mysql等价物。它甚至更宽 - 它们具有SQL等价物,后缀为“_odbc”。示例:mod_roster和mod_roster_odbc。
总而言之,你最终可以使用轻量级的mnesia来处理配置和一些内存中的东西,并使用中央mysql来处理繁重的内容。 mysql的位置可以在ejabberd config中配置。
答案 1 :(得分:3)
Mnesia可以相当轻松地支持群集,但它在交互式erl
会话中会require some tinkering。至于确切的机制,它全部由erlang和mnesia内置的集群处理,而且超出了我的专业知识。您可以告诉它在每个节点上存储副本(副本),但它是一个细粒度的控件,需要根据您的需要进行调整,如this document的第一条评论所示。遗憾的是,我找不到有关碎片如何工作的任何信息,但我怀疑mnesia会缓存(在内存中或光盘上,取决于配置)它从另一个节点检索的任何结构。
你可能需要look at this,因为它解释了SQL的警告 - 即使用它不会消除在ejabberd中使用Mnesia。似乎共享的mysql主机是一个选项,或者在mysql的集群功能中使用主从复制配置也可能起作用,因为共享的SQL服务器可以工作。