目錄
mongDB
read
write
ES
read
write
MySql
write
總結
mongDB
3.0 版本后的WiredTiger存儲引擎
read
1. 應用通過driver 發起Buffer I/O讀操作,由操作系統將磁盤數據頁加載到文件系統的頁緩存區
2. 引擎層讀取頁緩沖區的數據,進行解壓后放到內部緩存區
3. 在內存中完成匹配查詢,將結果返合給應用
tip:? MongoDB默認的內部緩存大小達到了機器內存的一半; 由wireTigerCacheSize參數指定
write
1.?應用通過driver 發起寫入操作
2.數據庫從內部緩存獲取當前記錄所在的頁快,如果不存在則會從磁盤中加載
3.WiredTiger 開始寫事物,修改數據寫入頁快的更新表,
4. 同時寫Journal 日志(ReDo Log),默認100ms 寫入磁盤;用于彌補CheckPoint的不足
5. 數據庫默認每隔60s 執行CheckPoint ,將內存中數據寫入到磁盤中
ES
read
1. clinet 發動請求到 coordinate node
2.?coordinate node 請發轉到 shard 對應的主節點或者備份節點
3. 每個shard 節點將自己的搜索結果返合給coordinate node ,由協調節點進行數據的合并、排序、分頁等操作產出最終的結果
write
?a.Lucene 中,單個倒排索引?文件被稱為 Segment。Segment 是?自包含的,不不可變更更的。 多個 Segments 匯總在?一起,稱為 Lucene 的 Index,其對應的就是 ES 中的 Shard
?b.樂觀鎖,刪除用.del標記,然后過濾;
?c.寫index buffer(閃存)+ 寫Transaction Log (磁盤)
?d.Refresh : index buffer 1秒一次寫入 segment ,可以被搜索到;估進稱為進實時搜索?
?e. merage
MySql
write
mySql 分server層和存儲層,這里的存儲層默認指nnoDB; 先寫存儲層,在寫server層binlog
1. InnoDB將要更新的數據所在的整頁數據更到到緩存(Buffer pool 一半為機器內側60%)中
2. InnoDB寫入undo 日志便于回滾
3. InnoDB更新Buffer pool 內存中的數據,開放查詢
4. InnoDB寫redo log buffer
5. InnoDB commit 提交時?redo 日志寫入磁盤
6.? Server層寫binlog文件
7. commit 標識寫入redo 日志與binlog 保持一致
8. buffer pool 中的數據寫入磁盤
總結:
總結MySql, ElasticSearch,MongoDB三種現代數據的寫操作,不難發現,實現機制大同小異: 先寫buffer +?Transaction Log;? 同時滿足一定的條件時,再寫入到磁盤中;進而提升寫入效率;