document寫入原理(buffer、segment、commit、segment merge)
es為了實現搜尋的近實時,也是做了很多的設定。結合了記憶體buffer、os cache、disk三種儲存,盡可能的提公升搜尋能力。那麼在document寫入index的時候,就有其獨特的寫流程。
es的底層是使用lucene實現的。在lucene中乙個index是分為若干個segment(分段)的,每個segment都會存放index中的部分資料。在es中,是將乙個index先分解成若干shard,在shard中,使用若干segment來儲存具體的資料。
具體的寫入流程檢視下圖:其中數字僅是標識,不代表絕對順序流程。
**:1:客戶端發起增刪改請求,將請求傳送到es中。
2:es將本次請求中要操作的document寫入到buffer中。es為了保證搜尋的近實時(nrt),設定了每秒重新整理一次buffer的預設操作。buffer的自動重新整理時間可以手工修改,也可以通過命令觸發buffer的重新整理。
post /test_index/_refresh
put test_index
}3:es在將document寫入到buffer的同時,也會將本次操作的具體內容寫入到translog file中,這個日誌檔案記錄的是es的所有操作過程。其存在的意義在於保證es異常宕機也盡可能少的丟失資料。(很難保證絕對的資料不丟失)。translog檔案是在磁碟中的,es會保持乙個長io,對應這個translog檔案。提高訪問效率。
4:es每秒中都會重新整理buffer,將buffer中的資料儲存到index segment中,這個segment也是乙個file檔案。在剛建立這個檔案的時候,檔案是儲存在記憶體中的。segment中儲存的是最近1秒鐘es接收到的document寫運算元據。
5:在index segment file建立並寫入資料後,es會立刻將segment file寫入到系統快取(os cache)中,在寫入後,index segment立刻被開啟,可以為客戶端的搜尋請求提供服務。不必等待index segment寫入到磁碟後再開啟index segment,因為寫入磁碟的操作是乙個io操作,我們都知道io操作是乙個重量級操作,如果等待index segment寫入磁碟後再開啟為搜尋請求提供服務,那麼es就失去了近實時搜尋的能力。當index segment寫入os cache後,buffer中的資料就會清空。
6:translog file記錄的是es的操作過程,萬一es宕機,當重啟後,es會讀取系統磁碟中的資料和translog中的日誌,實現乙個資料的恢復。保證資料盡可能不丟失。translog檔案也是持久化在系統磁碟中的,es預設每5秒鐘執行一次translog檔案的持久化。如果在持久化的時候剛好有document寫操作在執行,那麼這次持久化操作會等待寫操作徹底完成後才執行。如果允許部分資料丟失的話,可以通過設定修改translog的持久化為非同步操作。
put test_index
}7:隨著時間的推移,translog檔案會不斷增大。當translog檔案大到一定程度的時候或一定時間後,es會觸發commit操作。commit操作具體內容有:將buffer中的資料重新整理到乙個新的index segment中,將index segment寫入到os cache中並開啟index segment為搜尋提供服務;清空buffer;執行乙個commit point操作,將os cache中所有的index segment標識記錄在這個commit point中並持久化到系統磁碟disk中;這些commit point中記錄的index segment會被es觸發的fsync持久化到disk中;清空本次持久化的index segment對應的translog檔案中的日誌內容。這個完整的操作也稱為flush。這個操作預設每30分鐘執行或translog檔案過大時執行。
8:按照之前的所有流程來看,每秒中都會生成乙個index segment檔案。每30分鐘都會將這些index segment檔案持久化到磁碟中,那麼磁碟中的index segment檔案數量會非常多,會影響搜尋的效率。es會自動的執行segment merge操作。merge的時候,被標記為deleted狀態的document也會被物理刪除。merge的流程是:es選擇一些大小相近的segment檔案,merge成乙個大的segment檔案;將merge後的segment檔案持久化到磁碟中;執行乙個commit操作,commit point除記錄要持久化的os cache中的index segment外,還記錄了merge後的segment檔案和要刪除的原segment檔案;commit操作執行成功後,將merge後的segment開啟為搜尋提供服務,將舊的segment關閉並刪除。
es中的的search搜尋,執行的時候具體的資料所在位置可能在多個位置,如: index segment 1、 index segment 2。search執行的時候,會檢索所有已開啟的index segment。
注意:在es中,index中的document資料執行刪除和更新操作都不是即時的物理刪除,都是先標記為deleted狀態,當es空閒時或儲存空間不足時,一次性刪除deleted狀態的document。所以,在執行刪除或更新操作的時候,會先將運算元據寫入到buffer中,在buffer資料寫入segment中的時候,會生成乙個.del檔案,用於記錄哪乙個index segment中的哪乙個document是deleted狀態的,那麼在搜尋執行的時候,如果在多個index segment中查詢到了多個不同版本的同id值的document時,會依據.del檔案中的資料來過濾查詢結果,保證搜尋結果是正確的。
說一下Docker 一
對於提高伺服器的效能,支援輕量級的虛擬,實現開發測試上線的高度一致,團隊開發環境的協調統一,docker表現得極為出色。在功能上,我們將docker理解為乙個超輕量級的虛擬機器,它比vmware占用的資源少很多,執行速度快很多,因為它們的底層實現技術完全不同。docker就像乙個模具,我們能在作業系...
說一下Path類
在檔案io中,經常要處理一些與檔案路徑或檔名有關的東西,說白了,非常類似字串的處理,我個人理解,處理路徑資訊,可以等同於特殊字串的處理 不過,用字串的處理方式去處理檔案路徑問題,有些複雜,net的system.io命名空間中,提供了乙個path類,以及一系列靜態方法,可以用來處理常見的有關檔案路徑的...
說一下Path類
在檔案io中,經常要處理一些與檔案路徑或檔名有關的東西,說白了,非常類似字串的處理,我個人理解,處理路徑資訊,可以等同於特殊字串的處理 不過,用字串的處理方式去處理檔案路徑問題,有些複雜,net的system.io命名空間中,提供了乙個path類,以及一系列靜態方法,可以用來處理常見的有關檔案路徑的...