为什么要引入分布式
- 摩尔定律的影响在慢慢衰减、失效(单个硬件能提供的能量不再呈线性增加)
- 为了保证思想扩张不受资源的限制(硬件能力)
- 既然单个硬件能力成了拖后腿的,那思想的延伸就要用多个硬件的承载
AlphaGo就是一个典型的例子。
分布式系统的设计目标:
- 可用性。所有系统设计的最核心目标
- 可扩展性。硬件的增加获得性能的线性提升
- 容错性。复杂系统必须要考虑的点。对已发生的错误,进行规避和恢复
- 性能。服务的响应延时和吞吐率要满足需求
相比单体架构,挑战有哪些:
- 节点之间的网络通信是不可靠的,存在延时和丢包
- 节点处理任务时出错,或节点宕机
- 同步调用意味着系统可扩展性为零
- c:consistency 一致性。数据的一致性。节点对数据的读写都是‘原子的’,也就是不会造成数据竞争
- a:availability 可用性。只要节点没有故障,在有限事件内要给出响应
- p:tolerance to partition of network 分区容忍性。发生网络故障,分区间无法通信时,系统仍然可以正常工作
- 基于复制状态机模型推导的。
- 节点的关系模型是 非对称
包含3种角色:
- leader 领袖
- candidate 候选人
- follower 群众
核心术语还有 team 表示任期
角色变化:
群众
- 初始状态是 群众,
- 任期超时或开始选举,状态变为 候选人
候选人
- 任期超时、新选举,角色还是候选人
- 获得半数选票,角色变为 领袖
- 发现新领导或新任期开始后,角色变为 群众
领袖
- 发现新任期后,角色变为群众
选举中的心跳和选举定时器
- 每个群众都有一个选举定时器,时长个不一致,超时表示新一轮的选举开始
- 领袖会定期发送心跳,群众收到心跳会将自己的定时器清零重置
- 对群众来说,不管是网络原因延时还是领袖节点宕机,只要超时就开始选举
群众参加选举的3个步骤:
- 将自己维护的任期号加1
- 将自己的状态切到候选人,为自己投票
- 向集群其他节点发送投票rpc,要其他人给自己投票
因为raft已经保证了数据的一致性,所以快照并不依赖强领袖,群众也能创建自己本地的快照