ES5.5.0查询不稳定情况分析及解决方案

问题描述

  1. 根据关键字查询数据时,前一次能查到,再次查询时可能查不到(出现在数据刚写入情形下)
  2. 使用通用查询接口时,查询条数不稳定(出现在数据刚写入情形下)

总结:数据消费写入到ES后,经过一个刷新周期(大量数据时一般为30s或60s),数据被批量处理生成segment及其索引前缀,对外可以被查询到,但此时查询会出现查询不稳定情况,一般不超过1分钟就可以稳定下来。

原因分析

elasticsearch的索引分片有主分片和副本两种属性,副本的功能为故障转移及负载均衡。

故障转移:主分片所在主机或节点出现故障时,副本自动升级为主分片。

负载均衡:主分片和副本对外都提供相同的查询能力。

数据写入时则先写到主分片上,再由主分片同步到对应的索引分片上。若在此期间进行多次查询,es会进行负载均衡,随机选择主分片或副本执行查询任务,而此时副本上尚未有数据,就会出现查询不稳定情况。

解决方案

ES提供了偏好查询模式preference,在5.5版本中有以下参数:

  • _primary 只在主分片上查询
  • _primary_first 优先在主分片上查询,若主分片不可用或查询失败则在副本上查询
  • _replica 只在副本上查询
  • _replica_first 优先在副本上查询,若副本不可用或查询失败则在主分片上查询
  • _local 若本地分片可用,优先在本地分片上执行查询
  • _prefer_nodes:abc,xyz 优先在指定id的节点上查询
  • _shards:2,3 优先在指定id的分片上查询
  • _only_nodes 限定在特定的node上执行操作
  • Custom (string) value

大多数时候是不需要可以刻意使用preference功能。

按照当前的数据场景,可以使用primary_first或replica_first来解决查询不稳定情况,但会增加集群的查询压力,不能使用负载均衡功能。

猜你喜欢

转载自blog.csdn.net/yml_try/article/details/108647525