当前位置: 首页 > 科技观察

太上老君炼丹炉的分布式QuorumNWR

时间:2023-03-14 13:56:00 科技观察

》《太白金星:听说老君最近在练神药,可以介绍一下吗?,两颗固步丹,两颗恢复丹。相同。”三种丹药如何分为一炉和三炉?炉子,看看六颗丹药是怎么分布的。首先,我们很容易猜到丹炉是如何分配炼丹的:一号丹炉炼制了两颗延年丹。二号炼丹炉炼制了两颗健步丹。三号丹炉炼制了两颗恢复丹。太白金星觉得这样分配丹炉会不会有什么问题?试想一下,如果一号丹炉因为火候太高而爆裂,那么两颗延年丹肯定会失效。这与将所有鸡蛋放在一个篮子里是一样的。如果不小心打翻了篮子,里面的鸡蛋就会掉出来摔碎。”太上老君:老白,我把锅盖打开给你看,你就知道了。”一号炼丹炉炼制的是延年丹和健步丹。二号炼丹炉炼制的是长生丹和恢复丹。三号炼丹炉炼制的是行走丹和恢复丹。丹炉实际分布《太白金星:老君,你为什么要这样分布?每一颗丹药的火候,不是那么好控制的吗?》太上老君:老白,我是炼丹宗师,太白金星:不愧是老君,哪怕一个炼丹炉出现问题,也至少可以炼制一个,而不是双双毁掉。映射到我们的互联网系统:炼金炉类似于一个服务器节点或者一个数据库节点,通过多个节点相互备份数据,保证系统的高可用性(HighAvailability)。2.如何保证相同质量2.1一致性》太白金星:老君,你刚才说两种延年丹需要保证药效一致,大小一致?太上老君:的确,丹药品质必须一致,我炼制的都是九品丹药,药效差别很大。”太上老君说的品质一致是怎么回事?.1号丹炉和2号丹炉中的延年丹延年丹是如何保证品质一致的?这不就是我们常说的分布一致性吗?两种丹药分布在不同的丹炉中,需要保证品质的一致性。如下图所示,两颗延年丸一大一小,颜色也不一样,也就代表着品质不一样。质量不同,但是在架构设计上,比如请求访问不同的数据库,查到的数据都是一样的,这就是一致性。如下图所示:浏览器访问数据库1和数据库2中的数据A,结果返回A=1分布式系统中的一致性2.2最终一致性和强一致性分布式系统中的一致性又分为最终一致性和强一致性.所谓强一致性,就是写操作完成后,后续的任何访问都可以读到更新后的值。这就是CP系统所要求的一致性和分区容忍度。.你怎么理解炼金术?比如老君在一号炼丹炉的延年丹中加入了莲花药材,二号炼丹炉的延年丹也是如此。那么老白打开炉盖看到的就是这两种延年丹的成分是一样的。最终一致性并不能保证后续的访问都能读取到更新后的值,但是一段时间后,如果再次读取,可以得到相同的值。也就是说,在这段时间内,可能会读取到旧数据。这就是AP系统所要求的可用性和分区容错性。你怎么理解炼金术?比如老君在一号炼丹炉的延年丹中加入莲花,一个时辰后在二号炼丹炉中加入雪莲。延年丹的成分不同。但是一个小时后,最终的成分是一样的。3、质量可控:QuorumNWR协议“如果延年丹一定要保证质量的强一致性,而健步单只需要保证质量的最终一致性,这个应该怎么控制?”这对老君来说并不难,因为老君了解分布式协议:QuorumNWR。Quorum一词的意思:(会议的)法定人数。主要看下面三个大写字母:N,W,R。一致性由NWR控制。3.1参数N我们来看看丹炉中的情况。两颗延年丹互为备份,相当于拥有两份。N称为拷贝数,也称为复制因子(ReplicationFactor)。表示相同数据有多少份,所以:N=2为延年单。以此类推:N=2走丹,N=2恢复丹。如下图:丹药的份数相同,N可以改吗?3很好。不过剑部丹只需要炼制一粒就足够了,而一号丹炉可以炼制,所以N=1。多种丹药的份数不同。3.2参数W指定副本数N后,即可读写副本数据。读操作:查看丹炉内丹药的情况。写操作:在丹药中加入药材,提高温度。多个elixir应该如何进行读写操作?对于写操作,我们有W参数,对于读操作,我们有R参数。W称为写一致性级别(WriteConsistencyLevel),意思是在写操作完成之前W个副本更新已经成功完成。例如设置延年石的W=2,表示对延年石进行写操作时,只有更新了两个副本才完成写操作。如下图所示:一号丹炉和二号丹炉中的延年丹都添加了莲花,而三号丹炉中的延年丹没有添加莲花。即只更新了两个副本,满足W=2的条件,即写操作完成。两颗延年丹加在了莲花身上,不过大家也发现了问题所在。三号丹炉的延年丹还没有加入莲花。为了保证读写的强一致性,这就需要用到第三个参数:R。3.3参数RR称为读一致性级别(ReadConsistencyLevel),意思是读一个数据对象时,需要读R个副本,然后返回R个副本中最新的数据。回到炼丹的问题,设置延年丹的R=2,即查看延年丹情况时,只需要查看两个炼丹炉中延年丹的情况,然后返回最新的情况延年丹就是这样。假设你查看一号和二号丹炉中的延年丹,返回的结果是:莲花已加。这个场景是一致的。假设你看的是一号丹炉和三号丹炉中的延年丹,一号丹炉中的延年丹已经加入了莲花,而且一号丹炉的运行时间比一号丹炉要早.1号丹炉,于是回到1号丹炉中延年丹的情况:莲花已经加入。这个场景也是一致的。通过上面两个场景,我们知道通过设置R=2,即使读取到第三次未更新的数据,也可以返回更新的数据,实现强一致性。3.4参数组合参数N、W、R的不同组合会带来不同的一致性效果。比如上面的例子,N=3,W=2,R=2,W+R>N。对于客户端来说,整个系统可以保证强一致性,必须返回更新后的数据。当W+R<=N时,对于客户端来说,整个系统只能保证最终一致性,数据访问时可能会返回旧数据。不同的参数有不同的作用,分布式系统需要根据不同的场景进行配置。4.ApplicationInfluxDB企业版是一个时序数据库,有四个写入一致性级别:any:W+RN,大部分节点写入成功后,返回成功给客户端。(要求N大于2)all:W=N,所有节点写入成功后,返回成功。另外,对于时序数据库InfluxDB,读操作需要读取大量的数据。为了保证读的效率,不支持读一致性级别(R=N),但是可以通过设置写一致性级别为all来实现。一致性。InfluxDb实现了QuorumNWR。当线上业务需要做一些临时性的一致性调整时,设置不同的写入一致性级别可以完成快速切换。五、总结本文通过太上老君与太白金星的炼丹对话,衍生出一个自定义一致性的分布式协议:QuorumNWR协议。丹炉比作节点,药丸比作数据,多个药丸称为副本。N代表副本数,W代表写入副本数,R代表读取副本数。当N大于节点数时,一个节点会有多个副本。当该节点发生故障时,多个副本将受到影响。当W+R>N时,代表强一致性。当W=N时,读取性能良好。R=N,写入性能好。W=R=(N+1)/2,容错性好,可以容忍少量节点(即(N-1)/2)个节点故障。N、W、R值怎么设置,取决于我们的系统要优化的地方。QuorumNWR分布式算法为业务提供了按需选择一致性级别的灵活性,弥补了AP类系统强一致性的不足。本文转载自微信公众号“悟空聊天架构”,可通过以下二维码关注。转载本文请联系悟空聊天架构公众号。