2009-07-28 76 views
5

我正在erlang编写一个bittorrent跟踪器。考虑到服务的性质,我不需要绝对的一致性(即客户可以完全满意于稍微过时的对等列表或流量状态)。最终与erlang一致的mnesia数据库。最佳做法?

到目前为止,我的策略是在启用了disc_copies的RAM中创建mnesia表,以便mnesia在日志大小超过特定大小时自动将内存转储到磁盘。

如果服务器崩溃,某些信息将会丢失。没什么大不了的。

另一种方法是将实例两个表(仅一个ram和一个磁盘)并且每分钟都有一个从ram到disk的进程副本。这更加幼稚,但可以转储内存中的部分内容,减少整体磁盘开销,并可能完全避免使用日志(实际上我对此最后一条语句不太确定)。

我相信还有很多其他的方法来做到这一点。你的是啥呢?

-TeO

回答

2

您可能想结算redis & erldis。 Redis采取第二种方法:所有内容都存储在内存中,然后定期转储到磁盘。

1

这当然与您的原始问题无关,但如果您真的在编写纯粹的跟踪器,那么最好完全放弃持久性,并将数据保存在内存中。

对于一个最小的跟踪器来说,一个公告的权重只有几个字节:SHA1哈希为16字节,对端的IP和端口为6字节,还有一些字节,你需要保留一个时间戳为好。但即使有一点开销,你也可以从字面上将数百万条记录保存在内存中。

+1

目前宣布和洪流数据存储在仅存储器mnesia表(我仍然保持光盘复制禁用),这当然是非常快。坚持使用磁盘会使服务对系统故障更有弹性(即使考虑到BitTorrent隐性弹性)并随时间保持最小的洪流相关信息(完成下载的数量)。 (http://mcaprari.github.com/peasy-torrent-tracker/) – 2009-08-06 08:33:06