Swift数据一致性原理


Swift必须考虑应该如何面对数据的损坏或硬件的故障的问题。
Swift通过为对象引入多个副本来保障一个数据的损坏或部分硬件的故障不会引起该数据的丢失,并通过Storage Policies来减轻多个副本的存储资源消耗,但是由此引入了另外一个问题,同一个对象多个副本之间的一致性如何保证。
NWR策略
Swift保证数据一致性理论依据的NWR(又称Quorum仲裁协议),其中,N为数据的副本总数,W为更新一个数据对象时,需要确保成功更新的份数,R为读取一个数据时需要读取的副本个数。
Swift默认采用了N=3,W=2,R=2的设置,表示一个对象默认有3个副本,至少需要更新2个副本才算写入成功,至少读2个副本才算读成功。
如果W+R>N,那么就可以保证某个数据不会被两个不同的事务同时读写。
举例:
假设在这种情况下存在两个事务对同一个数据进行读写,假设3个副本,一个事务在写2个副本,一个事务在读2个副本,因为只有3个副本,所以这种情况必然会有至少一个副本发生读写冲突,这是系统所不允许的,发生冲突时,读或写会失败。
也就是说,如果有两个事务对同一数据进行读写,那么W+R>N的情况下,必然会有至少一个副本因为发生读写冲突而导致失败,它保证了某个数据不能被两个事务同时读写。
如果W>N/2,那么可以保证两个事务不能并发写同一个数据,否则,必然有至少一个副本发生写冲突。
举例:
假设W=2,N=3,满足W>N/2(W+W>N),此时2个事务都在对同一数据进行写操作,副本只有3个,而同时要写4个副本,必然有一个副本发生写冲突,系统会报错不允许。
W>N/2理论保证了数据不能并发写。
既然Swift使用多副本来保证数据的高持久性,那么N必须大于1,如果N为2,那么只要一个数据丢失或存储节点故障,就会有单点问题,一旦这个数据再次出错,就可能永久的丢失,所有N应该大于2,但是N越高,系统整体成本就越高,所以Swift默认采用N=3,W=2,R=2的设置。如果R=1,则可能读到旧版本数据。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值