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