Redis持久化操作RDB和AOF 對比於HDFS的SecondaryNode
寫在前面的話
最近學習比較多流行的大數據框架和完成兩個大數據項目後,又突然學起了Redis。之所以之前的框架不學習記錄呢,是因為之前的學習都是為了完成參加服創比賽的項目所以時間較緊,現在基本架構和編碼測試完成,就開始學習新的知識並且嘗試優化服創項目。當然我也不願意複製老師的PPT寫成自己的部落格:),這裡記錄的是我在學習過程中自己的一些思考和之前大數據框架(AOF、RDB與HDFS中的SecondaryNode)的對比(大數據人絕不CV。
PS:服創項目是我從0開始的項目,等服創比賽結束後再來複盤!
Redis
Redis,REmote DIctionary Server(遠程字典伺服器),作為記憶體資料庫, 同時作為NoSQL的一員,與傳統的RDBMS區別還是挺大的(我最大的感覺就是簡單和快速。
(讀到這裡那一定會有讀者問了:)作為資料庫,那麼一定能存儲數據,但是又是運行在記憶體中的,那怎麼才能保證數據不丟失呢!(即持久化)
那便是持久化!並且有兩種方式可以進行持久化,分別是RDB(Redis DataBase)和AOF(Append Only File)。筆者在學習過程中,總是腦海中不斷與HDFS的SecondaryNode的備份方式進行比較,故此文作為記錄!
下圖是Namenode和SecondaryNode的工作流程圖:

RDB -Redis DataBase
RDB持久化
Redis運行過程中,達到了一定時間點或者其他限制(比如手動刷寫),啟動一個子進程fork整個主進程,在子進程中將redis中的數據寫入到一個臨時文件中,等這個持久化過程結束後,將這個臨時文件替換上次持久化的文件。
筆者在初次接觸到這個理念的時候,立馬就覺得這個很有可能會丟失最近一次的持久化,這不就是冷備份嘛!那secondaryNode不也是冷備份嘛。重點就在於RDB保存的是數據文件(默認為dump.rdb),就像是secondary保存的FsImage.checkpoint一樣,類似於資料庫中的物理備份。
下圖是RDB的流程圖:

配置
Redis的配置文件中就可以配置出發RDB的工作的條件:
名稱 | 內容 |
---|---|
save | 配置快照出發的條件,例如save 120 2,表示在兩分鐘內修改了2次觸發RDB,save “”表示關閉RDB。 |
stop-writes-on-bgsave-error | 如果配置成no,表示你不在乎數據不一致或者有其他的手段發現和控制 |
rdbcompression | 是否對於存儲的數據文件進行壓縮,當然這需要消耗額外的CPU資源 |
rdbchecksum | 是否對於存儲的文件使用CRC64演算法進行校驗 |
dbfilename | 存儲的RDB數據文件名稱,默認為dump.rdb |
dir | 工作路徑 |
優劣勢
優勢:適合大規模的數據恢復;對數據完整性和一致性要求不高
劣勢:在一定間隔時間做一次備份,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改;fork的時候,記憶體中的數據被克隆了一份,大致2倍的膨脹性需要考慮;同時子進程寫入的時候是不可以主進程不能進行任何的IO操作
AOF-Append Only File
AOF持久化
相比於RDB的持久化,AOF採取就是將每次寫入操作寫入日誌,在每次恢復的時候重新執行一次日誌文件中的寫入操作就可以了。
這裡是不是很容易就聯想到NameNode的edit日誌,NameNode如果不走SecondaryNode的話,執行的也是將操作保存在文件中,而不是數據文件,這裡就類似於資料庫的邏輯備份。
下圖是AOF持久化的流程圖:

配置
名稱 | 內容 |
---|---|
appendfsync | 同步的機制,Always表示實時同步,everysec表示每秒同步,no表示不同步 |
no-appendfsync-on-rewrite | 重寫時是否可以運用Appendfsync,用默認no即可,保證數據安全性。 |
auto-aof-rewrite-min-size | 設置重寫的基準值 |
auto-aof-rewrite-percentage | 設置重寫的基準值百分比 |
優劣勢
優勢:相比於RDB,一致性較好。
劣勢:相同數據集的數據而言aof文件要遠大於rdb文件,恢復速度慢於rdb;aof運行效率要慢於rdb,每秒同步策略效率較好,不同步效率和rdb相同
總結
這麼對比下來,HDFS中採用的方法歸根結底還是冷備份。如果HDFS只用RDB的方式,NN的壓力太大,如果只用AOF的方式,效率太低,所以兩者結合才是最好的方式,而這種方式對於Redis來說又過於重量級了。HDFS還將將備份文件放置在了另一台機器上,當然,Redis也可以做到,畢竟Redis是分散式資料庫,存在主從複製。
這篇部落格,沒有涉及到Redis的具體操作,只是用來記錄Redis的持久化機制,並且和HDFS的備份方式進行對比從而方便更好的理解和記憶。