找工作網(wǎng)站谷歌在線瀏覽入口
背景
最近在使用flink的過程中,由于要存儲(chǔ)的狀態(tài)很大,所以使用到了rockdb作為flink的后端存儲(chǔ),本文就來簡單看下rockdb的架構(gòu)設(shè)計(jì)
Rockdb設(shè)計(jì)
Rockdb采用了LSM的結(jié)構(gòu),它和hbase很像,不過嚴(yán)格的說,基于LSM結(jié)構(gòu)的存儲(chǔ)都差不多,我們簡單看一下它的架構(gòu)圖
寫操作
1.寫記錄會(huì)先寫入到WAL日志文件中,由于是順序?qū)?#xff0c;速度不會(huì)慢,然后再把記錄寫入內(nèi)存中的memtable中,如果memtable達(dá)到閾值,就把這個(gè)memtable變成一個(gè)不可變的Immutable-memtable,此外會(huì)再創(chuàng)建出來一個(gè)新的memtable用于接收用戶寫入
2.Immutable-memtable內(nèi)存表的數(shù)量達(dá)到上限后,會(huì)把他們的數(shù)據(jù)刷新到SSTable磁盤文件中,只保存固定數(shù)量的Immutable-memtable內(nèi)存表
3.定期把低Level的sst文件合并成高Level的sst文件,其目的是為了清理已經(jīng)被刪除的記錄,由于sstable文件是只Append,所以刪除操作只有在文件合并的時(shí)候才會(huì)實(shí)際發(fā)生,此外,減少sst文件的個(gè)數(shù),也有助于讀取操作的性能
讀操作
1.讀首先讀取memtable內(nèi)存表,如果沒有,從索引(布隆過濾器索引BloomFilterIndex或者數(shù)據(jù)索引DataIndex)中查找到記錄所在的sstable文件的塊位置,注意,索引(布隆過濾器索引BloomFilterIndex或者數(shù)據(jù)索引DataIndex)的數(shù)據(jù)最好是常駐內(nèi)存的,也就是對(duì)于flink來說,state.backend.rocksdb.memory.high-prio-pool-ratio的配置值不要設(shè)置為0
2.獲取到記錄所在的sstable的對(duì)應(yīng)數(shù)據(jù)塊后,優(yōu)先從內(nèi)存中的BlockCache查找數(shù)據(jù)塊,如果找到,查詢結(jié)束,否則,繼續(xù)下一步
3.讀取sstable文件中的指定數(shù)據(jù)塊的數(shù)據(jù),返回記錄后把對(duì)應(yīng)的數(shù)據(jù)塊放到BlockCache中,以便下次查找