分布式系统(一)


我还是想简单记录一下raft算法,很多分布式系统都用到了,至于paxos就算了,没理解

raft算法

raft算法在我的理解中,主要用于管理分布式中多副本的情况,即系统有多个节点,其中有一个节点进行读写,其他节点只进行读或者只负责同步,当主节点下线后,需要选举出一个新的节点,当然这是具体的用处了,raft的定义中,将它的功能分为多个子问题,leader选举,日志同步,安全性,日志压缩,成员变更。

成员

raft中的角色分为3种, leader, follower, candidate

  • leader负责接收客户端请求,并向follower同步请求日志,当日志同步到大多数节点后告诉follower提交日志
  • follower接收并持久化同步的日志,在leader告知后提交后,提交日志
  • candidate,选举过程中的历史角色

    状态转换

    当follower超时没有收到leader的消息,它会变成candidate开始leader选举,收到大多数服务器投票的成为新的leader。
    raft算法有任期(term)的概念,多个任期之间是leader选举,如果选举失败会跳过这个任期

    leader选举

    raft通过心跳出发leader选举,当服务器启动时,初始时follower,leader定期向follower发送心跳,如果follower超时没有收到心跳,就会等待随机时间发器一次选举。
    首先将自己的任期+1,然后转换为candidate,首先给自己投一票,并且给其他节点发送“拉票”请求,其他节点收到请求会,会有3个原则
  1. 每个任期每个节点只有一票
  2. 候选人知道的信息不能比自己少(日志提交记录)
  3. 先到先得,只能给先来的那个
    当candidate发送请求后,会得到3种结果,
  4. 得票超过一半(majority),赢得选举,成为leader,向其他节点发送心跳说明
  5. 被告知别人当选,自己切换到follower
  6. 没有收到足够的票,重新发出选举,任期+1
    如果发生平票,则会等待然后重新进入选举,降低了系统可用性,所以每个节点发出选举请求时会等待随机时间,然后节点数量时奇数,尽量减少平票。

日志同步

当有leader后,就开始接收客户端请求,leader把请求作为日志驾到日志中,然后向其他服务器发送AppendEntries复制日志条目,当大多数服务器复制成功后,leader提交该日志并向客户端返回。
对于没有复制成功的服务器,leader会不断重试。

安全性

raft新增两条限制保证安全性

  1. 拥有最新提交的节点才有资格成为leader,发送拉票请求时,会带上自己的提交index和任期,目标机器会先比较任期,然后比较index,然后投票
  2. leader只会推进当前任期已经复制到大多数的服务器的日志

###
todo…


  目录