我正在开发一个解决方案,在Elastic Search中为许多开发团队中的许多应用程序存储应用程序日志。每个日志条目的结构与“app”字段相同,以指示应用程序。
#1目标是支持在单个“app”中进行高效查询。查询所有应用程序虽然仍然很重要,但仍然是次要的。
我正在努力确定什么是最好的:
编辑:在这两种情况下,我都会使用基于时间的索引。
多重索引系列
每个“app”都有一系列基于时间的索引(app1-2017-04-01,app1-2017-04-02,...等)。用户可以直接对这些较小的索引执行搜索。这里的想法是,由于索引的大小较小,可能查询它们更快?
单一索引系列
使用一个巨大的索引系列来表示所有应用程序日志(例如logs-2017-04-01,logs-2017-04-02,...等)用户将查询“app”字段以缩小搜索结果范围。
在这种情况下哪个更快?我很好奇其他索引的间接成本
答案 0 :(得分:15)
在大多数情况下,多个索引更好:
答案 1 :(得分:6)
我会提供假设的指导,因为你选择忽略我的问题的答案。
当涉及到日志记录用例(基于时间的索引)时,必须掌握有关未来计划的一些数据:您希望保留记录数据的时间长度(保留期),用法是什么收集数据的模式(查询频率,索引频率),每天将有多少数据(这里指的是磁盘上的数据,也就是碎片大小)。在考虑“每应用程序索引”或“单索引”问题之前,请考虑以下建议。在对分片大小进行数学计算,选择保留期的数量后,您可以考虑每个应用程序或单个索引。
特别是根据碎片大小和保留期限,需要考虑基于时间的索引是每日,每周还是每月。对于分片大小的一个很好的经验法则是最大30-50GB,高于此值的所有内容都可以进行任何恢复,分片重定位,搜索可能更慢并且可能影响群集稳定性。
如果您的应用程序能够每天生成大量数据,而这些数据将超过上述数量,则不应选择为每个应用程序生成索引。如果尺寸较小,那么它又取决于。一个节点上的大量分片正在浪费资源并且会使搜索速度变慢。每个分片都有一组固定的内存,只是因为它存在而被使用。此外,在执行搜索时,每个分片将通过一个线程执行其搜索。一个线程基本上一个CPU核心。搜索中使用的时间跨度越大(搜索的索引越多),发生的并发搜索次数越多,尝试使用CPU核心的多个线程之间的操作系统级别的上下文切换越高。总而言之,不要试图在单个节点中挤出数百个分片,除非在任何给定时间只使用其中一些分片。如果您计划在大多数时间查询群集中的所有数据,那么您希望在每个节点上拥有的分片数量会大幅缩减。否则,您的群集将无法跟上负载。
如果您的日志记录用例是大多数对最新数据(过去几天到一周)的活动较高的用例,请考虑采用热门架构的方法:{{3} }
构建和配置群集的练习总是涉及测试。那么,请尝试在尽可能与现实数据相同的数据上测试查询的性能。此外,在具有生产群集中节点的硬件规格的一个节点上执行此操作。
答案 2 :(得分:3)
就性能而言,使用大指数比使用几个小指数更好,正如您可以在文章指数与类型上看到的 Adrien Grand 。
索引存储在一组分片中,这些分片本身就是Lucene 指数。这已经让您了解使用新的限制 一直都是索引:Lucene索引的开销很小而且固定 磁盘空间,内存使用和使用的文件描述符。为了那个原因 原因是,单个大指数比几个小指数更有效 指数:Lucene指数的固定成本更好地摊销 很多文件。
我的建议是对所有应用程序使用一个基于时间的索引,其中每个应用程序都是索引的不同类型。在搜索每个应用程序日志时,它将使您更容易,并且在同时搜索所有应用程序时非常简单。
例如:
如果您只想在一个应用中搜索,可以使用:
http://yourserver:9200/logs-2017-04-01/app1/_search
对于所有应用程序:
http://yourserver:9200/logs-2017-04-01/_search
评估的另一个好处是每个应用程序可以具有不同数量的日志条目。这样,如果每个应用程序都有一个不同的索引,那么在为每个应用程序调整碎片大小时会非常困难。因此,在调整群集大小时,只使用一个索引会使您更容易。如果索引太大,只需将其拆分为更多分片。