浅析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,同步刷盘会立即写入磁盘,异步刷盘会等待消息量积累到一定程度再进行刷盘。

未完待续

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