我的配置:
4臺(tái)服務(wù)器組成的Elasticsearch集群纽匙,每臺(tái)服務(wù)器只作為一個(gè)節(jié)點(diǎn)。
其中有兩臺(tái)數(shù)據(jù)節(jié)點(diǎn)
一臺(tái)客戶端節(jié)點(diǎn)
一臺(tái)主節(jié)點(diǎn)
內(nèi)存均為64G
啟動(dòng)命令:
docker run -d \
--name=espn-50 \
-p 9200:9200 \
-p 9300:9300 \
-v \
/var/espn/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v \
/var/espn/data:/usr/share/elasticsearch/data elasticsearch:5.6.3
4臺(tái)節(jié)點(diǎn)啟動(dòng)命令是一樣的拍谐,暴露9200 9300端口烛缔,并掛載elasticsearch.yml及數(shù)據(jù)目錄。
模擬了3個(gè)月數(shù)據(jù)轩拨,每天一個(gè)索引践瓷,索引數(shù)量90,每個(gè)索引有200W~300W條數(shù)據(jù)不等亡蓉。
隨著數(shù)據(jù)量增加晕翠,發(fā)現(xiàn)服務(wù)器CPU占用過多(沒錯(cuò),那兩臺(tái)數(shù)據(jù)節(jié)點(diǎn))
查看這兩臺(tái)數(shù)據(jù)節(jié)點(diǎn)的elasticsearch日志:
[gc][1779997] overhead, spent [45.2s] collecting in the last [45.8s] //這行日志若干行寸宵,就數(shù)字不一樣
再去查詢節(jié)點(diǎn)情況:
curl 'localhost:9200/_cat/nodes?v=pretty'
發(fā)現(xiàn)數(shù)據(jù)節(jié)點(diǎn)的 heap.percent 百分之99崖面。
通過查詢資料,我總結(jié)出來大概是這樣的:
- ES本身是Java項(xiàng)目梯影,既然是Java項(xiàng)目巫员,必然是運(yùn)行在JVM上的,現(xiàn)在堆內(nèi)存已滿甲棍。
- 堆內(nèi)存已滿简识,Elasticsearch正在嘗試GC,然而每次GC又打不到釋放的效果,因此不斷的在GC七扰,不斷的使用CPU奢赂,因此CPU使用嚴(yán)重。
- 索引數(shù)量比較多颈走,而ES采用的倒排索引和segment這種機(jī)制膳灶,使得在比較多的索引而且索引數(shù)據(jù)必須要使用的情況下,必須調(diào)整JVM立由,也就是對(duì)JVM進(jìn)行優(yōu)化轧钓。
- ES默認(rèn)的Heap太小,一般用來做大數(shù)據(jù)存儲(chǔ)是不夠的锐膜,大概率是要手動(dòng)調(diào)整的(2.X 版本默認(rèn)1G毕箍,5.6.3是2G)
查了一圈網(wǎng)上的資料,包括官網(wǎng)道盏,發(fā)現(xiàn)一個(gè)蛋疼的事實(shí):
不同版本的ES調(diào)整JVM的方法都不太一樣而柑。
我使用的是 Elasticsearch5.6.3 ,再次強(qiáng)調(diào)一下這一點(diǎn)。
解決的方法很簡(jiǎn)單荷逞,在elasticsearch的config文件夾下媒咳,改寫jvm.options文件即可。(5.6.3的docker容器中沒有這個(gè)文件颅围,我新寫了一個(gè)文件掛載到容器內(nèi)也是生效的)
jvm.options:
-Xms10g
-Xmx10g
不熟悉的話可以學(xué)習(xí)一下JVM的相關(guān)知識(shí)伟葫。
啟動(dòng)指令:
docker run -d \
--name=espn-50 \
-p 9200:9200 \
-p 9300:9300 \
-v \
/var/espn/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v \
/var/espn/config/jvm.options:/usr/share/elasticsearch/config/jvm.options \
-v \
/var/espn/data:/usr/share/elasticsearch/data elasticsearch:5.6.3
將jvm.options也掛載到docker容器內(nèi)。注意院促,jvm.options的權(quán)限應(yīng)該是可讀可寫可執(zhí)行的筏养。