第六章 错误恢复和日志

先来回顾下,之前的几个一致性的概念。
首先是STRICT CONSISTENCY,就是要求所有的操作都严格的按照机器上的WALL CLOCK来排序。那么所有并行的进程的操作都会有序。这在分布式的情况下是做不到的。

和这个最接近的是SEQUENCE CONSISTENCY。它的经典实现是IVY,用自定义的TOTAL ORDER来取代WALL LOCK。我们只要认为所有机器看到的这个顺序是一样的,就是符合SEQUENCE CONSISTENCY。

下一级是 RELEASE CONSISTENCY,他确保的是锁的释放和获取之间是被SEQUENCE CONSISTENCY 保护的。而没有锁的地方顺序是可以不一样的。

EVENTUAL CONSISTENCY, 是为了性能考虑,而引入。它所保证的是你可能看到的结果可能是旧的,但未来某个时刻会得到新的。

下面我们就来讨论如果一台机器挂了怎么办?
机器挂了的最大问题是状态会丢失,所以我们要做的是保证重启之后状态和原来一样并且挂的这个事使得整个执行进入一个不合理的状态。
不合理的状态就是个中间状态,不是ALL OR NOTHING。 是操作了一半留个烂摊子的状态。这个中间的状态是非法的。


image.png

下面举个1000块的转账的例子。为了性能考虑,一开始都是缓存在内存里,最后写入磁盘。


image.png

这个例子会发生A的钱被减掉,B却没拿到。
第一种思路是用备份的页再上面改完,然后用一个指针转移(这个操作为原子)来实现原子效果。


image.png

这种思路有2个问题。
1.可能原子操作点不是很好找
2.TX可能不是由一个人完成的。


image.png

解决思路是LOG


image.png

这个LOG 可以在旧状态时用来REDO,恢复出新状态。
也可以在新状态时UNDO,恢复成旧的。

第一种设计,使用一个LOG文件来记入所有TX。LOG是用APPEND的方式追加在最后。

image.png

为什么要使用一个文件,而不是每个TX一个LOG 呢?
好处是顺序写比较快。如果是多个文件,几个TX并行,就变成了随机写会慢很多。


image.png

TX COMMIT之后怎么实现的?
WAL:写内存前先保证LOG在DISK上写完了。
在一系列操作完成后,要做COMMIT ACTION,写COMMIT标志进LOG


image.png

发生问题,如何RECOVER。
MEMORY全丢失,可以去看LOG。
从后向前扫。首先判断TX提交还是没提交。有标记的做REDO记号,没标记的丢弃。
随后根据有标记的REDO,从前向后重做。
这样全部重做,很慢,所以我们需要CHECK POINT。可以避免LONG TRANSACTION FLOW。
当一个时间点,没有TX在做了。我可以加入一个CHECK POINT标志。代表之前的都OK了,那我下次REDO的时候,可以直接从CHECK POINT 开始。

但是这个时间点很难找,怎么办?
用当前没有正在执行的ACTION。


image.png

下面看个例子。


image.png

现在CHECK POINT 开始RECOVERY, 会记录INPROGESS TX LOG 的位置。
会有T2 和 T4的LOG。
因为1是完成的TX。 2和4 是IN PROGESS的。

这个CASE是一些操作先放内存,每次CHECKPOINT 的时候去写DISK。

红色框是需要REDO, 绿色框是需要UNDO


image.png

还有一种策略,是在完成TX的时候,才去把一些结果写进CHECK POINT。没有完成就什么都不写。这样的好处是不需要UNDO LOG。这种策略是REDO ONLY 的策略。

我们看下转账的例子,底层的LOG在写什么?
这个转账是A 有3000块,B有2000块,A向B 转1000
C有10块,D有0块, C向D转10 块。


image.png

image.png

然后找到CHECK POINT 开始做RECOVERY


image.png

因为AB的转账,已经COMMIT了。所以在CHECK POINT的结果都写进DISK了。但是C 和D都是0.
首先要把没完成的TX UNDO。所以根据CHECK POINT,找到C = C-10,来做UNDO。 C = C +10;
就UNDO好了。 随后把T1 COMMIT 的log 在CHECK POINT之后做REDO。


image.png

为啥要同时做UNDO REDO LOG?
如果一个TX很长,如果只有REDO,那么TX的操作都去不了DISK,需要很多内存去缓存。然后恢复需要全部REDO很费时间。

如果只有UNDO,那就每个操作都要写进去,就更慢了。

如果没有LONG TX,是可以用其中一种LOG的。REDO + CHECKPOINT。


image.png

这边就是A 会被FLUSH,因为TX1 COMMIT了。B 会被REDO。 C 不会被FLUSH。


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容