failed to execute pipeline for a bulk request問(wèn)題
客戶使用場(chǎng)景是使用第三方工具大批量往ES寫入數(shù)據(jù),報(bào)錯(cuò)寫入失敗嫡良,需排查。
已知情況:
當(dāng)前環(huán)境各組件運(yùn)行正常献酗,數(shù)據(jù)由HBase側(cè)不停寫入ES
索引主分片數(shù)10個(gè)寝受,副本1個(gè)
ES HEAP設(shè)置是8GB,JVM內(nèi)存資源較為緊張
問(wèn)題分析:
查報(bào)錯(cuò)日志推斷是寫入側(cè)推送數(shù)據(jù)過(guò)快罕偎,ES處理能力不足導(dǎo)致很澄!
解決辦法:
常規(guī)場(chǎng)景下應(yīng)該下調(diào)往ES推送的數(shù)據(jù)大小或頻率。
增大ES的內(nèi)存,現(xiàn)場(chǎng)距離ES內(nèi)存峰值30GB仍有很大空間甩苛。
考慮線程池過(guò)小導(dǎo)致蹂楣,參考后面章節(jié)。
實(shí)際處理:
略微下調(diào)主分片個(gè)數(shù)使其均勻分布(10 -> 8)浪藻,將索引的副本數(shù)從1減為0捐迫,相當(dāng)于寫入壓力減少一半,至此現(xiàn)場(chǎng)問(wèn)題解決爱葵,沒再出現(xiàn)上述報(bào)錯(cuò)施戴。
磁盤I/O異常引起的問(wèn)題修復(fù)
用戶在例行巡檢過(guò)程發(fā)現(xiàn)es有data節(jié)點(diǎn)處于停止?fàn)顟B(tài),進(jìn)行啟動(dòng)后萌丈,頁(yè)面進(jìn)度條顯示綠色已完成赞哗,但實(shí)際進(jìn)程啟動(dòng)失敗了。
問(wèn)題排查與處理:
-
排查節(jié)點(diǎn)日志辆雾,發(fā)現(xiàn)不能訪問(wèn)數(shù)據(jù)路徑肪笋,報(bào)錯(cuò)關(guān)鍵內(nèi)容如下:
Unable to access ‘path.data’ (/mnt/elasticsearch/slave/data)……
-
檢查掛載磁盤,使用命令
df -Th
或lsblk -f
發(fā)現(xiàn)磁盤沒有占滿度迂,使用容量還有剩余很多藤乙,文件系統(tǒng)為
xfs
。 cd到數(shù)據(jù)路徑惭墓,沒有報(bào)錯(cuò)坛梁,但ls有報(bào)錯(cuò):ls: cannot open directory Input/output error。據(jù)此懷疑磁盤或文件系統(tǒng)故障腊凶。我們先排除文件系統(tǒng)故障划咐。
此時(shí)設(shè)備已經(jīng)處于不可用狀態(tài),先嘗試重啟機(jī)器(reboot)-> 就這樣解決了钧萍。
如果重啟沒有解決褐缠,依然是Input/output error,那么嘗試進(jìn)行文件系統(tǒng)修復(fù)操作如下:
從【2】中獲取到要修復(fù)的掛載點(diǎn)风瘦,如
/dev/sdb
xfs的文件系統(tǒng)队魏,使用如下命令進(jìn)行修復(fù):
xfs_repair /dev/sdb
正常的話要提示“設(shè)備或資源忙”,"couldn't initialize XFS library",需要先取消掛載
umount /dev/sdb
繼續(xù)執(zhí)行修復(fù):
xfs_repair /dev/sdb -L
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 3
- agno = 4
- agno = 2
- agno = 5
- 【注:有剪輯省略內(nèi)容】
Phase 5 - rebuild AG headers and trees...
- reset superblock...
Phase 6 - check inode connectivity...
- resetting contents of realtime bitmap and summary inodes
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done
- 修復(fù)完成后再把磁盤掛上万搔,即可生效:
mount /dev/sdb /mnt/elasticsearch/data
器躏。經(jīng)實(shí)測(cè),數(shù)據(jù)沒有丟失蟹略,也就是不會(huì)使情況更糟——要么修好了登失,要么修不好保持原樣。
p.s:這個(gè)問(wèn)題不是ES自身引起的挖炬,而是外界干擾揽浙,不要浪費(fèi)太多時(shí)間去處理。如果修復(fù)失敗,報(bào)修硬件馅巷。
http請(qǐng)求長(zhǎng)度超過(guò)限制
最近(22年10月)接用戶反饋膛虫,使用ES查詢的索引表越來(lái)越多了,出現(xiàn)“400 Bad Request”
問(wèn)題描述:
ElasticSearch exception:too_long_frame_exception钓猬,reason:An HTTP line is larger than 4096 bytes稍刀。
ElasticsearchStatusException[Elasticsearch exception [type=too_long_frame_exception, reason=An HTTP line is larger than 4096 bytes.]]
at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:177)
at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:526)
解決辦法:
官網(wǎng)有如下3個(gè)參數(shù)控制請(qǐng)求大小:
需在elasticserach.yml
中設(shè)置ES參數(shù)(http.max_initial_line_length
默認(rèn)4kb敞曹,具體大小根據(jù)自己實(shí)際情況設(shè)置):
http.max_initial_line_length: 8k
http.max_header_size: 16k
http.max_content_length: 500mb
如果有集群管理账月,從集群頁(yè)面的自定義配置中添加,保存澳迫,最后重啟ES集群局齿。
ES的線程池設(shè)置
ElasticSearch開箱即用,在生產(chǎn)環(huán)境一般不需要對(duì)參數(shù)進(jìn)行特別調(diào)優(yōu)橄登,但在某些特殊抓歼、極端場(chǎng)景下(如壓測(cè))則需要對(duì)ES各項(xiàng)服務(wù)線程池進(jìn)行設(shè)置。
問(wèn):什么時(shí)候才需要調(diào)整這些參數(shù)拢锹?
答:除了剛才提到的壓測(cè)情境谣妻,在遇到相關(guān)報(bào)錯(cuò)時(shí),根據(jù)日志提示調(diào)整卒稳。
通過(guò)curl -XGET 'http://localhost:9200/_nodes/stats?pretty' 接口觀察thread_pool
部分的統(tǒng)計(jì)拌禾,關(guān)注rejected
的值,elasticsearch將拒絕請(qǐng)求(bulk HTTP狀態(tài)碼429)的次數(shù)累加到rejected
中展哭。
問(wèn):怎么調(diào)整這些參數(shù)?
答:2.x版本可API動(dòng)態(tài)設(shè)置闻蛀,在ES 5版本之后就不能動(dòng)態(tài)設(shè)置這些參數(shù)了匪傍,通過(guò)修改ES主配置文件,然后重啟ES生效觉痛。("reason": "transient setting thread_pool.write.queue_size, not dynamically updateable")
問(wèn):最佳實(shí)踐是什么役衡?
答:非必要不調(diào)整,獨(dú)占時(shí)最大化薪棒。
參考:
thread_pool.write.size:cpu核數(shù)+1
thread_pool.search.size: (最大cpu核數(shù)*3/2+1)
thread_pool.write.queue_size: 1000
thread_pool.search.queue_size: 1000
ES的雙網(wǎng)分離設(shè)置
如果在生產(chǎn)環(huán)境配置了管理網(wǎng)和業(yè)務(wù)網(wǎng)分離(一般分別是千兆網(wǎng)和萬(wàn)兆網(wǎng))手蝎,怎么設(shè)置ES比較合理?
ES關(guān)于網(wǎng)絡(luò)的配置參數(shù)豐富繁雜(它們都不是可動(dòng)態(tài)更新的)俐芯,ES雙網(wǎng)分離場(chǎng)景的最佳實(shí)踐是ES集群內(nèi)部采用萬(wàn)兆-業(yè)務(wù)網(wǎng)棵介,對(duì)外服務(wù)則雙網(wǎng)都通,有管理及合規(guī)要求時(shí)按照要求設(shè)置單一網(wǎng)絡(luò)吧史。
實(shí)踐舉例:
到elasticsearch.yml
中進(jìn)行修改邮辽,首先注釋掉network.host
配置。
http.host是傳入 HTTP 請(qǐng)求綁定到的端口;transport.host是要綁定用于節(jié)點(diǎn)之間通信的端口吨述。
# elasticsearch.yml中增加
http.host: 0.0.0.0
transport.host: 192,168.1.23
# transport.host填寫節(jié)點(diǎn)的實(shí)際萬(wàn)兆ip岩睁,http.host固定0.0.0.0,也可修改為指定ip