zoukankan      html  css  js  c++  java
  • ElasticSearch实战系列十一: ElasticSearch错误问题解决方案

    前言

    本文主要介绍ElasticSearch在使用过程中出现的各种问题解决思路和办法。

    ElasticSearch环境安装问题

    1,max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    原因: 内存限制太小了!
    解决办法: 修改最大内存限制!

    修改sysctl.conf文件

    vim /etc/sysctl.conf
    

    在末尾增加如下配置:

    vm.max_map_count = 655360
    vm.swappiness=1
    

    然后保存退出,输入以下命令使其生效

       sysctl -p
    

    使用命令查看:

    tail -3 /etc/sysctl.conf
    

    图片示例:
    在这里插入图片描述

    2,max number of threads [2048] for user [elastic] is too low, increase to at least [4096]

    原因: 线程数限制太少了!
    解决办法: 修改最大线程数限制!

    修改90-nproc.conf文件

      vim /etc/security/limits.d/90-nproc.conf 
    

    注:不同的linux服务器90-nproc.conf可能文件名不一样,建议先在/etc/security/limits.d/查看文件名确认之后再来进行更改。

    将下述的内容

        soft nproc 2048
    

    修改为

      soft nproc 4096
    

    使用命令查看:

    tail -3 /etc/security/limits.d/90-nproc.conf
    

    在这里插入图片描述

    3, max file descriptors [65535] for elasticsearch process likely too low, increase to at least [65536]

    原因: 打开文件个数太少了!
    解决办法: 修改最打开文件个数!

    修改limits.conf

    vim /etc/security/limits.conf
    

    在末尾添加如下内容:

       * hard nofile 65536
       * soft nofile 65536
       elastic soft memlock unlimited
       elastic hard memlock unlimited
    

    在这里插入图片描述

    4,ERROR:bootstrap checks failed

    原因:未锁定内存。
    解决办法:在报错机器上的elasticsearch.yml配置文件中添加bootstrap.memory_lock: true配置!

    ElasticSearch使用问题

    1,ES查询下标数过大

    原因: index * pagesiz 大于ES默认的返回最大的值 1w,所以提示异常!

    解决办法:

    一、可以通过url设置,方便快捷不用重启。如下:

    curl -XPUT http://127.0.0.1:9200/book/_settings -d '{ "index" : { "max_result_window" : 200000000}}'
    

    注意:

    • 1.size的大小不能超过index.max_result_window这个参数的设置,默认为10,000。
    • 2.需要搜索分页,可以通过from size组合来进行。from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10

    二、通过配置文件设置:

    { "order": 1, "template": "index_template*", "settings": { "index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647 }
    

    2,ES的分片未进行分配

    1、定位问题分片

    使用ES的cat API可以分析出未分配的分片信息及未分配的原因

    curl -XGETlocalhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason| grepUNASSIGNED
    

    命令返回信息包括索引名称、分片编号、是主分片还是副本分片、未分配原因等

    如果是已删除索引的分片,可以直接使用删除命令删除索引:

    curl -XDELETE 'localhost:9200/index_name/'
    

    2、集群有目的的延迟分配

    当某个节点脱离集群,主节点会暂时的延迟重分配分片,以减少重新平衡分片带来的资源浪费,这种情况下,如果源节点在一定时间(默认1分钟)内重新加入,可以恢复分片信息。这种情况的日志信息如下:

    [TIMESTAMP][INFO][cluster.routing] [MASTER NODE NAME]delaying allocation for [54] unassigned shards, next check in [1m]
    

    可以手动修改延迟时间:

    curl -XPUT'localhost:9200/<index_name>/_settings' -d '
    {
        "settings": {
         "index.unassigned.node_left.delayed_timeout": "30s"
        }
    }'
     
    

    如果需要修改所有索引的阀值,则可以使用_all替换<index_name>

    3、分片数目过多,而节点数不足

    主节点不会将主分片和副本分片分配至同一个节点,同样,也不会将两个副本节点分配到同一个节点,所以当没有足够的节点分配分片时,会出现未分配的状态;为了避免该种情况发生,节点数和副本数的关系应该为N>=R+1 (其中N为节点数,R为副本数量。
    解决这个问题可以通过增加节点或者减少副本数量。

    4、需要对分片进行重分配

    分片重分配默认是开启的,但是可能因为某些原因关闭了重分配但是忘记开启了,开启后,分片被重分配。

    开启重分配命令:

    curl -XPUT 'localhost:9200/_cluster/settings'-d
    '{ "transient":
      {"cluster.routing.allocation.enable" : "all" 
      }
    }'
    

    5、集群中分片数据已不存在

    数据在集群中已不存在,处理方法:

    • 1,恢复存有0分片的源节点,并加入到集群中(不强制重新分配主分片)
    • 2,使用Reroute API强制重分配分片
    curl -XPOST'localhost:9200/_cluster/reroute' -d '{ "commands" :
      [ { "allocate_empty_primary" : 
          { "index" :"constant-updates", "shard" : 0, "node":"<node_name>", "accept_data_loss": "true" }
      }]
    }'
     
    
    • 3,从原始数据重建索引或者从备份快照中恢复

    6、磁盘空间不足

    一般情况下,当磁盘利用率达到85%时,主节点将不再分配分片至该节点上
    可以使用如下命令查看磁盘利用率:

    curl -s 'localhost:9200/_cat/allocation?v'
    

    如果磁盘空间比较大,而85%利用率有些浪费,可以通过设cluster.routing.allocation.disk.watermark.low
    和(或)cluster.routing.allocation.disk.watermark.high来增加该值:

    curl -XPUT 'localhost:9200/_cluster/settings'-d
    '{
        "transient": {  
         "cluster.routing.allocation.disk.watermark.low":"90%"    
        }
    }'
    

    注:如果需要集群重启有效,可将transient改为persistent;ES设置中百分比多指已使用空间,字节值多指未使用空间

    7、多版本问题

    ES集群中存在多版本ES,导致不兼容问题

    3,ES索引库的状态只可读

    原因: ES索引库写入的数据的时候出现

    retrying failed action with response code: 403 ({"type"=&gt;"cluster_block_exception", "reason"=&gt;"block
    

    异常。

    原因: 可能是因为该服务的磁盘快满了,因此ES集群修改了这些索引库的状态,让其只读,无法写入。
    根本解决办法,增加磁盘或者清理磁盘无用的数据。

    临时方法,修改器状态为可读。

    PUT /_all/_settings
    {
    "index.blocks.read_only_allow_delete": null
    }
    

    4,ES集群出现红色的情况

    首先进行查看集群的具体情况,使用 GET /_cluster/health 命令查看集群的健康状态。
    如果出现的是unassigned shards,说明缺失了分片,可以使用GET /_cat/shards查看分片的状态并且找到缺失的分片。
    如果是因为集群宕机问题而导致的主分片缺失,可以增加节点并且进行自动分片的话一般情况下是可以解决!
    如果是因为数据缺失的话,也就是主副分片都丢失了,那么这种情况下的数据是无法恢复的,可以根据情况进行选择,若是重要索引库的数据,可以使用reindex将数据重新迁移,可以解决集群red的情况,但是缺少的数据是无法找回的。
    如果是不重要的索引库,那么删除该索引库重建即可。

    5,ES集群GC回收失败

    解决办法: 1.升级JDK的版本,JDK的版本高于1.8_145;
    2.减少GC回收频率。

    6, 脑裂

    master not discovered or elected yet, an election requires a node with id
    

    解决办法:
    1.指定master节点,es7.x配置,
    2.删除原有data的数据,清空从来

    es7.x配置示例:

    cluster.name: pancm
    node.name: node-3
    network.host: 192.168.8.160
    node.master: false
    node.data: true
    discovery.seed_hosts: ["192.168.9.238","192.168.8.181","192.168.8.160"]
    #指定主节点
    cluster.initial_master_nodes: ["192.168.9.238"]
    network.tcp.keep_alive: true
    network.tcp.no_delay: true
    transport.tcp.compress: true
    cluster.routing.allocation.cluster_concurrent_rebalance: 16
    cluster.routing.allocation.node_concurrent_recoveries: 16
    cluster.routing.allocation.node_initial_primaries_recoveries: 16
    path.data: /home/elastic/masternode/data
    path.logs: /home/elastic/masternode/logs
    

    Logstash使用问题

    1,logstash: Could not execute action: PipelineAction::Create
    , action_result: false

    解决办法: 斜杆用“/”

    2, logstash: object mapping for [host] tried to parse field [host] as object, but found a concrete value

    解决办法: 在filter里面添加:

      #mutate {
     #   rename =&gt; { "[host][name]" =&gt; "host" }
     # }
    mutate {
          rename =&gt; { "host" =&gt; "host.name" }
        }
    

    ElasticSearch的Java代码问题

    1..ES7.x版本查询报错:

    org.elasticsearch.action.search.SearchRequest.isCcsMinimizeRoundtrips()Z
    

    解决办法: 缺失jar包,完整的pom配置如下:

    <dependency>
       <groupid>org.elasticsearch.client</groupid>
       <artifactid>elasticsearch-rest-high-level-client</artifactid>
       <version>7.3.2</version>
       <exclusions>
          <exclusion>
             <groupid>org.elasticsearch</groupid>
             <artifactid>elasticsearch</artifactid>
          </exclusion>
          <exclusion>
             <groupid>org.elasticsearch.client</groupid>
             <artifactid>elasticsearch-rest-client</artifactid>
          </exclusion>
       </exclusions>
    </dependency>
    <dependency>
       <groupid>org.elasticsearch</groupid>
       <artifactid>elasticsearch</artifactid>
       <version>7.3.2</version>
    </dependency>
    
    <dependency>
       <groupid>org.elasticsearch.client</groupid>
       <artifactid>elasticsearch-rest-client</artifactid>
       <version>7.3.2</version>
    </dependency>
    

    其他

    参考:
    https://blog.csdn.net/laoyang360/article/details/78443006
    https://blog.csdn.net/u013673976/article/details/53305898
    https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/
    https://blog.csdn.net/kezhen/article/details/79379512

    ElasticSearch实战系列:

    原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!
    版权声明:
    作者:虚无境
    博客园出处:http://www.cnblogs.com/xuwujing
    CSDN出处:http://blog.csdn.net/qazwsxpcm
    掘金出处:https://juejin.im/user/5ae45d5bf265da0b8a6761e4    
    个人博客出处:http://www.panchengming.com</node_name></index_name></index_name>

    如果你对生活感觉到了绝望,请不要气馁。因为这样只会让你更加绝望! 所谓的希望往往都是在绝望中萌发的,所以,请不要放弃希望!
  • 相关阅读:
    skyline(TEP,TerraGate) Fly文件的BS部署系列(2)SFS把shapefile发布WFS服务
    skyline TerraGate 1060 Could not start service Terrain Service 的解决方法
    skyline TerraBuilder(TB)处理不规则范围影像,去除空值,填充高程等
    skyline(TEP,TerraGate) Fly文件的BS部署系列(1)MPT部署
    北京2008奥运会吉祥物福娃大家庭
    网站进度条完美解决方案
    北京2008年奥运会体育图标
    很汗颜的linux第一篇
    dyld:Library not loaded
    如果一个按钮被覆盖如何响应?
  • 原文地址:https://www.cnblogs.com/xuwujing/p/14806392.html
Copyright © 2011-2022 走看看