新建單個文檔所需要的步驟順序:
1.客戶端向 Node 1 發送新建、索引或者刪除請求。
2.節點使用文檔的 _id 確定文檔屬于分片 0 。請求會被轉發到 Node 3,因為分片 0 的主分片目前被分配在 Node 3 上。
3.Node 3 在主分片上面執行請求。如果成功了,它將請求并行轉發到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都報告成功, Node 3 將向協調節點報告成功,協調節點向客戶端報告成功。
看下整體的索引流程
協調節點默認使用文檔ID參與計算(也支持通過routing),以便為路由提供合適的分片。
2.當分片所在的節點接收到來自協調節點的請求后,會將請求寫入到Memory Buffer,然后定時(默認是每隔1秒)寫入到Filesystem Cache,這個從Momery Buffer到Filesystem Cache的過程就叫做refresh;
3.當然在某些情況下,存在Momery Buffer和Filesystem Cache的數據可能會丟失,ES是通過translog的機制來保證數據的可靠性的。其實現機制是接收到請求后,同時也會寫入到translog中,當Filesystem cache中的數據寫入到磁盤中時,才會清除掉,這個過程叫做flush。
4.在flush過程中,內存中的緩沖將被清除,內容被寫入一個新段,段的fsync將創建一個新的提交點,并將內容刷新到磁盤,舊的translog將被刪除并開始一個新的translog。flush觸發的時機是定時觸發(默認30分鐘)或者translog變得太大(默認為512M)時。