十年技术大牛总结:分布式架构之日志技术

实际工程中NWR是宽松模式,中心节点(第三方zookeeper)读取R个副本,选择R个副本中 版本号最高 的为新的primary 。还可以利用paxos等协议选出新的primary,每个节点以自己的版本号 发起paxos提议,选出的新primary是某个超过半数副本中版本号最大的副本。
当机器宕机的时候,我们需要如何去恢复宕机之前那些数据? 日志技术 是宕机恢复的主要技术之一 。日志技术最初使用在数据库系统中 。严格来说日志技术不是一种分布式系统的技术,但在分布式系统的实践中,却广泛使用了日志技术做宕机恢复,甚至如BigTable等系统将日志保存到一个分布式系统中进一步增强了系统容错能力 。
先简单介绍数据库系统中的日志技术,抽象简化问题模式,在简化模型的基础上介绍两种实用的日志技术 Redo Log 与 No Redo/ No Undo Log。
数据库系统日志技术简述
【十年技术大牛总结:分布式架构之日志技术】在数据库系统中实现 宕机恢复,其难点在于数据库操作需要满足ACID,尤其在支持事务的数据库系统中宕机往往发生在某些事务只执行了部分操作的时候 。此时宕机恢复的主要目标就是数据库系统恢复到一个稳定可靠状态,消除未完成的事物对数据库状态的影响 。

十年技术大牛总结:分布式架构之日志技术

文章插图
 
数据库日志主要分为Undo Log、Redo Log、Redo/Undo Log与No Redo/ No Undo Log 。这四类日志的区别在更新日志文件和数据文件的时间点要求不同,从而造成性能和效率也不相同 。可以参考有关数据库系统方面的资料去深入了解这四类日志技术。
Redo Log与Check point
问题模型 :首先简化原数据库系统中的问题模型为一个较为简单的模型:假设需要涉及一个高速的单机查询系统,将数据全部存放在内存中以实现高速的数据查询,每次更新操作更新一小部分数据(列如key-value中的某一个key) 。现在问题为利用日志技术实现该内存查询系统的宕机恢复 。与数据库的事务不同的是,这个问题模型中的每个成功的更新操作都会生效 。也等效为数据库的每个事务只有一个更新操作,且每次更新操作都可以也必须立即提交 。
Redo Log :Redo Log是一种非常简单实用的日志技术 。在上面的问题模型中,只需按照如下流程更新既可以使用 Redo Log。
Redo Log更新流程
  1. 将 更新操作的结果 (例如set k1=1,则记录k1=1)以追加(Append)的方式写入磁盘日志文件
  2. 按更新操作修改内存中的数据
  3. 返回更新成功
上述更新流程中第2步如果没有考虑修改内存数据需要多线程互斥等问题,对于说明Redo Log的原理没有影响 。
从Redo Log的流程可以看出,Redo写入日志的内容是更新操作完成后的结果(这点是与Undo Log的区别之一),由于是 顺序追加日志 文件,在磁盘等对 顺序写 有力的存储设备上效率较高 。
用Redo Log进行宕机恢复非常简单,只需要” 回放 ”日志即可 。
Redo Log的宕机恢复
  1. 从头读取日志文件中的每次更新操作的结果,用这些结果修改内存中的数据 。
从Redo Log的宕机恢复流程也可以看出,只有写入日志文件的更新结果才能在宕机后恢复 。这也是为什么在Redo Log流程中需要先更新日志文件再更新内存中的数据的原因 。假如先更新内存中的数据,那么用户立刻就能读到更新后的数据,一旦在完成内存修改与写入日志直接发生宕机,那么最后一次更新操作无法恢复,但之前与困难已经读取到了更新后的数据,从而引起不一致的问题 。
Check point
宕机恢复流量的缺点是需要回放所有redo日志,效率较低,假如需要恢复的操作非常多,那么这个宕机恢复过程将非常漫长 。解决这一问题的方法引入了check point技术 。在简化的模型下,check point技术的过程即将内存中的数据以某种易于重新加载的数据组织方式完整的dump到磁盘,从而减少宕机恢复时需要回放的日志数据 。
check point流程
  1. 向日志文件中记录“begin check point”
  2. 将内存中的数据以某种易于重新加载的数据组织方式dump到磁盘上
  3. 像日志文件中记录“end check point”
在check point流程中,数据可以继续按照Redo Log更新流程走,这段过程中新更新的数据可以dump到磁盘也可以不dump到磁盘,具体取决于实现 。例如,check point开始时k1=v1,check point过程中某次更新为k1=v2,那么dump到磁盘上的k1的值可以是v1也可以是v2 。
check point的宕机恢复


推荐阅读