架构师之路 — 分布式系统 — 分布式一致性难题
目录
分布式一致性难题
在分布式系统中要解决的一个重要问题就是数据的复制。
分布式系统对于数据的复制需求一般都来自于以下 2 个原因:
- 为了增加系统的可用性,以防止单点故障引起的系统不可用;
- 提高系统的整体性能,通过负载均衡技术,能够让分布在不同地方的数据副本都能够为用户提供服务;
数据复制在可用性和性能方面给分布式系统带来的巨大好处是不言而喻的,然而数据复制所带来的一致性挑战,也是每一个系统研发人员不得不面对的。
所谓分布式一致性难题,是指在分布式系统中引入数据复制机制之后,不同数据节点之间可能出现的,并无法依靠计算机应用程序自身解决的数据不一致的情况。
简单讲,数据一致性就是指在对一个副本数据进行更新的时候,必须确保也能够更新其他的副本,否则不同副本之间的数据将不一致。
那么如何解决这个问题?
一种思路是 “既然是由于延时动作引起的问题,那我可以将写入的动作阻塞,直到数据复制完成后,才完成写入动作”。 没错,这似乎能解决问题,而且有一些系统的架构也确实直接使用了这个思路。但这个思路在解决一致性问题的同时,又带来了新的问题:“写入的性能”。如果你的应用场景有非常多的写请求,那么使用这个思路之后,后续的写请求都将会阻塞在前一个请求的写操作上,导致系统整体性能急剧下降。
总得来说,我们无法找到一种能够满足分布式系统所有系统属性的分布式一致性解决方案。因此,如何既保证数据的一致性,同时又不影响系统运行的性能,是每一个分布式系统都需要重点考虑和权衡的。于是,一致性级别由此诞生:
- 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。
- 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不久承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。
- 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。
分布式一致性算法
Paxos 算法
Paxos 算法是由 Lesile Lamport 提出的一种基于消息传递且具有高度容错特性的一致性算法。
Raft 算法
Raft 是实现分布式共识算法的一个协议。
Quorum NWR 算法
Quorum 机制是分布式场景中常用的,用来保证数据安全,并且在分布式环境中实现最终一致性的投票算法。这种算法的主要原理来源于鸽巢原理(又名狄利克雷抽屉原理、鸽笼原理)。它最大的优势,既能实现强一致性,而且还能自定义一致性级别。
分布式一致性的实现方式
复制技术是产生一致性问题的根源。通过复制来提高可用性,这是分布式系统设计的首要原则。
- 从复制类型来看,复制可以分为主动复制和被动复制。
- 从进程与系统交互角度来看,复制分为同步复制和异步复制。
目前有 3 大复制技术模型:
- 事务复制
- Paxos 复制
- 虚拟同步
主动复制
在主动复制中,每个客户端请求都由所有服务器处理。
主动复制要求由服务器托管的进程是确定性的,这意味着,给定相同的初始状态和请求序列,所有过程将产生相同的响应序列,并且最终处于相同的最终状态。为了使所有的服务器接收到相同的操作序列,一般都使用原子广播协议。原子广播协议保证所有服务器都接收到消息或没有消息,并且他们都以相同的顺序接收消息。
主动复制的主要缺点是实际上大多数真实世界的服务器都是非确定性的。
被动复制
在被动复制中,只有一个服务器(称为主服务器)处理客户机请求。
处理请求后,主服务器更新其他(备份)服务器上的状态,并将响应发送回客户端。如果主服务器发生故障,则其中一台备份服务器就会接管它。
被动复制可以用于非确定性过程。被动复制与主动复制相比的主要缺点是在失败的情况下,客户端的响应会被延迟。
同步复制
通过原子写入操作来保证 “零数据丢失”,即完全写入。在本地和远程副本存储的确认之前,写入不被认为是完整的。
异步复制
本地存储确认后,写入即被认为是完整的。远程存储已更新,但可能滞后很小。系统性能会因异步复制而大大提高。但是在丢失本地存储的情况下,远程存储不能保证具有当前的数据副本,并且最近的数据可能会丢失。
文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。
原文链接:is-cloud.blog.csdn.net/article/details/122794278
- 点赞
- 收藏
- 关注作者
评论(0)