深入理解分布式系统原理与设计

本文来重点说下分布式系统原理与设计


概述

模型

在这里插入图片描述

异常

机器宕机 :机器宕机是最常见的异常之一。在大型集群中每日宕机发生的概率为千分之一左右,在实践中,一台宕机的机器恢复的时间通常认为是24 小时,一般需要人工介入重启机器。

网络异常 :消息丢失,两片节点之间彼此完全无法通信,即出现了“网络分化”;消息乱序,有一定的概率不是按照发送时的顺序依次到达目的节点,考虑使用序列号等机制处理网络消息的乱序问题,使得无效的、过期的网络消息不影响系统的正确性;数据错误;不可靠的TCP,TCP 协议为应用层提供了可靠的、面向连接的传输服务,但在分布式系统的协议设计中不能认为所有网络通信都基于TCP 协议则通信就是可靠的。TCP协议只能保证同一个TCP 链接内的网络消息不乱序,TCP 链接之间的网络消息顺序则无法保证。

分布式三态 :如果某个节点向另一个节点发起RPC(Remote procedure call)调用,即某个节点A 向另一个节点B 发送一个消息,节点B 根据收到的消息内容完成某些操作,并将操作的结果通过另一个消息返回给节点A,那么这个RPC 执行的结果有三种状态:“成功”、“失败”、“超时(未知)”,称之为分布式系统的三态。

存储数据丢失 :对于有状态节点来说,数据丢失意味着状态丢失,通常只能从其他节点读取、恢复存储的状态。

*异常处理原则 :被大量工程实践所检验过的异常处理黄金原则是:任何在设计阶段考虑到的异常情况一定会在系统实际运行中发生,但在系统实际运行遇到的异常却很有可能在设计时未能考虑,所以,除非需求指标允许,在系统设计时不能放过任何异常情况。


副本

副本(replica/copy)指在分布式系统中为数据或服务提供的冗余。对于数据副本指在不同的节点上持久化同一份数据,当出现某一个节点的存储的数据丢失时,可以从副本上读到数据。数据副本是分布式系统解决数据丢失异常的唯一手段。另一类副本是服务副本,指数个节点提供某种相同的服务,这种服务一般并不依赖于节点的本地存储,其所需数据一般来自其他节点。

副本协议是贯穿整个分布式系统的理论核心


副本一致性

分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。

  • 强一致性(strong consistency) :任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。
  • 单调一致性(monotonic consistency) :任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。单调一致性是弱于强一致性却非常实用的一种一致性级别。因为通常来说,用户只关心从己方视角观察到的一致性,而不会关注其他用户的一致性情况。
  • 会话一致性(session consistency) :任何用户在某一次会话内一旦读到某个数据在某次更新后的值,这个用户在这次会话过程中不会再读到比这个值更旧的值。会话一致性通过引入会话的概念,在单调一致性的基础上进一步放松约束,会话一致性只保证单个用户单次会话内数据的单调修改,对于不同用户间的一致性和同一用户不同会话间的一致性没有保障。实践中有许多机制正好对应会话的概念,例如php 中的session 概念。
  • 最终一致性(eventual consistency) :最终一致性要求一旦更新成功,各个副本上的数据最终将达 到完全一致的状态,但达到完全一致状态所需要的时间不能保障。对于最终一致性系统而言,一个 用户只要始终读取某一个副本的数据,则可以实现类似单调一致性的效果,但一旦用户更换读取的 副本,则无法保障任何一致性。
  • 弱一致性(week consistency) :一旦某个更新成功,用户无法在一个确定时间内读到这次更新的 值,且即使在某个副本上读到了新的值,也不能保证在其他副本上可以读到新的值。弱一致性系统 一般很难在实际中使用,使用弱一致性系统需要应用方做更多的工作从而使得系统可用。

衡量分布式系统的指标

性能

性能 :系统的吞吐能力,指系统在某 一时间可以处理的数据总量,通常可以用系统每秒处理的总的数据量来衡量;系统的响应延迟,指 系统完成某一功能需要使用的时间;系统的并发能力,指系统可以同时完成某一功能的能力,通常 也用QPS(query per second)来衡量。上述三个性能指标往往会相互制约,追求高吞吐的系统,往往 很难做到低延迟;系统平均响应时间较长时,也很难提高QPS。

可用性

可用性 :系统的可用性(availability)指系统在面对各种异常时可以正确提供服务的能力。系统的可用性可 以用系统停服务的时间与正常服务的时间的比例来衡量,也可以用某功能的失败次数与成功次数的 比例来衡量。可用性是分布式的重要指标,衡量了系统的鲁棒性,是系统容错能力的体现。

可扩展性

可扩展性 :系统的可扩展性(scalability)指分布式系统通过扩展集群机器规模提高系统性能(吞吐、延迟、 并发)、存储容量、计算能力的特性。好的分布式系统总在追求“线性扩 展性”,也就是使得系统的某一指标可以随着集群中的机器数量线性增长。

一致性

一致性 :分布式系统为了提高可用性,总是不可避免的使用副本的机制,从而引发副本一致性的问题。越是强的一致的性模型,对于用户使用来说使用起来越简单。


分布式系统原理

数据分布方式

所谓分布式系统顾名思义就是利用多台计算机协同解决单台计算机所不能解决的计算、存储等 问题。单机系统与分布式系统的最大的区别在于问题的规模,即计算、存储的数据量的区别。将一 个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得 分布式系统中的每台机器负责原问题的一个子集。由于无论是计算还是存储,其问题输入对象都是 数据,所以如何拆解分布式系统的输入数据成为分布式系统的基本问题。


哈希方式

在这里插入图片描述
哈希分布数据的缺点同样明显,突出表现为可扩展性不高,一旦集群规模需要扩展,则几乎所 有的数据需要被迁移并重新分布。工程中,扩展哈希分布数据的系统时,往往使得集群规模成倍扩 展,按照数据重新计算哈希,这样原本一台机器上的数据只需迁移一半到另一台对应的机器上即可 完成扩展。

针对哈希方式扩展性差的问题,一种思路是不再简单的将哈希值与机器做除法取模映射,而是 将对应关系作为元数据由专门的元数据服务器管理.同时,哈希值取模个数往往大于机器个数,这样同一台机器上需 要负责多个哈希取模的余数。但需要以较复杂的机制维护大量的元数据。哈希分布数据的另一个缺点是,一旦某数据特征值的数据严重不均,容易出现“数据倾斜”(data skew)问题。

哈希分布数据的另一个缺点是,一旦某数据特征值的数据严重不均,容易出现“数据倾斜”(data skew)问题

在这里插入图片描述


按数据范围分布

按数据范围分布是另一个常见的数据分布式,将数据按特征值的值域范围划分为不同的区间, 使得集群中每台(组)服务器处理不同区间的数据。

在这里插入图片描述
在这里插入图片描述


按数据量分布

数据量分布数据与具体的数据特征无关,而是将数据视为一个顺序增长的文件,并将这个文件按照某 一较为固定的大小划分为若干数据块(chunk),不同的数据块分布到不同的服务器上。与按数据范 围分布数据的方式类似的是,按数据量分布数据也需要记录数据块的具体分布情况,并将该分布信 息作为元数据使用元数据服务器管理。

由于与具体的数据内容无关,按数据量分布数据的方式一般没有数据倾斜的问题,数据总是被 均匀切分并分布到集群中。当集群需要重新负载均衡时,只需通过迁移数据块即可完成。集群扩容 也没有太大的限制,只需将部分数据库迁移到新加入的机器上即可以完成扩容。按数据量划分数据 的缺点是需要管理较为复杂的元信息,与按范围分布数据的方式类似,当集群规模较大时,元信息 的数据量也变得很大,高效的管理元信息成为新的课题。


一致性哈希

在这里插入图片描述

在这里插入图片描述
使用一致性哈希的方式需要将节点在一致性哈希环上的位置作为元信息加以管理,这点比直接 使用哈希分布数据的方式要复杂。然而,节点的位置信息只于集群中的机器规模相关,其元信息的 量通常比按数据范围分布数据和按数据量分布数据的元信息量要小很多。

为此一种常见的改进算法是引入虚节点(virtual node)的概念,系统初始时就创建许多虚节点, 虚节点的个数一般远大于未来集群中机器的个数,将虚节点均匀分布到一致性哈希值域环上,其功 能与基本一致性哈希算法中的节点相同。为每个节点分配若干虚节点。操作数据时,首先通过数据 的哈希值在环上找到对应的虚节点,进而查找元数据找到对应的真实节点。使用虚节点改进有多个 优点。首先,一旦某个节点不可用,该节点将使得多个虚节点不可用,从而使得多个相邻的真实节 点负载失效节点的压里。同理,一旦加入一个新节点,可以分配多个虚节点,从而使得新节点可以 负载多个原有节点的压力,从全局看,较容易实现扩容时的负载均衡。


副本与数据分布

分布式系统容错、提高可用性的基本手段就是使用副本。对于数据副本的分布方式主要影响系统的可扩展性。一种基本的数据副本策略是以机器为单位,若干机器互为副本,副本机器之间的数据完全相同。这种策略适用于上述各种数据分布方式。其优点是非常简单,其缺点是恢复数据的效率不高、可扩展性也不高。

更合适的做法不是以机器作为副本单位,而是将数据拆为较合理的数据段,以数据段为单位作 为副本。实践中,常常使得每个数据段的大小尽量相等且控制在一定的大小以内。数据段有很多不 同的称谓,segment,fragment,chunk,partition 等等。数据段的选择与数据分布方式直接相关。对 于哈希分数据的方式,每个哈希分桶后的余数可以作为一个数据段,为了控制数据段的大小,常常 使得分桶个数大于集群规模。一旦将数据分为数据段,则可以以数据段为单位管理副本,从而副本与机器不再硬相关,每台 机器都可以负责一定数据段的副本。

在这里插入图片描述

一旦副本分布与机器无关,数据丢失后的恢复效率将非常高。这是因为,一旦某台机器的数据 丢失,其上数据段的副本将分布在整个集群的所有机器中,而不是仅在几个副本机器中,从而可以 从整个集群同时拷贝恢复数据,而集群中每台数据源机器都可以以非常低的资源做拷贝。作为恢复 数据源的机器即使都限速1MB/s,若有100 台机器参与恢复,恢复速度也能达到100MB/s。再者, 副本分布与机器无关也利于集群容错。如果出现机器宕机,由于宕机机器上的副本分散于整个集群, 其压力也自然分散到整个集群。最后,副本分布与机器无关也利于集群扩展。理论上,设集群规模 为N 台机器,当加入一台新的机器时,只需从各台机器上迁移1/N – 1/N+1 比例的数据段到新机器 即实现了新的负载均衡。由于是从集群中各机器迁移数据,与数据恢复同理,效率也较高。工程中,完全按照数据段建立副本会引起需要管理的元数据的开销增大,副本维护的难度也相 应增大。一种折中的做法是将某些数据段组成一个数据段分组,按数据段分组为粒度进行副本管理。这样做可以将副本粒度控制在一个较为合适的范围内。


本地化计算

在分布式系统中, 数据的分布方式也深深影响着计算的分布方式。在分布式系统中计算节点和保存计算数据的存储节点可以在同一台物理机器上,也可以位于不 同的物理机器。如果计算节点和存储节点位于不同的物理机器则计算的数据需要通过网络传输,此 种方式的开销很大,甚至网络带宽会成为系统的总体瓶颈。另一种思路是,将计算尽量调度到与存 储节点在同一台物理机器上的计算节点上进行,这称之为本地化计算。本地化计算是计算调度的一 种重要优化,其体现了一种重要的分布式调度思想:“移动数据不如移动计算”。


数据分布方式的选择

在实际工程实践中,可以根据需求 及实施复杂度合理选择数据分布方式。另外,数据分布方式是可以灵活组合使用的,往往可 以兼备各种方式的优点,收到较好的综合效果。

例:数据倾斜问题,在按哈希分数据的基础上引入按数据量分布 数据的方式,解决该数据倾斜问题。按用户id 的哈希值分数据,当某个用户id 的数据量特别大时, 该用户的数据始终落在某一台机器上。此时,引入按数据量分布数据的方式,统计用户的数据量, 并按某一阈值将用户的数据切为多个均匀的数据段,将这些数据段分布到集群中去。由于大部分用 户的数据量不会超过阈值,所以元数据中仅仅保存超过阈值的用户的数据段分布信息,从而可以控 制元数据的规模。这种哈希分布数据方式与按数据量分布数据方式组合使用的方案,在某真实系统 中使用,取得了较好的效果。


基本副本协议

副本控制协议指按特定的协议流程控制副本数据的读写行为,使得副本满足一定的可用性和一 致性要求的分布式协议。副本控制协议要具有一定的对抗异常状态的容错能力,从而使得系统具有 一定的可用性,同时副本控制协议要能提供一定一致性级别。由CAP 原理(在2.9 节详细分析)可 知,要设计一种满足强一致性,且在出现任何网络异常时都可用的副本协议是不可能的。为此,实 际中的副本控制协议总是在可用性、一致性与性能等各要素之间按照具体需求折中。

副本控制协议可以分为两大类:“中心化(centralized)副本控制协议”和“去中心化(decentralized) 副本控制协议”。


中心化副本控制协议

在这里插入图片描述
在这里插入图片描述


primary-secondary 协议

在primary-secondary 类型的协议中,副本被分为两大类,其中有且仅有一个副本作为primary 副本, 除primary 以外的副本都作为secondary 副本。维护primary 副本的节点作为中心节点,中心节点负 责维护数据的更新、并发控制、协调副本的一致性。

Primary-secondary 类型的协议一般要解决四大类问题:数据更新流程、数据读取方式、Primary 副本的确定和切换、数据同步(reconcile)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值