- 分布式系统:部署在不同结点上的系统通过网络交互来完成协同工作的系统
- 一致性(Consistency):服务A、B、C三个结点都存储了用户数据, 三个结点的数据需要保持同一时刻数据一致性。
- 对系统的一个数据更新成功之后,如果所有用户都能够读取到最新的值,该系统就被认为具有强一致性
- 可用性(Availability):服务A、B、C三个结点,其中一个结点宕机不影响整个集群对外提供服务,如果只有服务A结 点,当服务A宕机整个系统将无法提供服务,增加服务B、C是为了保证系统的可用性。
- 对于用户的每一个操作请求总是能够在有限的时间内返回结果
- 分区容忍性(Partition Tolerance):分区容忍性就是允许系统通过网络协同工作,分区容忍性要解决由于网络分区导致数据的不完整及无法访问等问题。
最多只能同时满足其中两项
分布式系统中,分区容忍性必不可少,因为需要总是假设网络是不可靠的,所以CAP理论实际上是要在可用性和一致性之间做权衡
- 保证一致性(CP),不能访问未同步完成的节点,也就失去了部分可用性
脑裂
n/2+1 过半! 使用奇数台!
- 保证可用性(AP),允许读取所有节点的数据,但是数据可能不一致
- BA:(Basically Available ),基本可用
- 分布式系统在出现故障的时候,保证核心可用,允许损失部分可用性
- S:( Soft State),软状态,状态可以在一段时间内不同步
- 允许系统不同节点的数据副本之间进行同步的过程存在时延
- E:(Eventually Consistent ),最终一致,在一定的时间窗口内, 最终数据达成一致即可
对多个节点产生的值,该算法能保证只选出唯一一个值
- 提议者(Proposer):提议一个值
- 接受者(Acceptor):对每个提议进行投票
- 告知者(Learner):被告知投票的结果,不参与投票过程
Paxos描述了这样一个场景,有一个叫做Paxos的小岛(Island)上面住了一批居民,岛上面所有的事情由一些特殊的人决定,他们叫做议员(Senator)。议员的总数(Senator Count)是确定的,不能更改。岛上每次环境事务的变更都需要通过一个提议(Proposal),每个提议都有一个编号(PID),这个编号是一直增长的,不能倒退。每个提议都需要超过半数((Senator Count)/2 +1)的议员同意才能生效。每个议员只会同意大于当前编号的提议,包括已生效的和未生效的。如果议员收到小于等于当前编号的提议,他会拒绝,并告知对方:你的提议已经有人提过了。这里的当前编号是每个议员在自己记事本上面记录的编号,他不断更新这个编号。整个议会不能保证所有议员记事本上的编号总是相同的。现在议会有一个目标:保证所有的议员对于提议都能达成一致的看法
一些paxos原型描述:https://www.douban.com/note/208430424/
分布式一致性协议,主要是用来竞选主节点
有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段
竞选阶段Candidate会向其他节点发送投票请求,Follower同意投票则向该Candidate回复同意投票
当 Candidate获得超过半数票时,就成为Leader节点 如果有多个Candidate获得相同的票数,则重新开始投票 每个节点设置的随机竞选超时时间不同,因此下一次再次出现多个 Candidate 并获得同样票数的概率很低
- 自客户端的修改都会被传入 Leader。此时该修改还未被提交,只是写入日志中
- Leader 会把修改复制到所有 Follower
- Leader 会等待大多数的 Follower 也进行了修改,然后才将修改提交
- 此时 Leader 会通知的所有 Follower 让它们也提交修改,此时所有节点的值达成一致