ElasticSearch數(shù)據(jù)讀寫流程
ElasticSearch寫入數(shù)據(jù)
客戶端選擇一個Node發(fā)送請求過去,這個node就成為coordinating node(協(xié)調(diào)節(jié)點(diǎn))
coordinating node對 document進(jìn)行路由,將請求轉(zhuǎn)發(fā)到對應(yīng)的node(有primary shard) 3.實際的node上的primary shard處理請求,然后將數(shù)據(jù)同步到replica node
-
coordinating node 發(fā)現(xiàn) pimary node 和 replica node都處理完畢后,就返回響應(yīng)結(jié)果給客戶端
hp
ElasticSearch讀取數(shù)據(jù)
根據(jù)文檔id進(jìn)行路由到對應(yīng)的節(jié)點(diǎn)機(jī)器上(相當(dāng)于請求轉(zhuǎn)發(fā))
客戶端發(fā)送請求到任意一個 node,成為
coordinate node。coordinate node對doc id進(jìn)行路由,將請求轉(zhuǎn)發(fā)到對應(yīng)的 node,實際集群中可能該數(shù)據(jù)對應(yīng)的shard有多個(主、備),根據(jù)負(fù)載輪詢策略在對應(yīng)的shard上進(jìn)行數(shù)據(jù)的讀取。接收請求的 node 返回 document 給
coordinate node。coordinate node返回 document 給客戶端。
索引數(shù)據(jù)過程
核心就是兩個階段 query和fetch
客戶端連接到 任一節(jié)點(diǎn)(
coordinate node)。協(xié)調(diào)節(jié)點(diǎn)將搜索請求轉(zhuǎn)發(fā)到所有的 shard 對應(yīng)的
primary shard或replica shard,都可以。query phase:每個 shard 將自己的搜索結(jié)果(其實就是一些
doc id)返回給協(xié)調(diào)節(jié)點(diǎn),由協(xié)調(diào)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的合并、排序、分頁等操作,產(chǎn)出最終結(jié)果。fetch phase:接著由協(xié)調(diào)節(jié)點(diǎn)根據(jù)
doc id去各個節(jié)點(diǎn)上拉取實際的document數(shù)據(jù),最終返回給客戶端。
刪除更新索引
如果是刪除操作,commit 的時候會生成一個
.del文件,里面將某個 doc 標(biāo)識為deleted狀態(tài),那么搜索的時候根據(jù).del文件就知道這個 doc 是否被刪除了。
如果是更新操作,就是將原來的 doc 標(biāo)識為 deleted 狀態(tài),然后新寫入一條數(shù)據(jù)。
buffer 每次 refresh 一次,就會產(chǎn)生一個 segment file,所以默認(rèn)情況下是 1 秒鐘一個 segment file,這樣下來 segment file 會越來越多,此時會定期執(zhí)行 merge。每次 merge 的時候,會將多個 segment file 合并成一個,同時這里會將標(biāo)識為 deleted 的 doc 給物理刪除掉,然后將新的 segment file 寫入磁盤,這里會寫一個 commit point,標(biāo)識所有新的 segment file,然后打開 segment file 供搜索使用,同時刪除舊的 segment file。
