别再说你不会 ElasticSearch 调优了,都给你整理好了( 二 )


第二部分-调优搜索速度
filesystem cache越大越好
为了使得搜索速度更快,es严重依赖filesystem cache
一般来说,需要至少一半的 可用内存 作为filesystem cache,这样es可以在物理内存中 保有 索引的热点区域(hot regions of the index)
用更好的硬件
搜索一般是I/O bound的,此时,你需要
a.为filesystem cache分配更多的内存
b.使用SSD硬盘
c.使用local storage(不要使用NFS、SMB 等remote filesystem)
d.亚马逊的 弹性块存储(Elastic Block Storage)也是极好的,当然,和local storage比起来,它还是要慢点
如果你的搜索是 CPU-bound,买好的CPU吧
文档模型(document modeling)
文档需要使用合适的类型,从而使得 search-time operations 消耗更少的资源 。咋作呢?
答:避免 join操作 。具体是指
a.nested 会使得查询慢 好几倍
b.parent-child关系 更是使得查询慢几百倍
如果 无需join 能解决问题,则查询速度会快很多
预索引 数据
根据“搜索数据最常用的方式”来最优化索引数据的方式
举个例子:
所有文档都有price字段,大部分query 在 fixed ranges 上运行 range aggregation 。你可以把给定范围的数据 预先索引下 。然后,使用 terms aggregation
Mappings(能用 keyword 最好了)
数字类型的数据,并不意味着一定非得使用numeric类型的字段 。
一般来说,存储标识符的 字段(书号ISBN、或来自数据库的 标识一条记录的 数字),使用keyword更好(integer,long 不好哦,亲)
6.避免运行脚本
一般来说,脚本应该避免 。如果他们是绝对需要的,你应该使用painless和expressions引擎 。
搜索rounded 日期
日期字段上使用now,一般来说不会被缓存 。但,rounded date则可以利用上query cache rounded到分钟等
强制merge只读的index
只读的index可以从“merge成 一个单独的 大segment”中收益
预热 全局序数(global ordinals)
全局序数 用于 在 keyword字段上 运行 terms aggregations
es不知道 哪些fields 将 用于/不用于 term aggregation,因此 全局序数 在需要时才加载进内存,但,可以在mapping type上,定义 eager_global_ordinals==true,这样,refresh时就会加载 全局序数
预热 filesystem cache
机器重启时,filesystem cache就被清空 。OS将index的热点区域(hot regions of the index)加载进filesystem cache是需要花费一段时间的 。
设置 index.store.preload 可以告知OS 这些文件需要提早加载进入内存
11使用索引排序来加速连接
索引排序对于以较慢的索引为代价来加快连接速度非常有用 。在索引分类文档中阅读更多关于它的信息 。
12.使用preference来优化高速缓存利用率
有多个缓存可以帮助提高搜索性能,例如文件系统缓存,请求缓存或查询缓存 。然而,所有这些缓存都维护在节点级别,这意味着如果连续运行两次相同的请求,则有一个或多个副本,并使用循环(默认路由算法),那么这两个请求将转到不同的分片副本,阻止节点级别的缓存帮助 。
由于搜索应用程序的用户一个接一个地运行类似的请求是常见的,例如为了分析索引的较窄的子集,使用标识当前用户或会话的优选值可以帮助优化高速缓存的使用 。
13.副本可能有助于吞吐量,但不会一直存在
除了提高弹性外,副本可以帮助提高吞吐量 。例如,如果您有单个分片索引和三个节点,则需要将副本数设置为2,以便共有3个分片副本,以便使用所有节点 。
现在假设你有一个2-shards索引和两个节点 。在一种情况下,副本的数量是0,这意味着每个节点拥有一个分片 。在第二种情况下,副本的数量是1,这意味着每个节点都有两个碎片 。哪个设置在搜索性能方面表现最好?通常情况下,每个节点的碎片数少的设置将会更好 。原因在于它将可用文件系统缓存的份额提高到了每个碎片,而文件系统缓存可能是Elasticsearch的1号性能因子 。同时,要注意,没有副本的设置在发生单个节点故障的情况下会出现故障,因此在吞吐量和可用性之间进行权衡 。
那么复制品的数量是多少?如果您有一个具有num_nodes节点的群集,那么num_primaries总共是主分片,如果您希望能够一次处理max_failures节点故障,那么正确的副本数是max(max_failures,ceil(num_nodes / num_primaries) - 1) 。
14.打开自适应副本选择
当存在多个数据副本时,elasticsearch可以使用一组称为自适应副本选择的标准,根据包含分片的每个副本的节点的响应时间,服务时间和队列大小来选择数据的最佳副本 。这可以提高查询吞吐量并减少搜索量大的应用程序的延迟 。


推荐阅读