ElasticSearch實戰系列十一: ElasticSearch錯誤問題解決方案

虛無境發表於2021-05-24

前言

本文主要介紹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>

相關文章