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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章