如何选择最佳机制来删除保存到 mongodb 的日志
how to choose best mechanism for delete logs saved to mongodb
我正在使用 MongoDB 实现一个记录器,我对这个概念还很陌生。
记录器应该记录每个请求及其响应。
我面临使用 mongo 的 TTL 索引或仅使用查询通宵方法的问题。
我认为第一种方法可能会带来一些开销,因为它使用后台线程并可能在每次删除后重建索引,但是,它会在文档过期后立即释放 space,这可能是有益的。
另一方面,第二种方法没有这种开销,但它会在每天结束时释放 space。
在我看来,第二种方法更适合我的情况,因为我的服务器不会刚好处于磁盘空间不足的边缘 space,但它始终是我们需要减少服务器开销的情况。
我想知道我是否遗漏了主题的某些方面,而且我不确定 MongoDB TTL 的应用。
个人意见:
似乎最好每月、每天或每小时收集日志,具体取决于您的应用程序写入负载,并在一天结束时使用自定义脚本删除最旧的集合。根据经验,当您的集合写入负载很重时,TTL 索引无法正常工作,因为它们会根据到期时间添加额外的写入负载。
例如,假设您在 06:00h 插入 100k/sec 的日志事件,并且您的 TTL 索引生命周期设置为 3h,这意味着在 09:00h 3 小时后,您将拥有 100k/秒应用于你的集合的删除也存储在 oplog 中......,在这种情况下的解决方案是添加更多的碎片,但它变得有点昂贵......,更容易的是只删除 exprired 集合......
此外,根据您的项目大小以获得更大的集合以加快搜索速度,您还可以将 pre-split the collections based on compound index 散列日期时间字段(每个日志包含时间戳)与您经常搜索的另一个字段进行分片,这将允许您跨多个分布式分片的可扩展搜索。
另请注意 mongoDB 是通用文档数据库,全文搜索仅限于昂贵的正则表达式,因此如果您需要在日志中进行快速原始全文搜索,请使用一些 inverse index像 elasticsearch 这样的搜索引擎在你的 mongoDB 支持之上,也许是涵盖此功能的一个很好的解决方案。
我正在使用 MongoDB 实现一个记录器,我对这个概念还很陌生。 记录器应该记录每个请求及其响应。 我面临使用 mongo 的 TTL 索引或仅使用查询通宵方法的问题。
我认为第一种方法可能会带来一些开销,因为它使用后台线程并可能在每次删除后重建索引,但是,它会在文档过期后立即释放 space,这可能是有益的。 另一方面,第二种方法没有这种开销,但它会在每天结束时释放 space。
在我看来,第二种方法更适合我的情况,因为我的服务器不会刚好处于磁盘空间不足的边缘 space,但它始终是我们需要减少服务器开销的情况。
我想知道我是否遗漏了主题的某些方面,而且我不确定 MongoDB TTL 的应用。
个人意见:
似乎最好每月、每天或每小时收集日志,具体取决于您的应用程序写入负载,并在一天结束时使用自定义脚本删除最旧的集合。根据经验,当您的集合写入负载很重时,TTL 索引无法正常工作,因为它们会根据到期时间添加额外的写入负载。
例如,假设您在 06:00h 插入 100k/sec 的日志事件,并且您的 TTL 索引生命周期设置为 3h,这意味着在 09:00h 3 小时后,您将拥有 100k/秒应用于你的集合的删除也存储在 oplog 中......,在这种情况下的解决方案是添加更多的碎片,但它变得有点昂贵......,更容易的是只删除 exprired 集合......
此外,根据您的项目大小以获得更大的集合以加快搜索速度,您还可以将 pre-split the collections based on compound index 散列日期时间字段(每个日志包含时间戳)与您经常搜索的另一个字段进行分片,这将允许您跨多个分布式分片的可扩展搜索。
另请注意 mongoDB 是通用文档数据库,全文搜索仅限于昂贵的正则表达式,因此如果您需要在日志中进行快速原始全文搜索,请使用一些 inverse index像 elasticsearch 这样的搜索引擎在你的 mongoDB 支持之上,也许是涵盖此功能的一个很好的解决方案。