从MySQL日志系统设计中学习高可用方案

MySQL的InnoDB中的更新语句大致流程是这样的:

  1. 首先开启一个事务;
  2. 先查询到需要更新的记录,加锁;
  3. 更新记录;
  4. 写RedoLog,将事务标记为prepare状态;
  5. 写BinLog;
  6. 事务提交,将事务标记为commit状态;
  7. 返回影响行数至客户端。

其中写redolog和binlog是历史原因造成的,因为MySQL的原生引擎是MyISAM,BinLog也是原生的。而InnoDB是以插件形式添加到MySQL中的,为了实现CrashSafe才有RedoLog。

双日志写入是使用经典的两阶段提交保证事务完整性的。

RedoLog是InnoDB引擎层面实现的,记录了“在某数据页上做了什么修改”,注意这里RedoLog写成功即可认为事务已经成功。即使这里发生Crash的话,重启系统能够根据RedoLog恢复。
BinLog是MySql的Server层面实现的,所有的引擎通用,是逻辑日志。记录的是这个语句的原始逻辑。

这就是所谓的Write-Ahead Logging(WAL)技术。

这里有个点需要提一下,设计上为什么要先写RedoLog,而不是直接写磁盘呢?之所以这样设计是因为日志追加写减少了磁盘寻址的时间,速度更快。

我认为所有带状态的系统都可以学习MySQL的设计思想来实现自己的高可用方案,拥有CrashSafe能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值