分布式面试必会(2022最新版)

一. 模型

1. 节点

在具体的工程项目中,一个节点往往是一个操作系统上的进程。在本文的模型中,认 为节点是一个完整的、不可分的整体,如果某个程序进程实际上由若干相对独立部分 构成,则在模型中可以将一个进程划分为多个节点。

异常

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

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

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

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

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

副本

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

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

副本一致性

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

  1. 强一致性(strong consistency):任何时刻任何用户或节点都可以读到最近 一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最 难以实现的一致性。 

  2. 单调一致性(monotonic consistency):任何时刻,任何用户一旦读到某个 数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。单调一致性 是弱于强一致性却非常实用的一种一致性级别。因为通常来说,用户只关心从 己方视角观察到的一致性,而不会关注其他用户的一致性情况。 

  3. 会话一致性(session consistency):任何用户在某一次会话内一旦读到某 个数据在某次更新后的值,这个用户在这次会话过程中不会再读到比这个值更 旧的值。会话一致性通过引入会话的概念,在单调一致性的基础上进一步放松 约束,会话一致性只保证单个用户单次会话内数据的单调修改,对于不同用户 间的一致性和同一用户不同会话间的一致性没有保障。实践中有许多机制正好 对应会话的概念,例如php 中的session 概念。 

  4. 最终一致性(eventual consistency):最终一致性要求一旦更新成功,各个 副本上的数据最终将达 到完全一致的状态,但达到完全一致状态所需要的时间 不能保障。对于最终一致性系统而言,一个用户只要始终读取某一个副本的数 据,则可以实现类似单调一致性的效果,但一旦用户更换读取的副本,则无法 保障任何一致性。 

  5. 弱一致性(week consistency):一旦某个更新成功,用户无法在一个确定 时间内读到这次更新的值,且即使在某个副本上读到了新的值,也不能保证在 其他副本上可以读到新的值。弱一致性系统一般很难在实际中使用,使用弱一 致性系统需要应用方做更多的工作从而使得系统可用。

3. 衡量分布式系统的指标

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

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

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

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

二. 分布式系统原理

4. 数据分布方式

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

哈希方式

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

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

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

按数据范围分布

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

工程中,为了数据迁移等负载均衡操作的方便,往往利用动态划分区间的技术,使得 每个区间中服务的数据量尽量的一样多。当某个区间的数据量较大时,通过将区 间“分裂”的方式拆分为两个区间,使得每个数据区间中的数据量都尽量维持在一个 较为固定的阈值之下。

一般的,往往需要使用专门的服务器在内存中维护数据分布信息,称这种数据的分布 信息为一种元信息。甚至对于大规模的集群,由于元信息的规模非常庞大,单台 计算 机无法独立维护,需要使用多台机器作为元信息服务器。

按数据量分布

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

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

一致性哈希

一致性哈希(consistent hashing)是另一个种在工程中使用较为广泛的数据分布方 式。一致性哈希最初在P2P 网络中作为分布式哈希表(DHT)的常用数据分布算法。一致性哈希的基本方式是使用一个哈希函数计算数据或数据特征的哈希值,令该哈希 函数的输出值域为一个封闭的环,即哈希函数输出的最大值是最小值的前序。将节点 随机分布到这个环上,每个节点负责处理从自己开始顺时针至下一个节点的全部哈希 值域上的数据。

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

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

副本与数据分布

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值