一.多节点复制
1.为什么需要日志?为什么一致性模块不能直接管理状态机?
- 加了log之后就可以比较方便的对一些不能达成共识的命令做回滚的操作。多节点复制的日志保证了所有状态机按相同的顺序执行相同的命令。日志可以将命令按顺序排好。帮助所有节点共同确定一个执行顺序,帮助leader确认每个follower有相同的日志。
- 一致性模块保证了日志复制结果的正确性。复制状态机只能保证最终结果达到相同状态,但是在过程中可能会出现不一致的情况,我们并不要求每次执行命令都同步的,可以异步执行。
二.Raft动画演示
节点的三种状态:leader、follower、candidate
1.leader收到set 5命令后,什么时候才可以回复client命令执行成功了
- leader收到set5命令后会添加命令到自己的日志,然后发送消息给follower,leader等待集群内大部分follow的回应后执行命令并且回复客户端
2.动画里面提到的election timeout是什么意思?为什么要在一个时间区间150—300ms里随机选一个值?何时重置这个timeout?
- 一个follower节点长时间没有接受到leader的消息,不会马上变成candidate状态,而是会等待一段时间。如果这一段时间都没有收到消息就会变成candidate状态。这段过程叫做election timeout
- 为了避免选举冲突
3.如何保证一个term最多只有一个leader当选?为什么要保证
- 一个节点某一任期内最多只能投一票;只有获得大多数投票的节点才会成为leader
- 系统中有多余的leader被称为脑裂,会导致数据的覆盖丢失。
4.多个candidate同时竞争选票导致选不出leader怎么办
- 等待下一次timeout之后,其余节点参与竞选。
5.什么是log entry?动画里说的an entry is committed是什么意思?
- entry日志数组里面的一个元素,entry里包含的一些操作叫做log entry,一个log由很多entry组成,由时间顺序排列。