【ElasticSearch】ES 讀數據,寫數據與搜索數據的過程


ES讀數據的過程:

  1.ES客戶端選擇一個node發送請求,該請求作為協調節點(coordinating node);

  2.corrdinating node 對 doc id 對哈希,找出該文檔對應所在的shards,將請求轉發到對應的node,

  此時會使用round-robin 隨機輪詢算法,在primary shard 和 replica shard 之中選擇一個 ,實現讀請求的負載均衡;

  3.接受請求的node 返回給document 給coordinate node;

  4.coordinate node 返回document 給客戶端;

 

 

ES寫數據的過程:

  1.ES客戶端選擇一個node發送請求,該請求作為協調節點(coordinating node);

  2.協調節點 對 doc id 對哈希,找出該文檔存放的primary shard,將請求轉發到該shard對應的節點;

  3.節點收到請求,primary shard處理寫入,然后將數據同步到對應的replica shard 所在的節點;

  4.協調節點 發現 主分片和副分片都寫入完成后 返回響應結果給 ES 客戶端;

  

 

 

ES搜索數據的過程:

  1..ES客戶端選擇一個node發送請求,該請求作為協調節點(coordinating node);

  2. 協調節點將請求發送到所有的shard ,包括primary shard 或者是 replica shard

  3. shard 將搜索到的數據 也就是doc id 返回給協調節點

  4. 協調節點根據doc id ,將請求分發到doc id 對應的shard 去獲取完整的document ,然后將數據返回給ES 客戶端

 ES寫數據的底層原理:

  1.shard 收到寫入請求后,寫到內存buffer,同時寫入到translog((每個shard都對應一個translog文件),注意內存buffer里面的數據是搜索不到的

  2.shard 會每隔1秒執行refresh操作,將buffer內的數據刷到os cache級別的緩存中去(這里是文件系統緩存),生成新的segement,buffer內的數據被刷到os cache中,

    buffer被清空,此時,這個數據也能被搜索到了

  3.重復1,2兩個步驟,數據會被寫入到一個一個的os cache 的 segment file 中去,並刷到磁盤中去,但是每次寫入,translog 會越來越大,到達一定長度將會觸發 commit 操作

  commit 操作 

    將buffer內的現有數據refresh 到os cache中,清空buffer,然后將一個commit point 寫入到磁盤中,里面標識這個commit point對應的所有segment file

    同時強行將os cache 里面的數據fsync到磁盤文件中去,最后清空現有的translog文件,重啟一個新的translog文件;

    fsync+清空translog, 操作就是 flush,默認30分鍾執行一次flush,如果translog 文件過大(默認512M)也會觸發flush操作,flush

  注意:os 文件系統中的translog的數據寫到磁盤中 translog文件中 fsync的操作默認每5s 執行一次;

 

 

 

 

參考:

https://blog.csdn.net/wang7075202/article/details/111308905

https://blog.csdn.net/lsgqjh/article/details/83022206

https://www.jianshu.com/p/15837be98ffd

https://blog.csdn.net/wx1528159409/article/details/105973336/

https://blog.csdn.net/u013129944/article/details/93720081

https://developer.51cto.com/art/202009/625293.htm

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM