前言
技術的發展日新月異,傳統企業數據庫Oracle、SqlServer、DB2,Mysql等在今日不斷的被各種大廠自研數據庫取代,當然也有類似Elasticsearch等優秀的滿足海量數據所使用的開源數據庫。
我司多個日志審計與態勢感知項目中,也沒有免俗,選擇了Elasticsearch作為我們的日志存儲與搜索引擎。關於Elasticsearch基礎知識就不做更多介紹了,隨便搜索下,有大量的介紹和使用文檔。
本文主要介紹我們在多個項目中,使用Elasticsearch過程中,各種填坑記錄。
在具體的生產環境中,我相信大家不會用Windows作為Elasticsearch的運行服務器的,所以下文基本都是以Linux(Centos7)為主要的運行環境。
以下內容,僅供參考,實際遇到的問題,都需要在運維過程中,去仔細分析,查閱文檔。解決問題的方法可能很簡單,關鍵是能准確的定位問題,分析問題。
-
安裝
Elasticsearch安裝就不多闡述了,主要記住:創建非root用戶,修改linux系統參數,修改jvm運行參數,修改Elasticsearch運行參數,這4個主要部分。
由於Elasticsearch版本迭代比較快,不同的版本個別參數可能已經變更或廢棄,所以修改前一定要認真閱讀對應版本的官方文檔,該參數是否還有效,這個地方是一個坑,需要重點注意。
-
運行與系統調優
Elasticsearch的安裝其實還是比較簡單的,但是在實際運行中,各種各樣的問題就來了。在實際運行中出現的問題,其實主要還是數據量的問題,隨着數據量的增長,就會出現各種資源問題,需要隨時解決和調優。
1.內存問題
官方建議Elasticsearch每個節點jvm配置內存不要大於系統總內存的一半同時不要大於32G。
Elasticsearch本身在運行過程中,隨着數據量的增加,內存的使用會越來越多,gc回收會越來越慢,最終導致Elasticsearch雖然活着,但不響應任何請求。
這種情況下,擴充節點是個選項,但是大多數的情況,預算是固定的,硬件資源也是固定的,只能采取其他辦法。
-
數據要根據業務做成多索引的方式,因為每個索引都是占用內存的,多索引才有可能關閉部分歷史數據索引,釋放內存。最好做成定時任務,按照規則關閉不用的索引。
-
定時對索引進行合並(merge segment)
-
jvm垃圾回收機制可以考慮配置為 UseG1GC
-
即使按照官方說明配置成32G以下,比如31G,在短時間數據量暴增的情況下,容易帶來linux oom問題,如果存在這種情況,建議再配置小一點。
2.文件句柄問題
linux中,所有的一切都與文件有關,實時打開的文件句柄數是有限制的,Elasticsearch可以看着是基於文件的數據庫,隨着數據量的增加,打開的句柄越來越多,就會導致系統停止對外響應,比如ssh登錄不上去等問題。
這種情況,首先建議調整linux內核參數,修改系統打開的最大文件句柄數量。
其次還是要控制索引的數量,不要無限制的增長下去,想辦法控制同時打開的文件句柄數量。
3.硬盤問題
硬盤當然是讀寫速度越快越好,數據量比較大的環境可以考慮冷熱數據分離。
需要注意的是當Elasticsearch數據所在的硬盤空間使用超過80%以上時,就可能出現數據不再寫入該節點的情況,所以需要定時監測硬盤使用量。
另外,不太建議使用通過網絡掛載的硬盤空間。
總的來說硬盤有關的問題相對少點,就不多說了。
4.其他問題
以下的問題,可能是在特定的環境下,特定的版本上出現的。
運行環境,vmware+centos7.4 , kernel 3.x,3個ES節點,各64G內存。
問題1:3個節點中,有2個數據節點頻繁宕機,kernel異常日志提示watchdog: BUG: soft lockup - CPU#5 stuck for 23s! [java:5783]。
各種搜索,建議升級內核版本,大於4.13.0-1017。
辛辛苦苦給2個節點升級內核,具體方法,自行百度,升級內核的坑就不多說了。
問題2:升級內核后,問題1基本解決,但是在短時間數據流暴增的情況下,出現OOM問題。
分析原因,應該還是jvm內存設置為31G,es索引底層索引內存請求加上jvm內存請求可能超出系統總物理內存(畢竟還有其他程序也要占用內存),導致OOM問題。解決辦法,jvm內存適當調小一點。
當然也可以調整內核參數,取消OOM特性(不建議在生產環境使用)。
問題3:最郁悶的情況,解決完上述兩個問題后,系統平均10多分鍾就宕機一次,系統日志無報錯,只在vcenter控制台上,提示kernel BUG at drivers/net/vmxnet3/vmxnet3_drv.c:1441!。繼續搜索,發現這是vmware的一個bug,在特定情況下出現:
Linux VM is running kernel >= 4.8
HW version of VM is >=13
ESXi version is 6.5
解決辦法:
修改虛擬機vmx配置文件,添加vmxnet3.rev.30 = FALSE
或者 設置ethtool -G ethX rx-mini 0,ethX為網卡名稱