ES集羣查詢穩定性優化

如果將 Elasticsearch(ES)作爲線上C端服務的查詢引擎,那麼 search query 的響應時間則至關重要。因爲畢竟面向C端用戶,如果一個搜索請求 1 秒內還未返回,那麼用戶將不可接受。

因此,C端服務對ES的性能穩定性做了許多工程上的優化,比如:

  1. 強制將索引的段文件設置爲1,也即索引中只有一個段文件。
  2. 禁用swap,這在ES官方文檔也有提及:https://www.elastic.co/guide/en/elasticsearch/reference/current/_memory_lock_check.html
    (這篇文章也提到了mlock)
  3. ES 節點啓動時預熱(預加載)

本文介紹,通過 memory lock 鎖住“倒排索引”,避免搜索的核心數據結構被 swap 到磁盤上。
首先看背景:大神的文章:https://blog.mikemccandless.com/2010/07/lucenes-ram-usage-for-searching.html 講了 lucene 在檢索時,若“索引文件”被 swap 到磁盤上,則會存在嚴重的查詢性能問題。
而我們可通過 linux 的 mlock 命令,(參考:https://man7.org/linux/man-pages/man2/mlock.2.html )將“倒排索引”文件 Lock 在內存,保障這些核心數據結構不被 swap out。
那 lock 哪些文件呢?主要有3類:

  1. .tim 文件。這是:詞典/字典/Term:存儲所有的Term的地方,另外在.tim文件中還存儲了該term在.doc、.pos、.pay文件中的偏移量,我們可以快速定位到term關聯的doc鏈表、Pos位置、Payload相關信息。

  2. .tip文件。字典索引/Term索引:爲了加速查找Term在.tim中的位置,需要對字典做索引,Lucene使用FST作爲Term的前綴索引,這個存儲在.tip文件中。

  3. 倒排鏈:倒排鏈存放在.doc文件中,是一系列的有序doc的集合,另外爲了快速做查找和遍歷 .doc中還存儲了跳錶,方便快速定位到doc。

因此,在 ES索引構建成功後,通過 快照 將索引恢復(snapshot restore)到內存後,就可以將這3類文件通過:linux mlock 命令 lock 住,進一步保障在線C端查詢服務依賴的ES 查詢性能更穩定。

具體實現是:基於 ES 插件機制,開發一個 rest-handler 處理插件,該插件接收 mlock 命令,然後通過 JNA 方式調用 libc 函數庫,從而執行 mlock命令,將此 ES節點 的倒排索引文件 lock 住。

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