其他分享
首页 > 其他分享> > 架构师们是如何解决分布式架构系统,带你设计一个完美的分布式系统。

架构师们是如何解决分布式架构系统,带你设计一个完美的分布式系统。

作者:互联网

1. 分布式系统相关概念

1.1 模型

阿里资深架构师教你如何设计出一个完美的分布式系统?


1.1.1 节点

节点是一个可以独立按照分布式协议完成一组逻辑的程序个体,工程中往往指进程。

1.1.2 通信

节点之间完全独立互相隔离,通信唯一方式是通过不可靠的网络。

1.1.3 存储

节点可以通过将数据写入与节点在同一台机器的本地存储设备保存数据

1.1.4 异常

(1) 机器down机

大型集群每日down机发生概率0.1%,后果是该机器节点不能工作、重启后失去所有内存信息。

(2) 网络异常

(3) 分布式系统的三态

任何请求都要考虑三种情况:成功、失败、超时。对于超时的请求,无法获知该请求是否被成功执行。

(4) 存储数据丢失

(5) 其他异常

IO操作缓慢、网络抖动、拥塞

1.2 副本

1.2.1 副本的概念

replica/copy 指在分布式系统中为数据或服务提供的冗余:

1.2.2 副本的一致性

副本的consistency是针对分布式系统而言的,不是针对某一个副本而言。根据强弱程度分为:

1.3 衡量分布式系统的指标

1.3.1 性能

1.3.2 可用性

系统停服务的时间与正常服务的时间的比例

1.3.3 可扩展性

通过扩展集群机器提高系统性能、存储容量、计算能力的特性,是分布式系统特有的性质

1.3.4 一致性

副本带来的一致性问题

1.3.5:分布式架构系统的可视化监控方案

1、架构师是如何解决分布式架构系统监控难题的。

2、ELK是谁,从哪里来,要到哪里去?

3、京东海量数据检索,我们一起来感受。

4、只需点击鼠标,高逼格监控界面一键搞定。

5、你离互联网架构师到底有远?听听就知道。

6、架构师的技术栈应该是怎样的?你来问,我一定答。

2. 分布式系统原理

2.1 数据分布方式

无论计算还是存储,问题输入对象都是数据,如何拆分分布式系统的输入数据称为分布式系统的基本问题。

2.1.1 哈希方式

一种常见的哈希方式是按照数据属于的用户id计算哈希。

阿里资深架构师教你如何设计出一个完美的分布式系统?


优点:

缺点:

2.1.2 按数据范围分布

将数据按特征值的值域范围划分数据。例如将用户id的值域分为[1, 33), [33, 90), [90, 100),由三台服务器处理。注意区间大小与区间内的数据大小没有关系。

阿里资深架构师教你如何设计出一个完美的分布式系统?


优点:

缺点:

2.1.3 按数据量分布

与按范围分布数据方式类似,元信息容易成为瓶颈

2.1.4 一致性哈希

(1) 以机器为节点

用一个hash函数计算数据(特征)的hash值,令该hash函数的值域成为一个封闭的环,将节点随机分布在环上。每个节点负责处理从自己开始顺时针到下一节点的值域上的数据。

优点:

缺点:

(2) 虚节点

虚节点,虚节点个数远大于机器个数,将虚节点均匀分布到值域环上,通过元数据找到真实机器节点。

优点:

2.1.5 副本与数据分布

前边4中数据分布方式的讨论中没有考虑数据副本的问题。

(1) 以机器为单位的副本

阿里资深架构师教你如何设计出一个完美的分布式系统?


缺点:

(2) 以数据段为单位的副本

例如3台服务器,10G数据,按100hash取模得到100M每个的数据段,每台服务器负责333个数据段。一旦将数据分成数据段,就可以以数据段为单位管理副本,副本与机器不再硬相关。

例如系统中3个数据o p q, 每个数据段有三个副本,系统中有4台机器:

阿里资深架构师教你如何设计出一个完美的分布式系统?


优点:

工程中完全按照数据段建立副本会引起元数据开销增大,这种做法是将数据段组成一个大数据段。

2.1.6 本地化计算

如果计算节点和存储节点位于不同的物理机器,开销很大,网络带宽会成为系统的瓶颈;将计算调度到与存储节点在同一台物理机器上的节点计算,称为计算本地化。

2.2 基本副本协议

2.2.1 中心化副本控制协议

单机系统使用加锁等方式进行并发控制,中心化协议也可以使用。缺点是过分依赖中心节点。

阿里资深架构师教你如何设计出一个完美的分布式系统?


2.2.2 primary-secondary协议

这是一种常用的中心化副本控制协议,有且仅有一个节点作为primary副本。有4个问题需要解决:

(1) 数据更新基本流程

阿里资深架构师教你如何设计出一个完美的分布式系统?


其中第4步,有些系统如GFS使用接力的方式同步数据,primary -> secondary1 ->secondary2,避免primary的带宽称为瓶颈。

(2) 数据读取方式

(3) primary副本的确定与切换

(4) 数据同步

当发生secondary与primary不一致的情况,需要secondary向primary进行同步(reconcile)。

不一致的原因有3种:

2.2.3 去中心化副本控制协议

去中心化副本控制协议没有中心节点,节点之间通过平等协商达到一致。工程中唯一能应用在强一致性要求下的是paxos协议。后续介绍。

2.3 lease机制

2.3.1 基于lease的分布式cache系统

(1) 需求:分布式系统中有一个节点A存储维护系统的元数据,系统中其他节点通过访问A读取修改元数据,导致A的性能成为系统瓶颈。为此,设计一种元数据cache,在各个节点上cache元数据信息,使得:

(2) 解决方案原理:

(3) 客户端节点读取元数据的流程

if (元数据处于本地cache && lease处于有效期内) {
 直接返回cache中的元数据;
} else {
 Result = 向A请求读取元数据信息;
 if (Result.Status == SUCCESS) {
 WriteToCache(Result.data, Result.lease);
 } else if (Result.Status == FAIL || Result.Status == TIMEOUT) {
 retry() or exit();
 }
}

(4) 客户端节点修改元数据的流程

(5) 优化点

2.3.2 lease机制的深入分析

(1) lease定义

lease是由颁发者授予的再某一有效期内的承诺。颁发者一旦发出lease,无论接收方是否收到,无论后续接收方处于何种状态,只要lease不过期则颁发者一定严守承诺;另一方面,接受者在lease的有效期内可以使用颁发者的承诺,一旦lease过期则一定不能继续使用。

(2) lease的解读

由于lease仅仅是一种承诺,具体的承诺内容可以非常宽泛,可以是上节中数据的正确性,也可以是某种权限。例如并发控制中同一时刻只给某一个节点颁发lease,只有持有lease才能修改数据;例如primary-secondary中持有lease的节点具有primary身份等等

(3) lease的高可用性

(4) lease的时钟同步

工程上将颁发者有效期设置的比接受者打,大过时钟误差,来避免对lease有效性产生影响。

2.3.3 基于lease机制确定节点状态。

在分 布式系统中确定一个节点是否处于正常工作状态困难的问题。由可能存在网络分化,节点的状态无法通过网络通信来确定的。

例如: a b c 互为副本 a为主节点,q为监控节点。q通过ping来判断abc的状态,认为a不能工作。就将主节点切换成b。但是事实上仅仅是ping没收到,a自己认为自己没有问题,就出现了 a b都觉得自己是主节点的“双主”问题。

解决方法是q在发送heartbeat时加上lease,表示确认了abc的状态,并允许节点在lease有效期内正常工作。q给primary节点一个特殊的lease,表示该节点作为primary工作。一旦q希望切换primary,只需要等待之前primary的lease过期,避免出现双主问题。

2.3.4 lease的有效期时间选择

工程上一般选择10秒钟

2.4 Quorum机制

2.4.1 Write-all-read-one

对于某次更新操作Wi,只有在所有N个副本上都更新成功,才认为是一次“成功提交的更新操作”,对应的数据为“成功提交的数据”,数据版本为Vi。

缺点:

2.4.2 Quorum定义

WARO最大程度增强读服务可用性,最大程度牺牲写服务的可用性。将读写可用性折中,就会得到Quorum机制:

Quorum机制下,某次更新Wi一旦在所有N个副本中的W个副本上成功,就称为“成功提交的更新操作”,对应的数据为“成功提交的数据”。令R > N - W,最多需要读取R个副本则一定能读到Wi更新后的数据Vi。

阿里资深架构师教你如何设计出一个完美的分布式系统?


由此可见WARO是Quorum中W = N时的一个特例。

2.4.3 读取最新成功提交的数据

Quorum的定义基于两个假设:

现在取消这两个假设,分析下面这个实际问题:

N = 5, W = 3, R = 3,某一次的副本状态为(V2 V2 V2 V1 V1)。理论上读取任何3个副本一定能读到最新的数据V2,但是仅读3个副本却无法确定读到最新的数据。

例如读到的是(V2 V1 V1),因为当副本状态为(V2 V1 V1 V1 V1)时也会读到(V2 V1 V1),而此时V2版本的数据是一次失败的提交。因此只读3个无法确定最新有效的版本是V2还是V1。

阿里资深架构师教你如何设计出一个完美的分布式系统?


解决方案:

因此单纯使用Quorum机制时,最多需要读取R + (W - R - 1) = N个副本才能确定最新成功提交的版本。实际工程中一般使用quorum与primary-secondary结合的手段,避免需要读取N个副本。

2.4.4 基于Quorum机制选择primary

通常情况下切换primary由监控节点q完成,引入quorum之后,选择新的primary的方式与读取数据相似,即q读取R个副本,选择R个副本中版本号最高的副本作为新的primary。新primary与除去q选举出的副本外,其余的至少W个副本完成数据同步后,再作为新的primary。

蕴含的道理是:

例如:N = 5 W = 3 R = 3的系统,某时刻副本状态(V2 V2 V1 V1 V1),此时V1是最新成功提交的数据,V2是处于中间状态未成功提交的数据。V2是作为脏数据扔掉,还是作为新数据被同步,完全取决于能否参与q主持的新primary的选举大会。如果q选择(V1 V1 V1),则在接下来的更新过程中 V2会被当成脏数据扔掉;如果q选择(V2 V1 V1)则V2会将V1更新掉,成为最新成功的数据。

阿里资深架构师教你如何设计出一个完美的分布式系统?


阿里资深架构师教你如何设计出一个完美的分布式系统?


2.5 日志技术

日志技术不是一种分布式系统技术,但分布式系统广泛使用日志技术做down机恢复。

2.5.1 数据库系统日志回顾

数据库的日志分为 undo redo redo/undo no-redo/no-undo四种,这里不做过多介绍。

2.5.2 redo与check point

通过redo log恢复down机的缺点是需要扫描整个redolog,回放所有redo日志。解决这个问题的办法是引入checkpoint技术,简化模型下checkpoint就是在begin和end中间,将内存以某种数据组织方式dump到磁盘上。这样down机恢复时只需要从最后一个end向前找到最近一个begin,恢复中间的内存状态即可。

2.5.3 no-undo/no-redo

这种技术也叫做01目录,即有两个目录,活动目录和非活动目录,另外还有一个主记录,要么“记录目录0”,妖魔记录“使用目录1”,目录0和1记录了各个数据在日志文件中的位置。

2.6 两阶段提交协议

2.7 基于MVCC的分布式事务

由于这两个都与数据库事务有关,且两阶段提交协议在工程中使用价值不高,均略去不谈。

2.8 Paxos协议

唯一在工程中有使用价值的去中心化副本节点控制协议。过于复杂,没看懂。

2.9 CAP理论

无法设计一种分布式协议,使得完全具备CAP三个属性。永远只能介于三者之间折中。理论的意义是:不要妄想设计完美的分布式系统。


标签:副本,primary,V1,分布式系统,架构师,lease,数据,节点,分布式
来源: https://blog.51cto.com/14227759/2409176