crdt学习笔记(1) 简介

  随着大数据时代的到来,对于数据并发处理的要求也越来越高。在传统的数据库模型中,crud操作必须依赖事务和锁来保证一致性。但是CAP原则告诉我们,这样的一致性是以严重牺牲可用性为代价的。为了实现更高的可用性,分布式的数据库系统成为了必然选择。

  但是,如果不能真正支持多节点并发读写(尤其是写入),而是仅仅是将数据存储到多个节点上,是远远不能满足高可用性场景的要求的。然而,要想实现高可用性,又不能不考虑到一致性和分区容错性问题,这似乎是个无法解决的矛盾(CAP)。虽然目前对于这个问题,并没有完美的解决方案,但是经过前人的不断实践,在针对特定应用场景的设计上依然取得了良好的进展,而crdt就是其中之一。

  那么,什么是crdt呢?假设我们有大量的用户数据(亿级),原先存储在关系数据库中。然而随着业务的不断扩展,对其并发读写的要求也越来越高。当然,我们可以通过redis这样的缓存来提升读取性能。但是,对于并发更新又如何呢?

  

  我们都知道,对于分布式存储来说,很重要的一点就是多副本(replica)冗余。读取数据时,可以同时从多个节点进行读出,这样可以大大提升可用性。但是,试想一下,假如同一个用户,需要在同一时间在多个不同的客户端登陆,并对用户信息更新(大多数系统都是支持的吧)。对这样的场景,如果用户并发很低的话,我们当然可以通过加锁来保持一致。但是,根据我们之前的假设,这样的实现显然是不能满足要求的。而crdt的视角恰恰相反,不是通过事务这种强制性的时序来保证一致,而是允许冲突的存在,关注于提供支持冲突解决的数据结构来实现最终一致。这样,只要多个副本能够通过特定的策略最终合并成一致的结果,就能够保证整个系统的一致性。开源的no-sql数据库中,riak 2.0预览版实现了这样的一项特性。后续会以riak为例,深入学习riak当中这项特性的实现。



 

猜你喜欢

转载自yaochitc.iteye.com/blog/2038988
今日推荐