iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0

一個新的寫入的動作,replica node有所回應,也代表著已將資料寫入Memtable,和Commit Log。

Memtable,是記憶體空間,Commit Log是存在硬碟裡面,存放資料的內容,包括寫入的時間戳。

更新的資料容量在Memtable達到一個程度,會再將資料更新到SSTable,SSTable也是存在硬碟裡面。

資料從Memtable寫入到SSTable之後(這個行為會暫時把寫入動作鎖住),相對應的Commit Log部分,後續就會被刪除。

換個方面來看,Commit Log也是為了在將資料真正寫入硬碟之前,若發生遺失的狀況,可以復原資料的依據。

因此寫入SSTable之後,Commit Log就可以被刪除了。

下圖為資料寫入的流程:

到此要稍微介紹一下,SCYLLA的資料結構是採取LSM(log-structured merge-tree LSM 樹),意思是日誌(log)結構的合併樹,透過順序寫入來優化寫入的方式。

LSM使用SSTable(Sorted Strings Table),一種key-value的資料格式,key會按照順序排序,多組key-value又做成一個segment,SSTable由許多segment組成。。

一但Memtable的資料寫到SSTable,那個該SSTable就不能再做變更,只能被讀取。

下個Memtable過來的資料,會寫入到一個新的SSTable。

所以在讀取一個table資料的時候,基本上需要跨很多SSTable和Memtable做查詢,並且將資料合併整理,才是呈現我們看到的結果。

而SSTable數量太多或太破碎,會造成讀取效能上的不優,所以當SSTable數量太多的時候,系統就會自動執行壓縮(compaction)的動作。

壓縮的動作是把許多小的SSTable,合併到一個大的SSTable,如果有先後對一筆資料做更新的多筆commit,會只留下更新時間最新的那筆。


上一篇
Day21. Consistency Level 與讀寫機制
下一篇
Day 23. materialized views
系列文
scylla 從零開始攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言