為什么NoSql快--磁盤順序寫


數據寫入方式
1.  update-in-place原地更新
2.  append-only btree/copy on write tree順序文件末尾追加
 
數據被按照特定方式放置,提升讀性能,但寫性能下降,對b+樹和hash更新時需要隨機讀寫:
1. 二分查找,將文件數據有序保存,使用二分查找來完成指定key的查找
2. 哈希,用哈希將數據分割為不同的bucket
3. B+樹,減少外部文件的讀取
4. 外部文件,將數據保存為日志,並創建一個hash或者查找樹映射相應的文件
 

存儲結構(磁盤因為尋道等因素,順序讀取比隨機讀取塊N個數量級):

     將整個磁盤就看做事一個日志,在日志中存放永久性數據及其索引,每次都添加到日志末尾;
通過將很多小文件的存儲轉換為連續的大批量傳輸,是的對於文件系統的大多數存取都是順序性的,從而提高磁盤寬帶利用率,故障恢復速度快。
簡單來說分為一部分常駐內存,可以為任何方便鍵值查找的數據結構,另一個常駐硬盤,與B-Tree類似,這部分經常訪問的節點也會被緩存在內存中
首先將日志文件寫入插入操作日志。然后寫入內存部分。當內存接近閾值則滾動合並到硬盤。
 
     將數據添加到文件,因為完全順序,所以寫操作性能優秀,但從日志文件讀一些數據將比寫操作消耗更多的時間,需要倒序掃描,知道找到所需內容。
日志適用的場景:
  •   數據是被整體訪問,WAL(write-ahead-log)
  •   知道明確的offset,kafka
Log-Structured Merge-Tree,LSM-tree
     將之前使用的一個大的查找結構變換為將寫操作順序的保存到一些相似的有序文件(sstable)中。每個文件包含了短時間段內的一些改動,因為文件有序,后續查找也會很快。文件不可修改,永遠不會更新,新操作只會寫到新文件中,讀寫檢查所有文件,通過周期性的合並來減少文件的個數。保持了日志文件的寫性能,讓操作順序化,不斷追加而不是修改,延遲更新,批量寫入硬盤,適合於大量插入環境
寫操作被分批處理,只寫到順序塊上,周期性合並會影響IO,都操作有可能訪問大量的文件(散亂的讀)
  • 更新操作-》內存緩存(memtable)中使用樹結構來保持key有序-》WAL寫磁盤防丟/恢復/-》達到一定規模刷到磁盤上一個新文件里,這里簡單生成新文件沒有編輯,所以是順序寫,速度快
     越多的數據到存儲系統中,就會有越多的不可修改的順序sstable文件被創建,他們代表了小的,按時間順序的修改,系統周期性發起compaction,合並文件刪除重復冗余,減少文件個數,保證都操作的性能,因為sstable是有序結構,所以合並非常高效
  • 讀操作-》先檢查內存數據(memtable)-》沒有這個key-》逆序一個個檢查sstable直到找到。
     因為需要遍歷所有sstable,當數量過多性能就會下降,一方面系統周期性合並sstable,用cache等技術,另一方面使用bloom來避免大量的讀文件操作。
周期合並(按層/按文件大小):為了保證LSM讀取速度,所以需要維護並減少sstable文件個數


免責聲明!

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



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