前言
本文主要介紹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"=>"cluster_block_exception", "reason"=>"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 => { "[host][name]" => "host" }
# }
mutate {
rename => { "host" => "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實戰系列一: ElasticSearch叢集+Kinaba安裝教程
- ElasticSearch實戰系列二: ElasticSearch的DSL語句使用教程---圖文詳解
- ElasticSearch實戰系列三: ElasticSearch的JAVA API使用教程
- ElasticSearch實戰系列四: ElasticSearch理論知識介紹
- ElasticSearch實戰系列五: ElasticSearch的聚合查詢基礎使用教程之度量(Metric)聚合
- ElasticSearch實戰系列六: Logstash快速入門
- ElasticSearch實戰系列七: Logstash實戰使用-圖文講解
- ElasticSearch實戰系列八: Filebeat快速入門和使用---圖文詳解
- ElasticSearch實戰系列九: ELK日誌系統介紹和安裝
- ElasticSearch實戰系列十: 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>