淺析mysql redis rocketmq的持久化機制

觸類旁通

  • 據我的學習經驗,優秀的源碼裏面無非就是一些通用經驗,通用設計模式,通用算法,通用操作系統知識,通用數據結構的組合。既然是,其實大可以觸類旁通,就看其組裝的怎麼樣了,組裝得好就是3A佳作,組裝得不好甚至用地攤貨就是泰坦隕落(仙6風評被害)。
  • 誤殺(翻拍自誤殺瞞天記)電影裏面有一句話是:如果你看過1000部電影,就會知道這世界本沒有什麼離奇的事情。我覺得可以說:如果你看過1000份優秀源碼,就會知道這世界並沒有什麼難懂的源碼。------雖然我閱歷尚淺,並未看過多少源代碼,只是一個練習時長兩年半的非科班生。

淺淺

我們先身在第一層,其持久化機制,

  • mysql:可以簡單的說,mysql的持久化機制(在這裏我們只討論innodb,後文也是)是通過redolog實現的,其redolog又是先寫入redolog緩衝區,再寫入redologfile,再寫入磁盤文件三步來實現的。
  • redis:而redis是通過rdb或者aof來實現其持久化的
  • rocketmq: rocketmq是通過commitLog來實現其持久化的

那麼我們到了第二層

  • mysql:
    • 每次事務提交之前會保證對數據頁的修改寫入redolog緩衝區,然後這裏存在異步同步刷盤策略(設計模式),寫入緩衝區後何時寫入redolog file,這裏提供了innodb_flush_log_at_trx_commit參數。
      • 0:事務提交不進行寫入redolog操作,由主線程來將buffer寫入redolog,每秒鐘做一次redolog的fsync落盤redolog file。(mysql宕機即丟失數據)
      • 1:事務提交時必須調用fsync將redolog落盤到redolog file。(不丟失)
      • 2 : 事務提交時將redolog buffer寫入os cache,由操作系統來幫你落盤.(mysql宕機不會丟失數據,操作系統宕機丟失數據)
    • redolog file的存儲方式是一個環形隊列,redolog file寫入磁盤數據頁的遊標是checkponit,redolog buffer落盤redolog file的遊標是writeponit,writeponit會等checkponit(對,如果你知道disruptor,會立即想起裏面的數據結構ringbuffer,這裏的流程如出一轍).
  • redis:
    • redis分爲rdb和aof兩種持久化機制.
      • rdb是默認持久化機制,可以通過執行命令的方式執行也可以當一定的key被修改後進行一次持久化到dump.rdb文件文件.rdb是存儲的redis的數據結構.
        • 手動執行save命令,會阻塞其他命令(類似jvm stw)來寫入dump.rdb文件.
        • 手動執行bgsave 會fork一個子進程來寫入dump.rdb文件
        • 自動觸發(save 900 1;save 300 10;save 60 10000)表示900秒內有一個修改會觸發持久化bgsave.
      • aof,aof文件存儲的是寫入的命令.
        • 開啓aof : appendonly yes
        • aof機制是將redis的寫命令寫入aof緩衝區,然後寫入aof文件的操作
          • appendfsync=always,每次事件循環會將aof buf寫入Aof文件的操作系統文件緩存區(write命令),然後再fsync刷盤到aof文件.
          • appendfsync=everysec,每次事件循環會將aof buf寫入aof文件緩衝區,每秒由主線程fsync一次.
          • appendfsync=no.每次事件循環會將aof buf寫入aof文件緩衝區,由操作系統來寫入aof文件
  • rocketmq:
    • commitlog:消息寫入pageCache,同步刷盤會立即寫入磁盤,異步刷盤會等待消息量積累到一定程度再進行刷盤。

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章