所谓线性化(linearizability),是指分布式系统对外表现就像只有一个数据片一样,数据遵循因果先后关系,读取数据时总能够读到最新的数据。
没有实现线性化
在一个线性化系统中(如下图示),读写关系有以下几种:
- 读请求在写请求开始之前就已经完成,读到的值为0;
- 读请求与写请求在操作时间上存在重合,不确定读到0还是1;
-
读请求在写请求之后发生,读到新值1;
线性化系统图示
上面还不是线性化约束的完整描述,在读写请求重合的区间内,可能会出现先读到1后读到0的情况,这明显与线性化保证的描述不符合。为了加强描述,又引入了下面的约束:
读请求顺序保证
更进一步,引入cas(compare-and-set)操作,线性化保证严格变成:
线性化
线性化(Linearizability)经常与序列化(Serializability)相混淆。序列化是事务隔离级别的一种,对外展现数据结果与事务串行执行结果一致。线性化是对单一数据的读写结果保证。
在下面场景中,线性化将会是非常重要的特性:
- 分布式锁和选主过程,ZooKeeper,etcd等一般通过共识算法(paxos或者raft)来实现分布式锁和选主。
- 约束和唯一性保证 比如用户名或者用户邮箱的唯一保证,不允许多个请求同时创建同一用户邮箱。
在线性化的实现上,需要从以下几个场景来讨论:
- 在单主架构中,可以通过主节点处理写请求和阻塞同步数据到从节点来保证线性化;
- 一致性算法 这也是zookeeper和etcd等采用的方案;
- 无主架构中暂时没有有效的线性化保证措施;
网友评论