美文网首页玩转大数据Java
ElasticSearch 节点角色和优化措施

ElasticSearch 节点角色和优化措施

作者: AlienPaul | 来源:发表于2022-07-12 10:30 被阅读0次

    ES的节点角色

    • Master Node. node.master 设置为true。可以参与竞选成为master节点。
    • Data Node. node.data 设置为true。负责存储数据和处理数据相关的操作。
    • Ingest Node. node.ingest 设置为true。负责在文档被索引之前转换和扩展文档。
    • Tribe node. 使用tribe.* 属性配置。它是一种特殊的coordinating node。负责连接多个集群和处理多集群间的操作。

    默认情况节点的node.masternode.datatrue

    对于小规模的ElasticSearch集群,我们可以采用默认设置,每个ElasticSearch节点都可以客串各种角色。但是对于较大规模的集群,建议为不同的节点设置专门的角色。

    Coordinating node

    Coordinating node负责处理用户的请求。

    用户请求分为两个阶段:分发阶段(scatter phase)和收集阶段(gather phase)。

    在分发阶段,coordinating node把请求发送至各个数据节点。每个数据节点在本地处理请求并把结果返回给coordinating node。

    在收集阶段,coordinating node把结果reduce成为一个全局的结果集。

    每个node默认均为coordinating node。如果把node.master node.data node.ingest都设置为false,则该节点只有协调的功能。协调节点需要有足够的CPU和内存资源,用来收集各个数据节点返回的内容。

    可以通过如下方法,设置节点仅有协调功能:

    node.master: false
    node.data: false
    node.ingest: false
    cluster.remote.connect: false

    Master eligible node

    Master eligible node为可被选举为master的节点。同一时刻同一集群内,只有一个master eligible node被选举成为master node。Master node负责创建和删除index,追踪集群节点状态,决定哪个分片分配到哪个节点。

    Master node 必须有访问数据目录的权限。节点重启时集群状态会存储在这里。

    设置节点为专门的master节点:

    node.master: true
    node.data: false
    node.ingest: false
    cluster.remote.connect: false

    使用minimum_master_nodes避免脑裂

    把discovery.zen.minimum_master_nodes 的值设置为

    (master_eligible_nodes / 2) + 1

    Ingest Node

    Ingest node即预处理节点。我们可以在ES集群中定义pipeline,在数据被index前进行一些转换等预处理操作。Ingest node是专门执行预处理操作的节点。

    设置专门的ingest node:

    node.master: false
    node.data: false
    node.ingest: true
    cluster.remote.connect: false

    数据节点

    负责存放数据和处理数据。

    设置专门的数据节点:

    node.master: false
    node.data: true
    node.ingest: false
    cluster.remote.connect: false

    设置数据目录

    在配置文件中指定:

    path.data: /path/to/data

    或者在启动时加入:

    ./bin/elasticsearch -Epath.data=/var/elasticsearch/data

    node.max_local_storage_nodes

    在开发环境同一台机器启动多个节点,各个节点的数据是共享的。

    默认来说es不允许用户这么做。需要将node.max_local_storage_nodes设置为更大的值。

    ES优化

    优化index设计

    https://www.ebayinc.com/stories/blogs/tech/elasticsearch-performance-tuning-practice-at-ebay/

    • 如果字段值可枚举,并且需要根据该字段filter查询,建议把数据分割为多个index。比如数据按照区域来划分。
    • 如果字段值不可枚举,并且需要根据该字段filter查询,建议使用routing。

    https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html

    • 对于日志和监控类数据,可以按照时间维度把数据group成indices,方便查找和过期数据的清除。
    • 显式设置字段映射。
    • 避免shard倾斜(使用自定义ID或routing时)。
    • 使各个节点shard分布均匀。

    调校index性能

    • 使用批量查询
    • 使用多线程发送请求
    • 增加刷新间隔时间。优点:减少创建和合并索引的消耗,增加吞吐量减小延迟。缺点:文档必须在刷新之后才能被检索到。
    • 减少副本数量。优点:加快索引速度。缺点:搜索性能会下降。
    • 尽量使用自动生成的ID

    调校搜索性能

    • 尽可能使用filter查询而不是query。 filter不需要计算score。filter结果可以被缓存。
    • 增加刷新时间间隔。
    • 增加副本数量。
    • 尝试使用不同的shard数量。shard数量过少会导致数据集中在个别节点上,搜索操作性能耗费过于集中。shard数量过多会不利于性能。ES会在所有shard上执行查询,除非用户指定routing。
    • 使用节点查询缓存。只有filter才会使用节点缓存。如果节点包含10000或更多的documents(或总documents数的3%),会启用query缓存。
    • 使用shard缓存。size设置为0。使用同样的payload JSON,因为shard缓存使用JSON作为cache key。把时间四舍五入。
    • 仅查询需要的字段。使用stored_fields。
    • 避免搜索stop word。例如a, the等。
    • 如果不关心排序,按照_doc排序。ES默认按照_score字段排序。
    • 避免查询时使用script进行实时计算。最好索引时把计算值存入字段。
    • 避免使用通配符查询。

    _routing(路由)字段

    官方文档

    https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html#mapping-routing-field

    基本概念

    路由字段用来指定document会被存入哪一个分片。分片编号的计算公式为:

    shard_num = hash(_routing) % num_primary_shards

    默认来说,文档的_id字段会被用为_routing

    使用routing

    储存数据

    curl -X PUT "localhost:9200/my_index/_doc/1?routing=user1&refresh=true" -H 'Content-Type: application/json' -d'
    {
      "title": "This is a document"
    }
    '
    

    获取数据

    curl -X GET "localhost:9200/my_index/_doc/1?routing=user1"
    

    查询时也可以根据_routing的值进行查询。

    curl -X GET "localhost:9200/my_index/_search?routing=user1,user2" -H 'Content-Type: application/json' -d'
    {
      "query": {
        "match": {
          "title": "document"
        }
      }
    }
    '
    

    查询时指定_routing为user1和user2

    设置routing值为必填

    curl -X PUT "localhost:9200/my_index2" -H 'Content-Type: application/json' -d'
    {
      "mappings": {
        "_doc": {
          "_routing": {
            "required": true 
          }
        }
      }
    }
    '
    // 不设置routing的值,插入数据会报错
    curl -X PUT "localhost:9200/my_index2/_doc/1" -H 'Content-Type: application/json' -d'
    {
      "text": "No routing value provided"
    }
    '
    

    避免routing导致的数据倾斜的问题

    通过配置index.routing_partition_size,使routing的值用来决定一组shards而不是一个shards。

    shard 编号的计算方式为:

    shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards

    相关文章

      网友评论

        本文标题:ElasticSearch 节点角色和优化措施

        本文链接:https://www.haomeiwen.com/subject/aloobrtx.html