• elasticsearch集群优化实战


    版本配置:

    ES版本:6.2.4

    OS内存64G。

    一、安装部署:

    1.ES jvm内存31G,预留一半的物理内存给文件系统缓存(file system cache)。

    2.禁止内存交换:

    修改/etc/sysctl.conf 中 vm.swappiness = 1

    elasticsearch.yml中,设置这个:bootstrap.mlockall:true

    3.修改ES启动用户可使用的系统文件句柄数等。

    4.有条件使用更好的硬盘如ssd。

    5.如果有多块盘:

      1)做RAID0或者RAID5,RAID可以提高磁盘IO,但是风险就是一块硬盘故障整个就故障。

      2)每个盘mount到一个目录,data path配置多个。

    6.节点分开部署:master、data、coordinate

    7.冷热分离架构:热数据SSD存储,冷数据普通硬盘存储。

    二、合理的Index Mapping:

    1.特殊字段:如Boolean、IP、时间等。

    2.字符串:尽量使用keyword,默认的text会被analyze。keyword最大32766字节。

    3.调整refresh间隔:refresh_interval: 30s,默认的1秒会导致大量segment产生,影响性能。

    PUT /my_logs/_settings

    { "refresh_interval": "30s" }

    4.调整translog刷新机制为异步:

    "index": {

        "translog": {

            "flush_threshold_size": "512mb",  (默认512M,不建议修改)

            "sync_interval": "30s",  (默认5s,可适当增大)

            "durability": "async"   (默认request,每次更新都会写trans log,修改为异步)

        }

    }

    5.创建新索引时,可以配置每个分片中的Segment的排序方式,index sorting是优化检索性能的非常重要的方式之一:

    {
        "settings" : {
            "index" : {
                "sort.field" : "date", 
                "sort.order" : "desc" 
            }
        },
        "mappings": {
            "properties": {
                "date": {
                    "type": "date"
                }
            }
        }
    }

    三、ES参数调整:

    针对data节点,设置elasticsearch.yml中:

    thread_pool.bulk.queue_size: 1024 (增大)

    indices.fielddata.cache.size: 1gb (默认10%,可适当调小)

    indices.queries.cache.size: 1gb(默认10%,可适当调小)

    indices.memory.index_buffer_size: 15% (默认10%,会影响写入性能,写入的分片数更多,则需要更多的buffer)

    cluster.routing.allocation.disk.include_relocations: false (加快shard分配,在建索引的时候,不考虑迁移的任务)

    熔断circuit-breaker调整(调低,减小OOM风险):

    indices.breaker.total.limit: 50%

    indices.breaker.request.limit: 10%

    indices.breaker.fielddata.limit: 10%

    cluster.routing.allocation.same_shard.host:true

    如果机器具有128 GB的RAM,可以运行两个节点,每个节点配置31GB内存,Lucene将使用剩余64GB内存。如果这样搭建data节点,在配置中设置cluster.routing.allocation.same_shard.host为true。这将阻止主副本分片被分配到同一台物理机,提高可用性。

    四、设置合理的分片数和副本数:

    1.对于数据量较小(100GB以下)的index:一般设置3~5个shard

    2.对于数据量较大(100GB以上)的index:一般把单个shard的数据量控制在20GB~40GB

    3.对于30G内存的节点,shard数量最好控制在600个(即每1GB内存的shard数在20以内)

    4.副本数:一般副本数为1,对数据可用性有高要求的,可以设置为2

    五、索引合并、段合并(Segment Merge)

    1.通过_forcemerge API进行合并,减少segments数量,同时提高查询效率:

    2.max_num_segments取值为:max_num_segments =(单个索引的大小G/分片数/2G)

    3.通过_reindex API将历史小索引合并成大索引,减少索引数和分片数。

    六、时序数据:

    1.合理按天、周、月、年去创建、关闭、删除索引。

    2.索引太多时,索引预创建:每天定时任务把明天需要的索引先创建好。

    3.从6.7版本开始kibana自带索引生命周期管理ILM(Indice Life Management)

    七、写入:

    1.使用批量请求bulk request。

    2.尽量使用自动生成的ID。Elasticsearch自动生成的ID可以确保是唯一的,以避免版本查询。

    3.避免索引大的document数据,如超过100M的一条document。

    4.减少副本数,字段不分词,可增加写入性能。

    八、查询:

    1.尽量使用filter而不是query。使用filter不会计算评分score,只计算匹配。

    2.如果不关心文档返回的顺序,则按_doc排序。

    3.避免通配符查询。

    4.不要获取太大的结果数据集,如果需要大量数据使用scroll API。
    分页查询使用:from+size
    遍历使用:scroll
    并行遍历使用:scroll+slice

    5.合理设置聚合的size:聚合结果是不精确的,聚合的结果是取每个分片的Top size元素后综合排序后的值。尽量不要获取全量聚合结果,从业务层面取TopN聚合结果值是合理的。

    九、节点分片总数

    index.routing.allocation.total_shards_per_node 每个节点允许的单个索引中为分片总数指定硬限制。

    cluster.routing.allocation.total_shards_per_node 限制节点可以拥有的分片数量,而与索引无关。

    例如10个node,  index设置 5 primary + 5 replica。 设置index.routing.allocation.total_shards_per_node:1 可以保证这个索引在每个node上只分配一个shard。  这样设置好处是数据分布最均匀, 但是也有负面影响,比如如果有一个node挂了,就会有一个shard无法分配,变成UNASSIGNED状态。  

    如果设置index.routing.allocation.total_shards_per_node:2 ,则可能数据均衡状态不如设置为1那么理想,但是可以容忍一个node挂掉,因为shard可以再分配到其他node。   这个设置结合shard balancing heuristics做全局调配应该比较理想。

    正常运作情况下,默认ES可能会为每个node分配2个分片,但是在集群索引比较多,并且出现过结点故障引起数据恢复,就可能出现某个索引在某些node上分配3个或更多,有的node完全不分配的情况。  如果配置 index.routing.allocation.total_shards_per_node为2,可以保证故障恢复后,索引在所有节点上分配shard数一定是2.

    十、基于磁盘分片分配

     Elasticsearch可以根据节点磁盘的使用情况来配置分片分配,该配置默认开启 true。

     Elasticsearch使用两个配置参数决定分片是否能存放到某个节点上。

    cluster.routing.allocation.disk.watermark.low:控制磁盘使用的低水位。默认为85%,意味着如果节点磁盘使用超过85%,则ES不允许在分配新的分片。当配置具体的大小如100MB时,表示如果磁盘空间小于100MB不允许分配分片。

    cluster.routing.allocation.disk.watermark.high:控制磁盘使用的高水位。默认为90%,意味着如果磁盘空间使用高于90%时,ES将尝试分配分片到其他节点。

    上述两个配置可以使用API动态更新,ES每隔30s获取一次磁盘的使用信息,该值可以通过cluster.info.update.interval来设置。

  • 相关阅读:
    System path '/Users/hxy/Library/Caches/PyCharm2018.2' is invalid.
    HBase安装指南
    centos6.8下hadoop3.1.1完全分布式安装指南
    PHP服务化搭建之nginx动静分离实战
    Laravel6实现第三方 微信登录
    laravel开发大型电商网站之异常设计思路分析
    Laravel实现大型商城网站之用户注册短信发送项目实战功能开发
    Redis 实现美团的外卖派单系统“附近的人”筛选实战原理分析
    Navicat远程连接MySQL8,必知防坑策略
    laravel大量填充项目测试数据的正确方法
  • 原文地址:https://www.cnblogs.com/chong-zuo3322/p/13447337.html
Copyright © 2020-2023  润新知