我正在研究如何为Erlang应用程序组织数据存储的可能选项.它应该使用的数据基本上是由短字符串id索引的大量二进制blob集合.每个斑点都低于10 Kb,但其中有很多.我希望总共有200 Gb的大小,所以很明显它不能适应内存.对此数据的典型操作是通过其id读取blob或通过其id更新blob或添加新的blob.在每个给定的时段,仅使用一部分ID,因此数据存储访问性能可能受益于内存缓存.谈到性能 - 这非常关键.目标是在商用硬件上(例如在EC2 VM上)每秒进行大约500次读取和500次更新.
有什么建议可以在这里使用吗?据我所知,dets是不可能的,因为它仅限于2G(或者它是4G?).Mnesia可能也不成问题; 我的印象是它主要是为数据适合内存的情况而设计的.我正在考虑尝试使用EDTK的Berkeley DB驱动程序.它会在上述情况下起作用吗?有没有人在类似条件下的生产中使用它的经验?
我正在建立一个rabbitmq集群,并在此过程的一个步骤中遇到问题.它直接来自rabbitmq聚类指南.
root@celery:~# rabbitmqctl status
Status of node celery@celery ...
[{pid,20410},
{running_applications,[{rabbit,"RabbitMQ","2.5.1"},
{os_mon,"CPO CXC 138 46","2.2.4"},
{sasl,"SASL CXC 138 11","2.1.8"},
{mnesia,"MNESIA CXC 138 12","4.4.12"},
{stdlib,"ERTS CXC 138 10","1.16.4"},
{kernel,"ERTS CXC 138 10","2.13.4"}]},
{os,{unix,linux}},
{erlang_version,"Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:30] [hipe] [kernel-poll:true]\n"},
{memory,[{total,25296704},
{processes,9680280},
{processes_used,9662720},
{system,15616424},
{atom,1099393},
{atom_used,1082732},
{binary,89768},
{code,11606637},
{ets,726848}]}]
...done.
root@celery:~# rabbitmqctl cluster_status
Cluster status of node celery@celery ...
[{nodes,[{disc,[celery@celery]}]},{running_nodes,[celery@celery]}]
...done.
root@celery:~# rabbitmqctl stop_app
Stopping node celery@celery ...
...done.
root@celery:~# rabbitmqctl reset
Resetting node celery@celery ...
...done.
root@celery:~# …Run Code Online (Sandbox Code Playgroud) 我已经安装ejabberd聚类,一个是主站和另一个是如所描述的从这里.
我已将.erlang.cookie和数据库文件从master复制到slave.一切都很好.
问题是当我停止主节点时:
我被困在这里,请帮帮我.谢谢
我有一个类型为 disc_copies 的表 A。它在磁盘上有两个文件。
根据我的理解,A.DCL 是日志文件,A.DCD 拥有所有数据。今天我对A进行了多次操作,但是A.DCD保持不变,但A.DCL的大小增加了。当我的应用程序启动时,当 DCD 文件未更改时,该表如何存储在 ram 中。没有适当的文档,所以谁能告诉确切的过程是什么?即使表中没有数据,DCD 文件也会随着时间的推移变得非常大,有人能澄清一下吗?
类型集表和ordered_set类型表之间有什么区别?我对读/写性能的差异,基于排序的内容,跨分布式节点的影响等感兴趣.
我有一个运行了大量自定义模块的ejabberd服务器.我有几个mnesia表,我知道这些可以很容易地在节点之间复制而根本不需要对代码进行任何更改.我想知道是否有与ets表类似的方式?
理想情况下,能够让几台机器运行完全相同的mnesia和ets数据是很好的,而不必将我的ets表转换为mnesia表.(从而重写了大量的代码.)
虽然我曾经做过一次rpc:在每个节点的ets表上调用,但我不确定这会对性能产生什么影响.
如果有人有任何答案,请告诉我.
是否有标准的地方将mnesia数据库放在erlang中?目前我将它放在priv目录中.
我在第一个@ localhost节点的erlang condose中收到了这样的消息
=ERROR REPORT==== 1-Jan-2011::23:19:28 ===
** Node 'second@localhost' not responding **
** Removing (timedout) connection **
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 在这种情况下什么是超时?这个事件导致多少时间?如何防止这种"恐怖"?我只能通过重启节点恢复\恢复到正常工作......但是正确的方法是什么?
谢谢,新年快乐!
我正在与远程服务器进行交互.此远程服务器位于不同的时区.部分身份验证要求我生成:
"The number of seconds since January 1, 1970 00:00:00 GMT The server will only accept requests where the timestamp is within 600s of the current time"
的文件erlang:now().揭示它可以让我the elapsed time since 00:00 GMT, January 1, 1970 (zero hour)
on the assumption that the underlying OS supports this.它返回一个size=3元组{MegaSecs, Secs, MicroSecs}.我尝试使用,element(2,erlang:now())但远程服务器发送给我这条消息:
Timestamp expired: Given timestamp (1970-01-07T14:44:42Z) not within 600s of server time (2012-01-26T09:51:26Z)自1970年1月1日起,这三个参数中的哪一个是所需的秒数?我做的不对吗?是不是我必须用做
universal time在calendar:universal_time() ? seconds_1970()-> …
我已经阅读并重新阅读了文档:mnesia:activity/3,mnesia:activity/4,以及mnesia/transaction/2,但它们对我来说仍然像一本不起眼的外语.
在我有限的实验中,它们似乎返回相同的结果.
某种灵魂可以帮助我理解何时以及为什么我会使用一种与另一种相比?
非常感谢,
LRP