分布式系统中常见一致性算法
分布式一致性理论
1.为什么要使用分布式
随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题,大型网站的架构也在不断发展。单体架构或者说集中式系统在处理大量并发或数据的业务场景中越来越显得捉襟见肘,此时分布式架构应运而生。
谈到分布式系统,就不得不提到另一种集中式系统,集中式系统有一个大型的中央处理系统,中央处理系统时一台高性能、可扩充的计算机,所有的数据、运算、处理任务全部在中央计算机系统上完成。中央计算机连接多个终端,终端用来输入和输出,不具有数据处理能力。远程终端通过网络连接到中央计算机,它们得到的信息是一致的。我们日常生活中常用的ATM机等都是用的集中式系统
这种系统架构的优点主要是1.数据容易备份,只需要把中央计算机上的数据进行备份即可 2.在开发业务相对简单的系统时,总费用较低,只需要中央计算机的功能强大,终端只需要简单便宜的设备。缺点也很明显,在面对体量较大的业务时,性能扩展的成本太高,因为系统的总算力往往只取决于中央计算机的性能,另外集中式系统采用的单体架构,各业务模块之间的耦合度较高,导致架构的可拓展性较低
而在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作系统。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件中间件(middleware)负责实现这个模型 (百度百科“分布式系统”)
简言之,分布式系统中的数据存储、任务的处理分布在网络中的不同机器上,每台主机都是一个独立的系统,联网的目的是为了获取更多的资源、丰富的服务。
分布式系统具有如下的特点:
数据分散存储在网络中的不同主机上,系统中存在数据冗余,当一台机器发生故障时,可以使用另一台主机的备份。
每台主机可以缓存本地最常用的数据,不需要频繁地访问服务器,减轻了服务器的负担,减少了网络的流量。
服务器也可以对任务进行分配和优化,克服几种系统中央计算机资源紧张的瓶颈。
用户可以根据自己的需要在自己的主机上安装不同的操作系统、应用软件,使用不同的服务,
不再像集中式计算机系统那样受限于中央计算机的功能。
但是,分布式系统因为网络的不确定性,节点故障等情况,会带来各种复杂的问题
2.分布式系统的问题
1.通信异常:从集中式向分布式演变过程中,必然会引入网络因素,而由于网络本身的不可靠性,因此也引入了额外的问题。分布式系统需要在各个节点之间进行网络通信,因此当网络通信设备故障就会导致无法顺利完成一次网络通信,就算各节点的网络通信正常,但是消息丢失和消息延时也是非常普遍的事情。
2.网络分区(脑裂):网络发生异常情况导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式系统的所有节点,只有部分节点能够正常通行,而另一些节点则不能。我们称这种情况叫做网络分区(脑裂),当网络分区出现时,分布式系统会出现多个局部小集群(多个小集群可能又会产生多个master节点),所以分布式系统要求这些小集群要能独立完成原本需要整个分布式系统才能完成的功能,这就对分布式一致性提出了非常大的挑战。
3.节点故障:节点宕机是分布式环境中的常态,每个节点都有可能会出现宕机或僵死的情况,并且每天都在发生。
4.三态:由于网络不可靠的原因,因此分布式系统的每一次请求,都存在特有的“三态”概念,即:成功,失败与超时。在集中式单机部署中,由于没有网络因素,所以程序的每一次调用都能得到“成功”或者“失败”的响应,但是在分布式系统中,网络不可靠,可能就会出现超时的情况。可能在消息发送时丢失或者在响应过程中丢失,当出现超时情况时,网络通信的发起方是无法确定当前请求是否被成功处理的,所以这也是分布式事务的难点。
上面介绍的这几种情况,都有可能导致分布式系统产生数据一致性的问题。我们在分布式系统中,经常或存在数据复制的需求,主要有以下两种原因
高可用:将数据复制到分布式部署的多台机器中,可以消除单点故障,防止系统由于某台(些)机器宕机导致的不可用。
性能:通过负载均衡技术,能够让分布在不同地方的数据副本全都对外提供服务。有效提高系统性能。
在分布式系统引入复制机制后,不同的数据节点之间由于网络延时等原因很容易产生数据不一致的情况。复制机制的目的是为了保证数据的一致性。但是数据复制面临的主要难题也是如何保证多个副本之间的数据一致性。
对分布式数据一致性简单的解释就是:当对集群中一个副本数据进行更新的同时,必须确保能够同步更新到其他副本,否则不同副本之间的数据将不再一致。举个例子来说就是:当客户端C1将系统中的一个值K由V1更新为V2,但是客户端C2读的是另一个还没有同步更新的副本,K的值依然是V1,这就导致了数据的不一致性。其中,常见的就是主从数据库之间的复制延时问题。