P6 Raft(1)
Raft的引出
MapReduce的复制完全由单个master控制
GFS依赖于单一的master节点为每一块数据选择primary
vmware fit 在一台primary虚拟机和backup虚拟机中执行写入,如果出故障,则需要接触test-and-set服务器来帮助选择一台backup来接管primary
split brain(脑裂):有多个primary
test-and-set服务器
C1 S1 state
C2 S2 state
正常情况下,C1需要将S1以及S2中的状态均设置为1,才能够成为primary,在网线断开的情况下,C1只能与S1通讯,而不能跟S2通讯,但为了提供容错,C1在将S1设置为1后也能够成为primary,同理C2也因此成为了primary,就导致了脑裂的发生,一定程度上降低了正确性。
上面的三种都是单一主体,复制能由它们自己决定,但会出现单点故障的问题
自动化的,不受脑裂影响的复制系统的关键思想少数服从多数
- 奇数台服务器
- leader选举和日志提交需要得到大多数服务器支持,大多数是所有服务器(包括在线的和宕机的)而不是仅指在线的。
KV服务器应用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kOiampld-1660101549329)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8b1fc1af-c502-4efb-a256-4dd2c25a7c36/Untitled.png)]
clients把key发送到当前leader(raft中的leader)的应用层,接下来应用层来根据指令请求KV数据库。
在非副本服务器上,应用层代码执行这条请求并更新table,然后回复请求。
但在raft副本服务器中,client发送请求到leader上,应用层先不执行,先向下将请求传给raft层,并把它提交给replicated log中,直到半数以上的副本将这条操作添加到各自的日志中,表示复制完成,leader知道所有副本完成复制后,raft向上面的kv层发送通知,已经被安全的复制提交到所有的副本中,副本的应用层执行这条操作,然后给客户端发送回复消息。
leader election
通过leader来进行系统的提速,如果没有leader则一般需要两轮请求来完成一个操作(第一轮找到一个临时的leader,第二轮实际发送请求)。
每个term至多有一个leader
每一个raft服务器都有一个选举计时器
当leader出现错误时(follower在一个选举计时器的时间里没有收到leader发来的请求),选举计时器到期,就会发生新一轮的选举。
- teram++
- requestVotes RPC 请求给其他所有的server
- 获得大部分选票成为leader后,需使用心跳告诉其他所有的client此次term号,所有serves收到消息后,将会重置选举定时器(除了leader,其他人不允许发送AppendEntries消息)
若三个副本的选举定时器同时到期,都将发起选举,将会很大可能导致没有leader被选出,通过随机化选举定时器的时间(最短为两倍心跳传输时间,最长时间会影响故障恢复时间)可以一定程度上解决这个问题。