Bayon(最终一致性)
场景:会议室预定系统;手机和后台交互。
手机不能随时上网,数据库备份在多个server上。
手机上也有数据库。任何操作一定能操作本地的数据库,立刻返回。等于支持离线操作(High Available)
核心问题:同步/一致性
同步 基于RSM
允许任意两个mobile都可以同步
log( timestamp, serverID, op )
同步时:
- 合并log
- rollback,回滚到log冲突之前的状态。log必须是undo log。
这里的write操作不是普通的write操作,可以保留有上层语义。只有满足特定条件才会写;否则会有替代的函数。
写操作的定义是:
Bayon_Write:
if dependency_check:
mergeproc
else
update
调用的时候如下:
Bayon_Write(
update = {insert, Meeting, xxxxxx, “xxxx”}
dependency_check = [option1, option2]
mergeproc = {
xxxxx
}
)
这就解决了合并是冲突的问题。同时能够帮忙传达上层的语义到数据库中。
causality
A -> B, 但是B的时间戳比A早。会导致错误。所以timestamp必须是一个类似于logic clock的东西。B的timestamp比A大。
因此任何两个人总能够做到最后同步。
Fix & Tentative
如果有一台手机离线时间太长,很有可能会导致大量的回滚。
所以最好的状态是,可以确定一个时间点,时间点之前的都已经固定掉,永远不会被回滚。
Bayou系统,有一个中心控制的服务器(Primary),由它来操作fix。每隔一段时间会有一个Commit Sequential Number、
CSN之前的log,都肯定会被放到数据库中。所以可以传整个数据库。
举个例子,A的CSN为10000, B为50000,B可以把自己数据库和50000以后的log全传给A。
等于commit之前的数据库就是一个snapshot/checkpoint。
View Change
新的机器碰到的第一个server,插入一个log,这个log就是新加入的server的信息。
等该log已经被commit了,说明view change已经成功了。