2014-10-06 59 views
0

有一个MongoDB有我想研究的有趣数据。不幸的是,由于尺寸问题,每48小时一次,数据库就会被清除“旧”记录。拦截或过滤来自MongoDB的oplog事务

我创建一个副本与具有优先级0和表决0,以便不与主数据库性能干扰次级数据库系统的设置。这可以很好地工作,因为我可以查询辅助数据并获取我的数据。但是,在很多情况下,我的系统无法及时处理所有记录,并且如果我在48小时内未找到它们,将会丢失一些旧记录。

有没有一种方法,我可以高速缓存的另一个系统,然后我就可以处理我的休闲,可能过滤掉删除,直到我准备在OPLOG?

我考虑过slavedelay参数,但这会影响所有交易。我还将Tungsten Replicate作为解决方案进行了研究,以便实际上可以缓存oplog,但是,它们不支持MongoDB作为数据源。

是纯文本格式存储在次级,这样我可以阅读和提取我从中得到想要的OPLOG。

这个任何指针将是有益的,不幸的是我无法找到MongoDB的网站上OPLOG多文档。

回答

1

MongoDB的OPLOG存储为所谓的“oplog.rs”在你的本地数据库封顶集合:

use local 
db.oplog.rs.find() 

如果你想存储在OPLOG供以后使用更旧的数据,你可以试着加大该集合的大小。请参阅http://docs.mongodb.org/manual/tutorial/change-oplog-size/

或者,您可以将oplog.rs重新创建为不加限制的集合(尽管不建议这样做,因为您必须全面清理oplog)。按照相同的步骤上面增加规模,但重新创建OPLOG时,使用此命令

db.runCommand({ create: "oplog.rs", capped: false}) 

另一种解决方案是创建一个具有以下命令转储OPLOG到该文件夹​​YYYYMMDD一个cron作业:

mongodump --db local --collection oplog.rs -o $(date +%Y%m%d) 

希望有帮助。

0

我想知道为什么你会这样做手动。做到这一点的“典型”方法是确定记录的生命周期或到期日期。如果是一辈子,你会做某物像

db.collection.insert({'foo':'bar' [...], created: ISODate("2014-10-06T09:00:05Z")}) 

db.collection.ensureIndex({'created':1},{expireAfterSeconds:172800}) 

通过这样做,一个叫TTLMonitor线程将唤醒每分钟,并删除其中有一个创建场是所有文件两天以上。

如果你对每个文档一个固定的到期日,你基本上做的是相同的:

db.collection.insert({'foo':'bar' [...], expirationDate: ISODate("2100-01-01T00:00:00Z"}) 

db.collection.ensureIndex({expirationDate:1},{expireAfterSeconds:0}) 

这将清除文档后TTLMonitor的第一次运行expirationDate

你可以调整expireAfterSeconds的值,安全地让您处理记录被清除之前,保持整体尺寸在可接受的需求,并确保即使应用程序的清除工作过程中出现故障,记录被删除。 (更不用说你不需要自己维护清除逻辑了)。

这样说和希望它可能对你有用,我认为你的问题是一个概念。

你有缩放问题。您的系统无法处理峰值,因此偶尔无法及时处理所有数据。而不是摆弄MongoDB的内部(这可能是相当危险的,正如@chianh正确指出的那样),你应该通过确定你的瓶颈并根据你的峰值来调整瓶颈。

+0

感谢Markus,您提供的信息很有趣。在我的情况下,我不拥有这些数据,我需要轻轻一点。我会建议他们使用到期方式作为替代方案。至于我的系统,我可以非常快速地获取他们的数据,但它正在开发中,可能会有很多中断,因此我将在后面运行并且不想错过任何数据。 – 2014-10-06 18:42:32