《Raft》

245 阅读1分钟

突破存算性能瓶颈:①换更好的机器;②加机器。普遍是使用②,受限于成本,且不一定就有更好的机器。

多个机器协同的方案:①每个机器负责自己那部分的数据;②每个机器都负责全部的数据。以Redis为例,集群用了①,而主从用了②。

Raft用来解决②的情况。

单机写入数据:①写入成功;②写入失败。

多机写入数据:

  • 向其中一个机器写入数据。
  • 该机器向其余机器同步数据:①同步成功;②同步失败;③数据丢失/延迟。

网络环境是复杂的,无法保证立即一致,只能追求最终一致。且为了系统的整体可用,一致性算法应当允许局部的失败,即不能因为一个机器同步失败,就整体写入失败。

一致性算法要解决的问题:

  • 不可靠信道,分区不可达/消息冗余/消息丢失/消息乱序。
  • 基本可用性,大部分节点可用,整体也要可用。
  • 不依赖物理时序或极端的消息延迟来保证一致性。
  • 响应请求不能依赖最慢的机器。

解决方案:

  • 只有唯一的Leader具备写权限,且负责同步日志,决定日志顺序。
  • Follower接收的写请求需要重定向到Leader。
  • Leader先写自己的日志,后成功同步半数以上Follower,再提交(解决了响应请求不依赖最慢的机器)。
  • 日志最终先由Leader应用到状态机,Follower随后。
  • Leader不可用后,其余Follower能够重新选举新的Leader。
  • 当有节点加入或退出,需要同步给整个集群。