书接上回
我们在之前的一篇文章《ACK 与外星文明交流》中针对一个问题
两个节点之间的通信不可靠
提出了ack的解决方案
现在 我们为了消息能原子性和持久性的落盘 也面临一个问题
假如一条要写入磁盘的信息写到一半,机器崩溃了怎么办
那么,我们就可以用到下面我们要将的方案,预写日志
预写日志
在需要保证数据落盘一致性的场景中都会面临我们上面提到的问题,也就是崩溃一致性问题,例如 Mysql, kafka, RocketMQ,操作系统中的文件系统等,他们在解决这个问题时,普遍会考虑用预写日志的方案来处理。
所谓预写日志说起来也很简单,就是在真正的数据落盘动作发生前,先在一个众所周知的的地方把要干的事记下来。
那么当我们在落盘的过程中发生宕机,那么重新启动机器后,我们可以根据日志的情况进行回放或者回滚。
事务提交是怎么回事
对于事务 通常会有个事务提交的概念,那么这个事务提交的本质是什么?
我的理解是完整的写入一条日志
在操作系统的文件系统也是需要保证文件的写入的原子性和持久性,在文件系统Ext3中
一条日志通常有三部分组成
TxB + 日志 + TxE
当我们说日志还没有提交的本质 其实是 写入了前两部分
但我们说要提交的时候 再把TxE写入,自此一条完整的提交诞生了。事物的原子性和持久性得到了保证。
这里有一点小细节加入TxE要等待前面的两部分都写入才能写入,那么会影响效率,为了提高效率,能一次性发出所有的写请求,可以在TxE中写入对这些数据的校验和,当我们要真正根据日志进行落盘时,通过校验位来判断这条日志是不是正常的,要是不正常 抛弃即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)