一. 數據預加載
Elasticsearch在啓動時會打開並讀取硬盤上的部分index segment文件,並緩存數據至內存中,後續的搜索操作都會在內存中進行。如果待搜索的數據不在內存中,則會打開相應的index segment文件,並讀取數據至內存。這種預加載的做法有助於提高Elasticsearch對外提供服務的響應速度,畢竟減少了打開index semgent的IO操作次數。
有兩種方案能設置預加載中需要打開的segment文件:
- 【全局配置】 在config/elasticsearch.yml中添加index.store.preload,這是一個數組,裏面存放了需要預加載的文件的後綴。後綴的類別和含義如下:
- nvd: 該文件中存儲了影響相關度分數的因素。
- dvd: 存儲了文檔的數據。
- tim: 文檔字典。
- doc: 發佈清單
- dim: 點數據
支持通配符*,如果寫成["*"],則可以將所有的數據全部緩存到內存。
index.store.preload: ["nvd", "dvd"]
- 【局部配置】在創建index時,指定該index需要預加載的文件。注意,不得在創建完index後更新(新增)index.store.preload,否則報錯:
Can’t update non dynamic settings… index.store.preload屬於靜態配置。
PUT /my_index
{
"settings": {
"index.store.preload": ["nvd", "dvd"]
}
}
有些人嚐到甜頭後,打算在預加載時儘可能的把熱門數據放到內存中,但值得注意的是,數據預加載也有其缺陷。如果預加載的數據量過大,比如幾乎佔滿了服務器分配給Elasticsearch的最大堆內存,而後續進行冷門數據搜索時,搜索的內容恰好不在內存中,則不得不從Disk上打開index segment,此時爲了避免內存溢出,ES會丟棄一部分舊的數據,斷開部分index_segement文件的IO流,騰出空間存儲新的數據,那麼熱門數據就丟失了。而熱門數據的查詢概率比冷門數據大得多,導致後續搜索數據時,需要進行更多的IO操作,這樣反而得不償失。
二. 緩存
Elasticsearch的緩存主要分成三類: Node Query Cache, Shard Query Cache, Fielddata Cache。 尚未寫完…