我有一个debian盒用芹菜和rabbitmq运行任务大约一年.最近我注意到任务没有被处理,所以我登录系统,发现芹菜无法连接到rabbitmq.我重新启动了rabbitmq-server,尽管芹菜不再抱怨它现在没有执行新的任务.奇怪的是,rabbitmq正在疯狂地吞噬cpu和内存资源.重新启动服务器无法解决问题.花了几个小时在网上寻找解决方案后无济于事我决定重建服务器.
我用Debian 7.5,rabbitmq 2.8.4,芹菜3.1.13(Cipater)重建了新的服务器.大约一个小时左右,一切都工作得很好,直到芹菜开始再次抱怨它无法连接到rabbitmq!
[2014-08-06 05:17:21,036: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
Trying again in 6.00 seconds...
Run Code Online (Sandbox Code Playgroud)
我重新启动了rabbitmq service rabbitmq-server start和同样的问题:
rabbitmq开始再次膨胀,不断冲击cpu并慢慢接管所有ram并交换:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21823 rabbitmq 20 0 908m 488m 3900 S 731.2 49.4 9:44.74 beam.smp
Run Code Online (Sandbox Code Playgroud)
结果rabbitmqctl status如下:
Status of node 'rabbit@li370-61' ...
[{pid,21823},
{running_applications,[{rabbit,"RabbitMQ","2.8.4"},
{os_mon,"CPO CXC 138 46","2.2.9"},
{sasl,"SASL CXC 138 11","2.2.1"},
{mnesia,"MNESIA CXC 138 12","4.7"},
{stdlib,"ERTS CXC 138 10","1.18.1"},
{kernel,"ERTS CXC …Run Code Online (Sandbox Code Playgroud) 当我得到时,我在mnesia集群数据中有一个坏节点(它不存在):
> mnesia:system_info(db_nodes)
[bad@node, ...]
Run Code Online (Sandbox Code Playgroud)
如何从群集中删除它?
我试过了:
> mnesia:del_table_copy(scheme, bad@node).
{aborted,{not_active,"All replicas on diskfull nodes are not active yet"...
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我该如何解决?
更新.在从架构中删除节点之前,我们需要在其上停止mnesia
我是erlang和mnesia新手..
如何将新的disc_only_copies节点添加到已具有架构的mnesia数据库中?
谢谢
是否可以从mnesia集群中的网络分区恢复而无需重新启动任何涉及的节点?如果是这样,那怎么办呢?
我特别感兴趣的是:
虽然我很欣赏一般分布式系统理论的指针,但在这个问题上,我只对erlang/OTP mnesia感兴趣.
我们使用Mnesia作为非常大的系统的主数据库.Mnesia Fragmented Tables在测试期间表现良好.系统有大约15个表,每个表在2个站点(节点)上复制,每个表都是高度分散的.在测试阶段(主要关注可用性,效率和负载测试),我们接受了Mnesia的复杂结构的许多优点将为我们做,因为我们在服务之上运行的所有应用程序都是Erlang/OTP应用程序.我们运行Yaws 1.91作为主WebServer.
为了有效地配置分段表中,我们使用了一些谁已经在大型系统中使用Mnesia的引用:
它们是:Mnesia的一年后博客,博客的第2部分,其次是即使在这里,关于散列.这些博客文章帮助我们在这里和那里进行了微调,以获得更好的性能.
现在,问题.Mnesia有表格大小限制,是的,我们同意.但是,在任何地方都没有提到对片段数量的限制.出于性能原因,并且为了满足大数据的需要,有多少片段会让mnesia"好"?
在我们的一些表中,我们有64个片段.与n_disc_only_copies集到集群中的节点的数量,使得每个节点具有每片段的副本.如果给定节点瞬间无法触及,这有助于我们解决mnesia写入失败的问题.同样在上面的博客中,他建议the number of fragments should be a power of 2,这个声明(他说)是从mnesia记录的散列方式进行调查的.然而,我们需要对此进行更多的解释,以及在这里讨论两种权力:2,4,16,32,64,128,......?
该系统适用于HP Proliant G6,包含Intel处理器(2个处理器,每个4核,每个核心2.4 GHz速度,8 MB高速缓存),20 GB RAM大小,1.5 TB磁盘空间.现在,我们可以使用其中的两台高功率机器.应该在两者之间复制系统数据库.每个服务器运行Solaris 10,64位.
什么数量的碎片可能会使mnesia的表现开始降级?如果我们将给定表的片段数从64增加到128,这样可以吗?65536个片段(2 ^ 16)怎么样?我们如何通过使用碎片来扩展我们的mnesia以利用Terabyte空间?
请提供问题的答案,您可以提供有关可能增强系统的任何其他参数的建议.
注意:所有要保存数百万条记录的表都是按disc_only_copies类型创建的,因此没有RAM问题.对于我们运行的少数RAM表,RAM就足够了.其他DBMS(如MySQL Cluster和CouchDB)也将包含数据,并且与我们的Mnesia DBMS使用相同的硬件.MySQL Cluster在两个服务器上复制(每个服务器包含两个NDB节点,一个MySQL服务器),管理节点位于不同的主机上.
警告:背景信息很长.如果您认为在背景信息之前需要问题,请跳到底部.欣赏这将要采取的时间!
我一直在网上(阅读谷歌),我没有找到一个好的答案.是的,在erlang.org网站上有很多关于Mnesia文档的链接和参考,但即使这些链接也受到版本的影响.
因此,在最简单的情况下,您当前连接的节点()与表集的所有者相同,那么备份/恢复将起作用.例如:
$ erl -sname mydatabase
> mnesia:start().
> mnesia:create_schema(...).
> mnesia:create_table(...).
> mnesia:backup("/tmp/backup.bup").
> mnesia:restore("/tmp/backup.bup", [{default_op, recreate_tables}]).
Run Code Online (Sandbox Code Playgroud)
嘿,这很棒!
但是,如果数据库实际上是在远程接口上的远程节点()或远程节点()上运行,那么您必须以这种方式启动备份:
$ erl -sname mydbadmin
> rpc:call(mydatabase@host, mnesia, backup, ["/tmp/backup.bup"]).
> rpc:call(mydatabase@host, mnesia, restore, ["/tmp/backup.bup", [{default_op, recreate_tables}]]).
Run Code Online (Sandbox Code Playgroud)
当然这也很简单.现在这里是棘手的事情....
但事情变得复杂了.虽然我的熟人是erlang和mnesia专家,他们认为mnesia的复制存在严重缺陷,你不应该使用它(目前我还没有其他替代方案,你有什么机会实现更好的版本;不是可能)
所以你有两个节点()复制ram和基于光盘的表.您一直在使用默认的BackupMod维护使用标准备份定期备份数据库的策略.有一天,经理会要求您验证备份.只有当您尝试还原数据库时,才会获得:
{atomic,[]}
Run Code Online (Sandbox Code Playgroud)
根据文档,这意味着没有错误......但是没有表格被恢复.
不想跑你记住,节点()和主机名必须匹配,以便您更改主机名和-sname参数去那里数据被备份的计算机匹配change_node程序.但是这次你得到一个奇怪的错误:
{aborted,{'EXIT',{aborted,{bad_commit,{missing_lock,mydatabase@otherhost}}}}}
Run Code Online (Sandbox Code Playgroud)
仍然不想运行change_node过程我快速克隆恢复我的服务器,以便我有两个类似的机器.然后我恰当地命名以匹配生产服务器.然后我开始恢复过程.找到了!我现在在还原服务器上有真正的工作数据.
我想说这是路的尽头......但我还没有问过一个问题,而且问题的重点......所以这就是它?
问题:如果我想恢复从复制的mnesia节点集群中获取的备份,如何修改文件(类似于change_node过程),以便忽略其他节点或从备份中删除?
问题略有不同:如何在单个节点()上恢复复制多节点()mnesia数据库?
我mnesia overloaded主要使用async_dirty查询和ram_copies表时有时会收到错误消息.因此,要了解发生了什么,我想获得有关mnesia状态的更多信息,例如每秒查询数或查询队列的大小.我搜索了很多,发现了两种可能的方法.
第一个是mnesia:system_info可以返回当前事务列表的函数.但它似乎无法提供有关非事务性查询的信息.
第二个是订阅mnesia事件,但是使用这种方式需要一些活动的后台处理以及手动订阅每个表事件.
是否有更好的方法来获取此信息?
我在machine1上创建了一个Mnesia数据库/ Schema.该节点名为mypl @ machine1.然后我将所有文件移动到machine2,因为machine1崩溃了.只要代码运行时名称为"mypl @ machine1",一切运行正常.显然这有点令人担忧,因为它现在在machine2上运行.
如果我使用节点名称"mypl @ machine2"启动Erlang,则Mnesia数据库显示为空.
如何将Mnesia数据库中的节点从machine1重命名为machine2?
我有一些带disc_only_copies类型的大表.现在我需要将短节点名称更改为long但不能使用RAM限制...
我可以部分使用备份/恢复数据库(逐个表)吗?