【发布时间】:2015-12-15 16:31:40
【问题描述】:
我们使用弹性搜索作为主要数据存储来保存数据,我们的索引策略是基于时间的(例如,我们每 6 小时创建一个索引 - 可配置)。进入我们应用程序的搜索排序查询包含时间范围;并根据输入时间范围计算需要用于搜索数据的索引。
现在,如果输入时间范围很大 - 比如说 6 个月,并且我们将搜索排序查询委托给 elasticsearch,那么 elasticsearch 会将所有文档加载到内存中,这可能会大大增加堆大小(我们有一个限制堆大小)。
处理上述问题的一种方法是在我们的应用程序中按索引获取数据索引并对数据进行排序;索引相应地打开/关闭;例如,始终只打开最近的 4 个索引,其余索引根据需要打开/关闭。我想知道是否有更好的方法来处理手头的问题。
【问题讨论】:
-
您要存储的数据量是多少(磁盘空间和文档数量)?每 6 小时创建一次索引可能是多余的。我们每 24 小时创建一个索引,有些索引的大小达到约 120 GB,包含 1 亿个文档。您的保留期限是多少?看来至少要6个月。此外,仅仅为了获取一些数据而打开和关闭索引应该很少见,关闭索引就像归档它。重新打开已关闭索引的开销很大。我们有 2 年的服务器统计数据,并且从未关闭这些索引。
-
我们的数据大小与您的几乎相同,并且保留期限是可配置的。我们只在需要时才需要打开/关闭旧索引(超过 1 天),否则,elasticsearch 会将所有文档加载到内存中;尤其是在对数据进行排序时。
-
顺便说一句。您可能需要考虑 Elasticsearch 是否足够可靠,可以作为您的主要数据存储。如果您有时不介意丢失数据,那就不用担心。这篇博文详细解释了它的故障模式aphyr.com/posts/323-call-me-maybe-elasticsearch-1-5-0 和 Elasticsearch 维护一个页面,介绍他们正在解决这些问题的工作elastic.co/guide/en/elasticsearch/resiliency/current/index.html
-
您可能需要排序多少个结果?
-
举个例子:时间范围为6个月,需要搜索的索引总数为720,单个索引的文档数为100,000。
标签: elasticsearch