假设有一套AP型的分布式系统,实现了最终一致性,但是有时候保证强一致性,而不是最终一致性,那时候该怎么办呢?

首先说下.什么是最终一致性和强一致性

强一致性,是在写操作完成之后,任何后续访问能拿到更新后的最新值

最终一致性,就是某个对象没有新的写操作了,最后所有的后续访问都能读到相同的最新的值,写操作完成后,后续可能访问到旧数据

为了一个临时需求,重新开发一套系统,肯定不合适,所以可以靠引入Quorum NWR来解决这个问题

也就是在原有系统上开发一个新的功能,可以满足需求了,在NWR系统中,分为W R N,通过调整三者的数量,来实现不同的一致性

在很多的分布式系统中,比如Dynamo,InfluxDB的企业版,都是实现Quorum NWR功能,首先就是NWR的三个要素,N W R,因为是Quorum NWR的核心内容,我们需要通过组合这三个要素

Quorum NWR三个要素

N是副本数,又叫做复制因子,N代表集群中同一份数据有多少个副本,如下所示

图片

上面显示了,对于DATA1分别存在于两个节点中,DATA2存于三个节点中,DATA3存于1个副本中,副本数不等于节点数,不同的数据可以有不同的副本数

实现Quorum NWR时候,最好支持自定义副本的功能,制定了副本数,就可以对副本数据进行读写操作了,如何进行读写呢?

在整个功能点上,NWR对应着不同的操作,W就是写操作,W就是一致性级别,表示成功完成W个副本的更新,就算完成了写操作

所以这里的W,可以被认作是一致性级别的读写,表示完成W个副本的更新,就算完成写操作

图片

比如,写级别是2,对DATA-2执行写操作的时候,完成两个副本的更新,就算完成了写操作

那么说下读操作

图片

读操作中,读的等级是R,读取一个数据对象时候,需要R个副本,要读R副本,返回R个副本中最新的那份数据

DATA-2的读副本数是2,客户端读取DATA-2数据的时候,读取2个副本的数据,然后返回最新的数据

无论客户端如何执行读操作,哪怕访问的是写操作尚未强制更新副本数据的节点,但因为W(2)+(2)>N(3),就是说,访问节点B,执行读操作,因为读两份数据,所以,除了节点B上的DATA-2,还会读取节点A或者节点C上的DATA-2,从而保证返回的是最新的数据

通过设置R为2,保证读到更新后的数据,保证了强一致性

对于不同的组合,有不同的结果

W+R>N,对于客户端来说,整个系统能够保证强一致性,返回更新后的结果

W+R<=N,那么只能保证最终一致性,可能返回旧的数据

那么如何实现这个NWR呢,可以通过指定一个数据库的副本数,来创建对应的副本数,而且最好副本数量不要超过节点数量(避免一个节点上有多个副本数据)

InfluxDB企业版中,支持any one quorum all 四个级别的写等级

any是指,任何一个节点写入成功后,或者接受节点已经写入了Hinted-handoff缓存,就会返回成功给客户单

one,任何一个节点写入成功,就返回成功给客户端,不包括写入Hinted-handoff缓存

quorum:大多数节点写入成功后,就会返回成功,只有副本数大于2才有意义,不然等于all

all:所有节点写入成功了,就会返回成功

对于要求读的强一致性的级别的场景,可以通过设置写为ALL级别,从而实现强一致性

本章的一些重点如下,

1.不推荐设置大于节点数的副本数,避免出现冗余的副本

2.根据,我们可以通过设置不同N W R的值,来优化不同的方面的性能,比如

W=N,读性能比较好,R=N,写性能比较好,设置W=(N+1)/2,R=(N+1)/2,容错的性能较好

设置自定义副本的时候,设置几个副本呢?

设置半数以上的副本数就可以保证了

发表评论

邮箱地址不会被公开。 必填项已用*标注