大型网站,数据在多个数据中心
数据在数据中心进行复制,靠近用户 容错
read 操作要快 读占了大多数
写操作 尽可能保持一致性
需求:读/写操作在本地数据中心的本地replica进行处理,,无需等待其他数据中心的回复。需要一个能本地读和本地写的系统
local read local write 另外还要保持一致性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewfoOrMh-1617203302057)(http://note.youdao.com/yws/res/9708/EDF6DDF65BA14A4B8FA84ADEF92BFF43)]
上图的设计是最终一致性, no order garantee cassandra ???
例子:
// APP
C1: put(photo) put(list)
C2: get(list) get(photo)
// 最终一致性系统中,没法保持正确性 get(list),但get(photo)可能并不存在。。。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqebukTR-1617203302073)(http://note.youdao.com/yws/res/9721/7CF4CC4EE2D548B2A3103829E0A5CF76)]
wall-clock time
- 两个DC同时进行put操作 时间戳pair 高位:时间戳 低位:标识符(假设时间同步)
Lamport clocks(为了解决时间不准确的问题)
每个服务器保存一个Tmax(服务器目前从所以地方看到的那个最高版本号)
Tmax = highest V# seen
V#=T = max(Tmax+1,real time) (要进行put操作时的版本号)Tmax是之前的时间
它要比最后一次对数据进行更新时的写操作的版本号还要高,至少也是和现在的时间一样。
COPS 中使用Lamport clocks分配时间戳。
Conflicting writes
并发对同一个key写入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXbhTLt4-1617203302076)(http://note.youdao.com/yws/res/9748/9A749701A9DA4FE6A812C3129DEE7E1A)]
Last writer wins
straw man two
sync(k, V#)
put(k,v) -> v#
C1: v# = put(photo),sync(photo,v#),put(list) // sync同步数据到其他站点
C2: get(list) get(photo)
COPS
client context
版本号之间的依赖来实现因果一致性。
get(x) -> V2 x:v2
get(y) -> v4 v:v2 y:v4
put(z,-) -> v3 (put(z,-,x:v2,y:v4)) //这种关系叫依赖(dependency)
// 两个依赖 xv2->zv3 yv4->zv3
put(q,-) (put(q,-,z:v3,x:v2,y:v4)) // put需要在前面的值出现后再执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0wm049D-1617203302078)(http://note.youdao.com/yws/res/9782/650AB953E38E45F1B037A6B003F00E6A)]
只有在z的依赖,xv2,yv4展示给了数据中心3对应的client后,新版本的z才能展现给client。
缺点:延迟时间过长,级连等待。
COPS-GT
//因果一致性(COPS),你能看到的数据至少和哪些dependency一样新
get(ACL) get(list)
put(ACL) put(list)
因果一致性的缺陷:
- COPS 04视频最后