1

我正在开发日志管理系统,用户将能够从文件上传日志。我有“事件”集合,我存储来自所有源的所有事件(每个源可以有不同的日志格式,在一个集合中我可以有例如 10 000 000 条记录 - 'source1' 有 5 000 000 条,'source2' 有 5 000 000 条)。我想为用户提供过滤选项(过滤选项将仅适用于源,因此用户可以按级别、数据等过滤数据)并且为了获得更好的性能,我想创建索引和复合索引。在用户将日志上传到系统之前,他/她将决定在过滤期间要使用哪些过滤器查询。所以我可以有不同的查询。问题是我可以在一个集合中有许多不同的源,这意味着许多不同的过滤器查询,但 mongoDB 每个集合只允许 64 个索引。

那么,如果我想要具有良好的读取性能并且我想让用户过滤日志(用户将决定在将日志上传到系统之前如何过滤数据),那么最好的解决方案是什么?我正在考虑为每个源创建新集合,因为每个集合我永远不会达到 64 个索引。

查询示例:

db.events.ensureIndex({"source_id": 1, "timestamp" : 1})
db.events.ensureIndex({"source_id": 1, "timestamp" : 1, "level": 1})
db.events.ensureIndex({"source_id": 1, "diagnostic_context": 1})
db.events.ensureIndex({"source_id": 1, "timestamp" : 1, "statusCode": 1})
db.events.ensureIndex({"source_id": 1, "host" : 1}) 

事件收集示例:

{   _id: ObjectId("507f1f77bcf86cd799439011"),
    timestamp: ISODate("2012-09-27T03:42:10Z"),
    thread: "[http-8080-3]",
    level: "INFO",
    diagnostic_context: "User 99999",
    message: "existing customer saving"},
    source_id: "source1"
{   _id: ObjectId("507f1f77bcf86cd799439012"),
    host: "144.18.39.44",
    timestamp: ISODate("2012-09-01T03:42:10Z"),
    request: "GET /resources.html HTTP/1.1",
    statusCode: 200
    bytes_sent: 3458,
    url: "http://www.aivosto.com/",
    agent: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    source_id: "source2"
}
4

0 回答 0