当数据库遇到分布式

数据库126

NewSQL日渐火热,无论还是开源的TiDB,CockroachDB还是互联网大厂的Spanner,Oceanbase都号称NewSQL,也就是分布式数据库。NewSQL的典型特征就是,支持SQL,支持事务,高性能,低成本,高可靠,强一致,易扩展,运维友好等。从NewSQL的演进来看,所谓NewSQL,可以简单理解为NoSQL+传统的关系型数据库的结合,NoSQL强调分布式(高可用,可扩展),关系型数据库则强调事务,SQL。正因为二者的叠加,所以需要把两个领域的概念整合在一起,本文主要想把分布式数据库中几个基本概念讲清楚。

数据库和分布式系统中都有一致性概念,由于很多英文单词对应的中文都是"一致性",导致容易产生误区。数据库中的ACID,C是Consistency,这个C主要强调应用逻辑的一致性,比如应用定义的约束,包括外键等。分布式系统的CAP以及一致性协议,也称为一致性。前者主要强调,读是否能读到最新,以及并发场景下操作执行的时序关系,主要包括线性一致性(linearizability),顺序一致性(sequential consistency),因果一致性(causal consistency)等;后者主要强调"共识",分布式中的多个节点对某个事情(选主,事务提交)达成一致,常见的共识算法包括paxos协议,raft协议等。

简单来说,线性一致性要求,第一,"写后读",这里写和读是两个操作,如果写操作在完成之后,读才开始,读要能读到最新的数据,而且保证以后也能读操作也都能读到这个最新的数据。第二,所有操作的时序与真实物理时间一致。相对于"写后读",第二点要求即使不相关的两个操作,如果执行有先后顺序,线性一致性要求最终执行的结果也需要满足这个先后顺序。比如,操作序列(写A,读A,写B,读B),那么不仅,读A,读B能读到最新A 值和B值;而且要保证,如果读B读到最新值时,读A一定也能读到最新值,也就是需要保证执行时序与真实时序相同。第三点,如果两个操作是并发的(比如读A没有结束时,写B开始了),那么这个并发时序不确定,但从最终执行的结果来看,要确保所有线程(进程,节点)看到的执行序列是一致的。

下图对线性一致性有详细的论述,来源于[6]

顺序一致性(sequential consistency)

相比线性一致性,主要区别在于,对于物理上有先后顺序的操作,是否要保证这个时序。具体而言,对于单个线程,操作的顺序仍然要保留,对于多个线程(进程,节点),执行的事件的先后顺序与物理时钟顺序不保证。 但是要求,从执行结果来看,所有线程(进程,节点)看到的执行序列是一样的。详细定义来源于[6]

下图的例子很好的区分了线性一致性和顺序一致性。

对于(a),执行序列write(y,2),read(x,0),write(x,4),read(y,2),结果符合要求,但是从客户端的角度来看,write(x,4)先于read(x,0)执行,但是read却没有读到最新值。

对于(b),write(y,2)和read(y,2)有先后顺序,也是符合"写后读",所以是线性一致性。

对于(c), 有几种可能:

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长