故事设定
- N个人组成了一个团队,承包了一栋大楼,对外出租;会不断有人来租房子,每租一间房子,需要多数人同意,才能向租客确认出租。同时每个人都会记录当前还剩多少房子未出租;
- 大家都愿意将房子租出去,所以只要有租房的需求,大家都会同意。
- 每个人都有可能临时处理自己的事情而暂时离开团队。
- 需要一个接待员,去接待租客,并征求大家的意见。每个人都可以成为接待员,成为接待员的前提是在接待员位置空缺时,谁想当接待员都可以向大家争取意见,获取大部分人同意的人,将会成为接待员。
- 为了筛选真正需要租赁的客户,所有人都有回复顾客的询问和真正需要进行租赁的时候,将顾客指引到接待员那进行真正的租赁;原则是:租赁业务的发起必须由接待员发起。
- 只有在接待员岗位空缺的时候,每个人都允许发起多轮投票,但是每一轮投票,大家只能投一票,多数者获胜。选出获胜者之后,会将投票的轮次加一!在投票的时候,大家都会评估被选人是否对公司业务足够了解(轮次越高,可能掌握的数据就越全面),也可以理解成酒店管理集团的升级版本,每次选举之后,都标识酒店进入新的时代!优先选择账本记录最全的候选者,如果有候选人发现自己的投票轮次低于其他候选者,则会自动退出选举,同时高版本的成员不会给低版本的成员进行投票!
- 最后选出来的接待员,作为整个团队的接待员
店铺开业(分布式一致性)
- 所有成员需要推选出一个接待员,来传达租客的租赁需求。在沉默了一段时间之后,有一个比较积极的小伙A,说自己可以担任接待员,为大家服务。经过投票,小A顺利的成为接待员。公司正式开始开业;
- 按照之前的约定,接待员必须在每个租客,进行租房的时候,先进行登记,然后向大家询问,是否可以将房子租出去,如果大多数人不在场,比如中午吃饭的时间,就会对外暂停营业,所有业务都暂时停止。正常营业时间为了节省时间,小A会在咨询完多数人之后(之后找时间慢慢的通知其他人,在咨询的时候,大家其实也是先进行登记,因为不确定这个事情一定能成),就告诉租客可以出租了。同时再向大家确认房屋已经出租。大家一接到这种通知之后,会自觉的在自己的小本本上将之前登记的记录变更成真正的账本来记录当前还剩多少房子,已经租出去了多少房子;
- 就这样,一段时间内,公司运行的非常平稳,大家的帐记录的也都一样。
接待员的更替(leader 节点不可用)
- 由于租赁业务非常繁忙,大家都会时不时的盯着接待员是否在岗位上,如果发现接待员不在岗位上,会立即发起投票,选举自己为接待员;
- 有时候,有些人会因为自己看花眼,发现接待员不在岗位上而发起投票,但这种意外情况很快就会被制止,因为大部分人还是知道接待员在岗位上的;
- 在营业时间内,选举时常发生;有时候一个人发现了接待员不在岗位上了,有时候多个人发现接待员不在岗位上了,在接待员离开的这段时间内,大家可能因为票数相同发起了多轮投票。最终票数多着获胜。如果在选举过程中接待员回来了,也不能再次继任接待员,也得参与投票。
- 新的接待员上任之后,会继续对接租赁业务,登记和通知大家业务进展;有时候,上一个接待员由于某些原因离开的时候,未将某些登记记录告诉大家,所以新的接待员也不知道。那条未登记的记录大家都不知道,所以老的接待员回来之后就会被新的接待员通知将之前没有登记的记录删除掉(从现在新接待员最新的记录开始找,找到两者一样的数据,然后把之后的全部同步成最新的),只记录现在有效的记录。所以之前进行登记的租户可能需要重新进行登记;
公司不间断的进行运营,大家也都相安无事。
- 故事启示:为什么不把账本放到一个地方,大家一起写,比如mysql呢?原因是,如果一个分布式服务需要严重依赖外部服务来保证数据的一致性的话,并不是优秀的解决方案,所以一般靠节点之间的日志进行记录,完成数据的一致性!将外部存储作为一个备份,来进行维护!
解析常见的面试题
- raft协议组成部分
- 接待员(leader), 被选举人(candidate),其他成员(followers),每个人的小本本(同步日志),酒店的升级版本号(term),账单上的每条记录(index)
- raft选举触发时机
- 只要有人没看到接待员在岗,就会容忍一段时间,然后发起选举!不管是团队刚成立还是运营中接待员离岗!(初始化服务或中途leader节点宕机导致followers接不到心跳消息)
- raft保证数据的一致性
- 每个人都有自己的小本本,只要接待员要处理业务,就会征求大家的意见,然后大家登记,等到接待员征求了大部分人之后,会向大家同步结论,大家统一记账,接待员向客户回复租赁成功!(leader节点同步大多数followers,followers同意之后,同步日志,向client回复成功)
- raft选举成功之后,如果节点内容不一致,有什么同步手段
- leader会同步index和快照,完成整体数据同步!index是一个个同步,检查!snapshot是整体同步!一般都是在一个可以接受的区间内,如果超过的话,就整体同步!比如一个人离开时间太长了,在进来的话,就会整体抄别人的作业而不是一天天对账
- raft中的term概念是什么,有什么用
- 酒店的版本,用于区分和定位是在那一个轮次以及去掉过期的投票选择
- raft协议选举投票的前提是什么
- 酒店成员自己的版本比被选举人的版本低,标识没有过期!以及index比被选举人的低。这样的话,不会完成那些高版本,少数据的情况发生,最终导致数据的丢失问题
- 如果集群节点中被物理阻断了,会怎么样,之后再将物理阻断去掉会怎么样
- 会自己在所属的空间没小范围投票,但是由于得不到多数人的认可,所以选举不成功,轮次不变!等到物理分区结束之后,找其他大分区的leader