ES 的"近实时"(near real-time)是指当你往 ES 索引(Index)中插入、更新或删除文档时,这些变更几乎立刻就对用户可见和可查询。然而,它并不是真正的实时,因为 ES 采用了一些优化和缓冲机制,以提高性能和吞吐量。
具体来说,ES的近实时性质包括以下几个方面:
索引操作的延迟: 当我们执行索引操作(插入、更新、删除文档)时,ES会将这些操作存储在一个缓冲区(buffer)中。这意味着虽然变更几乎立刻对用户可见,但实际上它们可能并没有立刻写入硬盘。ES会定期将缓冲区中的操作批量写入磁盘,这个操作可能会有少量延迟。
刷新机制: ES会定期执行一个操作叫做"刷新"。这个操作会确保在硬盘上的所有操作都被提交(committed),并且使这些变更对搜索可见。默认情况下,ES每秒执行一次刷新操作。这意味着,在某些情况下,你可能需要等待一秒钟才能搜索到最新的变更。
搜索的近实时性: ES的搜索操作通常是近实时的,因为它们可以立即反映已经被索引的文档。在上述刷新操作执行前,搜索仍然可以进行,但不能保证最新的变更已经被搜索到。
不过,我们也可以配置ES的近实时性,包括刷新频率等,以满足你的具体需求。近实时性是ES在维护高性能和数据一致性之间的一种权衡,允许我们根据应用的要求进行调整。在许多情况下,ES的近实时性对于大多数应用已经足够,但在某些特定应用中,可能需要更高的实时性。
以下是一些影响ES近实时性的主要配置项:
刷新间隔(Refresh Interval): 刷新是将在内存中的索引数据写入磁盘,从而使变更对搜索可见的过程。我们可以配置刷新的间隔时间,通常以毫秒为单位。默认情况下,ES每秒执行一次刷新,其含义就是一秒内的变更最多需要等待一秒才能被搜索到。我们可以通过修改index.refresh_interval
来调整刷新的频率。[官方文档地址]
索引的刷新策略: ES支持不同的索引刷新策略,包括手动刷新、自动刷新和index.refresh_interval
。手动刷新需要显式地调用_refresh
API [官方文档地址]。自动刷新是在上述配置的刷新间隔内自动执行。我们可以根据应用的需求选择合适的刷新策略。
索引排序: 当你索引文档时,ES会自动对文档进行排序以提高搜索性能。这种排序也会影响近实时性,因为排序后的文档更容易被检索。你可以使用sort
属性来配置索引排序的字段。[官方文档地址]
注意:更频繁的刷新会增加磁盘和CPU的负担,而较长的刷新间隔可能导致搜索的实时性下降。在性能和实时性之间需要找到平衡点,以满足你的应用需求。
让我们每天进步一点点,感谢您的阅读。别忘了点赞、收藏和关注~