全文搜索引擎ES的讀寫刪除過程

1、寫過程

ES一般是分佈式多實例部署,大概寫的過程如下圖:
在這裏插入圖片描述

1、當客戶端發送一條document過來時,會隨機找一個進程,被選中的進程會成爲協調節點;
2、協調節點將這條document路由到指定的節點,然後寫到primary節點上;
3、primary節點寫完就會同步到對應的replic節點;
4、協調節點發現primary和所有replic都處理完成後,就給客戶端返回處理完成;

那麼真正處理數據的shard是如何寫數據的呢?

1、當某個shard被選中處理數據後,首先會把數據寫到buffer中,同時寫入translog日誌,但是這樣的性能會受到影響,所以可以設置每個5秒鐘寫一次到磁盤,這就可能會造成5秒鐘的數據丟失問題;
2、當buffer中的數據不段增多,快滿時或者到一定時間,就會把buffer中的數據寫入一個segment file中,此時就會對該數據建立倒排索引。但是並不是直接寫入到segment file中,而是寫入到os cache中。然後把buffer中的數據刪除。默認每個一秒就會從buffer中寫入到segment file中,一旦數據到達了os chache中就可以對外提供服務,就能搜索到了。這就是refresh過程。
3、當translog不斷變大,超過一定閾值時或者過了30分鐘,就會觸發commit。次操作會把os cache中的數據寫到segment file中,寫完後把translog日誌清空,這就是flush過程。
4、當segment數量不斷增多後,就會執行一次merge(合併)操作,將所有的segment合併爲一個,並把之前在.del中標識爲刪除的數據進行物理刪除,在新合併的segment中就不會出現該數據。

2、查詢過程

1、當客戶端發送一條讀請求過來時,同樣會隨機選擇一個進程,然後將這個進程作爲一個協調節點;
2、該協調節點把請求路由到指定的節點,然後根據路由規則在所有primary和replic shard中選擇一個shard,從中讀取。
3、然後把讀取的內容返回給協調節點; 4、最後協調節點把內容返回給客戶端;

3、搜索過程

1、當客戶端發送一條搜索請求,同樣會隨機選擇一個進程,然後由這個進程作爲協調節點;
2、此時協調節點會在每個進程裏找一個shard,然後把這條請求廣播到選擇的所有shard上; 3、然後每個shard返回符合條件的doc
id返回給協調節點; 4、協調節點聚合(篩選、分頁、排序等)這些結果,然後再跟聚這些doc
id去各個shard去查找具體的document,最終返回給客戶端;

4、刪除過程

1、將刪除數據寫入.del文件。標識該數據已經被刪除。當客戶端搜索某條數據時,當這條數據在.del中時,就不會返回。

如何提高ES性能

1、從上面的分析我們可以看出一個關鍵點,就是cache os(system cache)數據都會緩存在此處,並且我們在操作的時候並不會把裏面的數據刪除。如果給這個cache預留足夠的空間,就可以緩存所有的數據,這樣每次搜索數據就不需要去segment file中去尋找數據,這會很慢,但是如果去cache os能直接查到數據並返回,那麼將大大提升ES的性能。 那如何才能節約cache os這部分的空間呢?當寫數據到ES時就要考慮到最小化數據,當一行數據有30幾個字段,並不需要把所有的數據都寫入到ES,只需要把關鍵的需要檢索的幾列寫入。這樣能夠緩存的數據就會越多。 所以需要控制每臺機器寫入的數據最好小於等於或者略大於cache os空間最好。 如果要搜索海量數據,可以考慮用ES+Hbase架構。用Hbase存儲海量數據,然後ES搜索出doc id後,再去Hbase中根據doc id查詢指定的行數據。

2、數據預熱
當每臺機器寫入的數據大於cache os太多時,導致太多的數據無法放入緩存,那麼就可以把一部分熱點數據刷入緩存中。
3、冷熱分離
把熱數據和冷數據分開,寫入不同的索引裏,然後確保把熱索引數據刷到cache裏。
4、document模型設計
在ES裏最好不要用複雜的關聯表的操作。當需要這樣的場景時,可以在創建索引的時候,就把數據關聯好。比如在mysql中需要根據關聯ID查詢兩張表的關聯數據:select A.name ,B.age from A join B where A.id = B.id,在寫入ES時直接去把相關聯數據放到一個document就好。
5、分頁性能優化
ES分頁存在這樣一個問題:
當我們查找第100頁的10條數據時,會存在這樣的問題。ES回去每個shard去查找1000條數據,然後聚合在一起,最後去取第100頁的10條數據。所以如果你通過ES分頁,翻得頁數越深處理的越慢。
1)不允許深度分頁;
2)scroll api 會獲取index的所有數據的快照,每次翻頁的時候通過遊標移動定位,性能會很快,但是這個API不能跳頁,只能順序翻頁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章