Bootstrap

使用elasticsearch查询数据时返回的数据不稳定,时多时少,有时甚至没有

在使用es做数据查询的时候出现的这个问题,将这个坑的点记录下。

在es中,有集群,节点和分片,出现上述错误,查询出来的数据不稳定的主要原因就是分片的问题,以下为一些概念:

集群:
    ES节点:运行的ES实例
    ES集群由若干节点组成,这些节点在同一个网络内,cluster-name相同
节点:
    master节点:集群中的一个节点会被选为master节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集 群或从集群删除节点。master节点无需参与文档层面的变更和搜索,这意味着仅有一个master节点并不会因流量增长而成为 瓶颈。任意一个节点都可以成为 master 节点
    data节点:持有数据和倒排索引。默认情况下,每个节点都可以通过设定配置文件elasticsearch.yml中的node.data属性为 true(默认)成为数据节点。如果需要一个专门的主节点,应将其node.data属性设置为false
    Client节点:如果将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡 的角色,将到来的请求路由到集群中的各个节点
分片:

    (1)单个节点由于物理机硬件限制,存储的文档是有限的,如果一个索引包含海量文档,则不能在单个节点存储。ES提供分 片机制,同一个索引可以存储在不同分片(数据容器)中,这些分片又可以存储在集群中不同节点上

    (2)分片分为 主分片(primary shard) 以及 从分片(replica shard) 

    (3)主分片与从分片关系:从分片只是主分片的一个副本,它用于提供数据的冗余副本 

    (4)从分片应用:在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求 

    (5)是否可变:索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变 

    (6)索引默认创建的分片:默认设置5个主分片和一组从分片(即每个主分片有一个从分片对应),但是从分片没有被启用(主从分片在同一个节点上没有意义),因此集群健康值显示为黄色(yellow)

Preferenceedit

Controls a preference of which shard replicas to execute the search request on. By default, the operation is randomized between the shard replicas.

The preference is a query string parameter which can be set to:

_primary

The operation will go and be executed only on the primary shards.

_primary_first

The operation will go and be executed on the primary shard, and if not available (failover), will execute on other shards.

_replica

The operation will go and be executed only on a replica shard.

_replica_first

The operation will go and be executed only on a replica shard, and if not available (failover), will execute on other shards.

_local

The operation will prefer to be executed on a local allocated shard if possible.

_only_node:xyz

Restricts the search to execute only on a node with the provided node id (xyz in this case).

_prefer_node:xyz

Prefers execution on the node with the provided node id (xyz in this case) if applicable.

_shards:2,3

Restricts the operation to the specified shards. (2 and 3 in this case). This preference can be combined with other preferences but it has to appear first: _shards:2,3;_primary

_only_nodes

Restricts the operation to nodes specified in node specification https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster.html

Custom (string) value

A custom value will be used to guarantee that the same shards will be used for the same custom value. This can help with "jumping values" when hitting different shards in different refresh states. A sample value can be something like the web session id, or the user name.

因此,解决此问题的方法就是在查询时加上“preference=_primary_first ”。

在java代码中的写法:

SearchRequest searchRequest = new SearchRequest(elasticSearchConfiguration.getPoIndex()).types(elasticSearchConfiguration.getPoIndexType()).preference("_primary_first");

使用可视化工具在kinaba中的查询,在search后面加入指定的分片位置

GET po_data_index_test/po_data_type/_search?preference=_primary_first 
{
    "from": 0,
    "size": 10
}



参考文章:https://blog.csdn.net/zengqingzhou007/article/details/80405362

参考文章:https://www.elastic.co/guide/en/elasticsearch/reference/2.3/search-request-preference.html

;