分布式系统概述
2022-10-19 15:22:42 12 举报
AI智能生成
分布式系统概述
作者其他创作
大纲/内容
概念
模型
节点
在具体的工程项目中,一个节点往往是一个操作系统上的进程。
下述中认为节点是一个完整的、不可分的整体,如果某个程序进程实际上由若干相对独立部分构成,则在模型中可以将一个进程划分为多个节点。
下述中认为节点是一个完整的、不可分的整体,如果某个程序进程实际上由若干相对独立部分构成,则在模型中可以将一个进程划分为多个节点。
异常
机器宕机
机器宕机是最常见的异常之一。
在大型集群中每日宕机发生的概率为千分之一左右,在实践中,一台宕机的机器恢复的时间通常认为是24 小时,一般需要人工介入重启机器。
在大型集群中每日宕机发生的概率为千分之一左右,在实践中,一台宕机的机器恢复的时间通常认为是24 小时,一般需要人工介入重启机器。
网络异常
消息丢失,两片节点之间彼此完全无法通信,即出现了“网络分化”;
消息乱序,有一定的概率不是按照发送时的顺序依次到达目的节点,考虑使用序列号等机制处理网络消息的乱序问题,使得无效的、过期的网络消息不影响系统的正确性;
数据错误,不可靠的TCP,TCP 协议为应用层提供了可靠的、面向连接的传输服务,但在分布式系统的协议设计中不能认为所有网络通信都基于TCP 协议则通信就是可靠的。TCP协议只能保证同一个TCP 链接内的网络消息不乱序,TCP 链接之间的网络消息顺序则无法保证。
分布式三态
如果某个节点向另一个节点发起RPC(Remote procedure call)调用,即某个节点A 向另一个节点B 发送一个消息,节点B 根据收到的消息内容完成某些操作,并将操作的结果通过另一个消息返回给节点A,
那么这个RPC 执行的结果有三种状态:“成功”、“失败”、“超时(未知)”,称之为分布式系统的三态。
那么这个RPC 执行的结果有三种状态:“成功”、“失败”、“超时(未知)”,称之为分布式系统的三态。
存储数据丢失
对于有状态节点来说,数据丢失意味着状态丢失,通常只能从其他节点读取、恢复存储的状态。
异常处理原则
被大量工程实践所检验过的异常处理黄金原则是:
任何在设计阶段考虑到的异常情况一定会在系统实际运行中发生,但在系统实际运行遇到的异常却很有可能在设计时未能考虑,所以,除非需求指标允许,在系统设计时不能放过任何异常情况。
任何在设计阶段考虑到的异常情况一定会在系统实际运行中发生,但在系统实际运行遇到的异常却很有可能在设计时未能考虑,所以,除非需求指标允许,在系统设计时不能放过任何异常情况。
副本
副本协议是贯穿整个分布式系统的理论核心。
副本(replica/copy)指在分布式系统中为数据或服务提供的冗余。对于数据副本指在不同的节点上持久化同一份数据,当出现某一个节点的存储的数据丢失时,可以从副本上读到数据。数据副本是分布式系统解决数据丢失异常的唯一手段。另一类副本是服务副本,指数个节点提供某种相同的服务,这种服务一般并不依赖于节点的本地存储,其所需数据一般来自其他节点。
副本一致性
分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。
强一致性(strong consistency)
任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。
单调一致性(monotonic consistency)
任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。单调一致性是弱于强一致性却非常实用的一种一致性级别。因为通常来说,用户只关心从己方视角观察到的一致性,而不会关注其他用户的一致性情况。
会话一致性(session consistency)
任何用户在某一次会话内一旦读到某个数据在某次更新后的值,这个用户在这次会话过程中不会再读到比这个值更旧的值。会话一致性通过引入会话的概念,在单调一致性的基础上进一步放松约束,会话一致性只保证单个用户单次会话内数据的单调修改,对于不同用户间的一致性和同一用户不同会话间的一致性没有保障。实践中有许多机制正好对应会话的概念,例如php 中的session 概念。
最终一致性(eventual consistency)
最终一致性要求一旦更新成功,各个副本上的数据最终将达到完全一致的状态,但达到完全一致状态所需要的时间不能保障。对于最终一致性系统而言,一个用户只要始终读取某一个副本的数据,则可以实现类似单调一致性的效果,但一旦用户更换读取的副本,则无法保障任何一致性。
弱一致性(week consistency)
一旦某个更新成功,用户无法在一个确定时间内读到这次更新的值,且即使在某个副本上读到了新的值,也不能保证在其他副本上可以读到新的值。弱一致性系统一般很难在实际中使用,使用弱一致性系统需要应用方做更多的工作从而使得系统可用。
衡量分布式系统的指标
性能
系统的吞吐能力,指系统在某一时间可以处理的数据总量,通常可以用系统每秒处理的总的数据量来衡量;系统的响应延迟,指系统完成某一功能需要使用的时间;系统的并发能力,指系统可以同时完成某一功能的能力,通常也用QPS(query per second)来衡量。上述三个性能指标往往会相互制约,追求高吞吐的系统,往往很难做到低延迟;系统平均响应时间较长时,也很难提高QPS。
可用性
系统的可用性(availability)指系统在面对各种异常时可以正确提供服务的能力。系统的可用性可以用系统停服务的时间与正常服务的时间的比例来衡量,也可以用某功能的失败次数与成功次数的比例来衡量。可用性是分布式的重要指标,衡量了系统的鲁棒性,是系统容错能力的体现。
可扩展性
系统的可扩展性(scalability)指分布式系统通过扩展集群机器规模提高系统性能(吞吐、延迟、并发)、存储容量、计算能力的特性。好的分布式系统总在追求“线性扩展性”,也就是使得系统的某一指标可以随着集群中的机器数量线性增长。
一致性
分布式系统为了提高可用性,总是不可避免的使用副本的机制,从而引发副本一致性的问题。越是强的一致的性模型,对于用户使用来说使用起来越简单。
分布式系统原理
数据分布方式
所谓分布式系统顾名思义就是利用多台计算机协同解决单台计算机所不能解决的计算、存储等问题。单机系统与分布式系统的最大的区别在于问题的规模,即计算、存储的数据量的区别。将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得分布式系统中的每台机器负责原问题的一个子集。由于无论是计算还是存储,其问题输入对象都是数据,所以如何拆解分布式系统的输入数据成为分布式系统的基本问题。
哈希方式
扩展性差
数据倾斜
按数据范围分布
按数据量分布
一致性哈希
副本与数据分布
本地化计算
将计算尽量调度到与存储节点在同一台物理机器上的计算节点上进行,这称之为本地化计算。
本地化计算是计算调度的一种重要优化,其体现了一种重要的分布式调度思想:“移动数据不如移动计算”。
本地化计算是计算调度的一种重要优化,其体现了一种重要的分布式调度思想:“移动数据不如移动计算”。
数据分布方式的选择
根据需求及实施复杂度合理选择数据分布方式
基本副本协议
副本控制协议指按特定的协议流程控制副本数据的读写行为,使得副本满足一定的可用性和一致性要求的分布式协议。
副本控制协议要具有一定的对抗异常状态的容错能力,从而使得系统具有一定的可用性,同时副本控制协议要能提供一定一致性级别。
由CAP 原理(在2.9 节详细分析)可知,要设计一种满足强一致性,且在出现任何网络异常时都可用的副本协议是不可能的。
为此,实际中的副本控制协议总是在可用性、一致性与性能等各要素之间按照具体需求折中。
副本控制协议要具有一定的对抗异常状态的容错能力,从而使得系统具有一定的可用性,同时副本控制协议要能提供一定一致性级别。
由CAP 原理(在2.9 节详细分析)可知,要设计一种满足强一致性,且在出现任何网络异常时都可用的副本协议是不可能的。
为此,实际中的副本控制协议总是在可用性、一致性与性能等各要素之间按照具体需求折中。
中心化副本控制协议
一个中心节点协调副本数据的更新、维护副本之间的一致性
缺点是系统的可用性依赖于中心化节点,当中心节点异常或与中心节点通信中断时,系统将失去某些服务(通常至少失去更新服务),所以中心化副本控制协议的缺点正是存在一定的停服务时间。
primary-secondary 协议
副本被分为两大类,其中有且仅有一个副本作为primary 副本,除primary 以外的副本都作为secondary 副本
维护primary 副本的节点作为中心节点,中心节点负责维护数据的更新、并发控制、协调副本的一致性。
解决四大类问题:数据更新流程、数据读取方式、Primary 副本的确定和切换、数据同步(reconcile)
数据更新基本流程
1.数据更新都由primary 节点协调完成。
2.外部节点将更新操作发给primary 节点
3.primary 节点进行并发控制即确定并发更新操作的先后顺序
4.primary 节点将更新操作发送给secondary 节点
5.primary 根据secondary 节点的完成情况决定更新是否成功并将结果返回外部节点
2.外部节点将更新操作发给primary 节点
3.primary 节点进行并发控制即确定并发更新操作的先后顺序
4.primary 节点将更新操作发送给secondary 节点
5.primary 根据secondary 节点的完成情况决定更新是否成功并将结果返回外部节点
在工程实践中,如果由primary 直接同时发送给其他N 个副本发送数据,则每个 secondary 的更新吞吐受限于primary 总的出口网络带宽,最大为primary 网络出口带宽的1/N。
为了解决这个问题,有些系统(例如,GFS),使用接力的方式同步数据,即primary 将更新发送给第一 个secondary 副本,第一个secondary 副本发送给第二secondary 副本,依次类推。
为了解决这个问题,有些系统(例如,GFS),使用接力的方式同步数据,即primary 将更新发送给第一 个secondary 副本,第一个secondary 副本发送给第二secondary 副本,依次类推。
数据读取方式
数据读取方式也与一致性高度相关。
如果只需要最终一致性,则读取任何副本都可以满足需求。
如果需要会话一致性,则可以为副本设置版本号,每次更新后递增版本号,用户读取副本时验证版本号,从而保证用户读到的数据在会话范围内单调递增。
使用primary-secondary 比较困难的是实现强一致性。
如果只需要最终一致性,则读取任何副本都可以满足需求。
如果需要会话一致性,则可以为副本设置版本号,每次更新后递增版本号,用户读取副本时验证版本号,从而保证用户读到的数据在会话范围内单调递增。
使用primary-secondary 比较困难的是实现强一致性。
primary 副本的确定与切换
数据同步
去中心化副本控制协议
去中心化副本控制协议没有中心节点,协议中所有的节点都是完全对等的,节点之间通过平等协商达到一致。
从而去中心化协议没有因为中心化节点异常而带来的停服务等问题。
从而去中心化协议没有因为中心化节点异常而带来的停服务等问题。
去中心化协议的最大的缺点是协议过程通常比较复杂。
尤其当去中心化协议需要实现强一致性时,协议流程变得复杂且不容易理解。
由于流程的复杂,去中心化协议的效率或者性能一般也较中心化协议低。
一个不恰当的比方就是,
中心化副本控制协议类似专制制度,系统效率高但高度依赖于中心节点,一旦中心节点异常,系统受到的影响较大;
去中心化副本控制协议类似民主制度,节点集体协商,效率低下,但个别节点的异常不会对系统总体造成太大影响。
尤其当去中心化协议需要实现强一致性时,协议流程变得复杂且不容易理解。
由于流程的复杂,去中心化协议的效率或者性能一般也较中心化协议低。
一个不恰当的比方就是,
中心化副本控制协议类似专制制度,系统效率高但高度依赖于中心节点,一旦中心节点异常,系统受到的影响较大;
去中心化副本控制协议类似民主制度,节点集体协商,效率低下,但个别节点的异常不会对系统总体造成太大影响。
Lease 机制
应用
GFS中,Master通过lease机制决定哪个是主副本,lease在给各节点的心跳响应消息中携带。收不到心跳时,则等待lease过期,再颁发给其他节点。
Niobe中,主副本持有从副本颁发的lease,当lease过期时,主从分别会在中心节点上标记对方不可用,而中心节点是全局一致的,两者只有一个会成功。如果主成功了,从不可用,需要重新与主同步才能可用;如果从成功了,则自己成为新主。
chubby中,paxos选主后,从节点会给主颁发lease,在期限内不选其他节点为主。另一方面,主节点给每个client节点发送lease,用于判断client死活。
zookeeper中,选主不用lease,而是直接发现没有主则选主。其余和chubby一致。
Niobe中,主副本持有从副本颁发的lease,当lease过期时,主从分别会在中心节点上标记对方不可用,而中心节点是全局一致的,两者只有一个会成功。如果主成功了,从不可用,需要重新与主同步才能可用;如果从成功了,则自己成为新主。
chubby中,paxos选主后,从节点会给主颁发lease,在期限内不选其他节点为主。另一方面,主节点给每个client节点发送lease,用于判断client死活。
zookeeper中,选主不用lease,而是直接发现没有主则选主。其余和chubby一致。
定义
lease 是由颁发者授予的在某一有效期内的承诺。
颁发者一旦发出 lease,则无论接受方是否收到,也无论后续接收方处于何种状态,只要 lease 不过期,颁发者一定严守承诺;
另一方面,接收方在 lease 的有效期内可以使用颁发者的承诺,但一旦 lease 过期,接收方一定不能继续使用颁发者的承诺。
颁发者一旦发出 lease,则无论接受方是否收到,也无论后续接收方处于何种状态,只要 lease 不过期,颁发者一定严守承诺;
另一方面,接收方在 lease 的有效期内可以使用颁发者的承诺,但一旦 lease 过期,接收方一定不能继续使用颁发者的承诺。
基本原理
中心服务器在向各节点发送数据时同时颁发一个 lease,每个 lease 具有一个有效期,该有效期通常是一个明确的时间点,例如 12:00:10,|
一旦真实时间超过这个时间点,则 lease 过期失效(假设中心服务器与各节点的时钟是同步的)
一旦真实时间超过这个时间点,则 lease 过期失效(假设中心服务器与各节点的时钟是同步的)
核心为 承诺
1.在 lease 的有效期内,中心服务器保证不会修改对应数据的值;
2.节点收到数据和 lease 后,将数据加入本地 cache,一旦对应的 lease 超时,节点保证将对应的本地 cache 数据删除并重新发起读请求;
3.中心服务器在修改数据时,首先阻塞所有新的读请求,并等待之前为该数据发出的所有 lease 超时过期,然后修改数据的值。
2.节点收到数据和 lease 后,将数据加入本地 cache,一旦对应的 lease 超时,节点保证将对应的本地 cache 数据删除并重新发起读请求;
3.中心服务器在修改数据时,首先阻塞所有新的读请求,并等待之前为该数据发出的所有 lease 超时过期,然后修改数据的值。
Quorum 机制
日志技术
Redo Log 与Check point
两阶段提交协议
MVCC
Paxos协议
CAP
0 条评论
下一页