这是我参与「第四届青训营 」笔记创作活动的第27天
为什么
为什么我们需要分布式系统?分布式系统又为什么需要满足一致性呢?我们应该从背景和功能进行考虑:
- 背景:数据规模的不断增加,我们需要大规模分布式系统
- 功能:对于一个分布式系统,希望能有哪些特征
针对特征,我们自然是希望对于一个分布式系统,在用户的角度上与单机没有差别。因此,首先我们需要满足一致性:在一台机器挂掉后,另一台相同数据、相同功能的机器顶替他的职位。如何保证这两台,甚至多台机器的数据是一致的呢?这就引出了今天的主角——分布式一致性协议
怎么做
从复制开始
一个非常简单的思路就是,分布式主从架构,定期将主副本拷贝到从副本。
这个是很容易想到的,但是很遗憾它的一致性十分薄弱。
主机挂掉之后,从机只有上次的数据,从上一次到主机挂掉期间的数据是没有的,大量的数据缺失是100%会造成严重后果。
同时,挂掉之后主机的切换又如何完成呢?是人为切换吗?如何判别主机是否真的挂掉了?增加从机数是否会增加主机的IO压力?
共识算法
所谓的一致性,就是由需求开始,从最简单的复制发展而来的理论或者说协议,为了达成协议,相关领域的专家衍生出了不少算法,统称为共识算法。
The consensus problem requires agreement among a number of processes (or agents) fora single data value. Some of the processes (agents) may fail or be unreliable in other ways,so consensus protocols must be fault tolerant or resilient
共识问题需要多个过程(或代理)对单个数据值达成一致。某些过程(代理)可能会以其他方式失败或不可靠,因此共识协议必须具有容错或弹性
需要注意的是,共识协议不完全等价于一致性,共识往往只能在某一方面或某几方面达成一致性,共识协议所提到的一致性也往往指的是线性一致性。
Paxos
这个算法以数学的形式完成了一致性协议,从数学上证明了完备性。但是由于纯粹的基于数学,这个算法是难以理解的,你很难对算法进行拆分并融入到现有的系统之中。
Google is described in realizing Chubby:
here are significant gaps between the description of the Paxos algorithm and the needs of areal-world system. . . . the final system will be based on an unproven protocol .
谷歌实现Chubby时曾描述道:
在Paxos算法的描述和现实世界系统. . . .的需求之间有很大的差距最终的系统将基于一个未经证实的协议。
Raft
OK,这个才是重头戏。这个共识算法是易于理解的(只是相对而言哈)
-
2014年发表
-
易于理解作为算法的设计目标
- 使用了RSM、Log、RPC的概念
- 直接使用RPC对算法进行了描述
- Strong Leader-based
- 使用了随机的方法减少约束
-
正确性
- 形式化验证
- 拥有大量成熟系统
Raft正确运行时
首先是所有机器中,选出一个leader,leader要求版本不低于其他版本。
指针:一开始指向的是最后一位已存在的数据
开始:leader接收到新的数据,指针进位
-> leader写入该数据,并向其他节点发送信号与数据
-> 其他节点接收数据,指针进位并写入,响应leader
-> leader接收到大部分响应后,指针进位,等待接收下一个数据
Raft节点不同步时
正确运行节点照常运行,这里只说明不同步的那一个节点
那个不同步的节点就简称 "坏节点" 好了
开始:leader接收到新的数据,指针进位
-> leader写入该数据,并向坏节点发送信号与数据
-> 坏节点接收信号,对比版本,发现自己下一个版本与该版本对不上,返还信号
-> leader接收信号后,连同上一个版本的信号与数据发送给坏节点
-> 坏节点接收信号,对比版本,还是对不上,返还信号
-> leader接收信号后,再连同上上版本的信号与数据发送给坏节点
-> 坏节点接收信号,对比版本,匹配成功,指针进位,将所有数据写入,返回正确信号
-> leader接收响应后,指针进位,等待接收下一个数据
其他
当然,还有各种各样的其他情况,这里就不一一列举了,比如主节点挂掉怎么办等等,这些 Raft 都有相应的应对措施。
Raft之外的bug
Raft 考虑的都是十分理想化的问题,还有问题是它没有考虑到的。比如网络问题:这个节点他挂了,但没有完全挂
由于网络问题,你会发现存在这样类似的问题:你访问百度很快,但访问外网很慢
假设主节点网络部分不稳定,就会导致十分严重问题,这是一个真实案例,可以去网上搜索以下。
总结
这次没什么总结的,我能总结的说出来的就是上面关于 Raft 场景案例的具体处理流程,其他的还需要加强学习。