面试题答案
一键面试对一致性的理解
在分布式系统中,一致性指的是多个副本数据保持一致的状态。即无论从哪个副本读取数据,得到的结果都应该是相同的,并且符合系统既定的约束和规则。例如,在银行转账场景中,从A账户扣除100元后,B账户必须同时增加100元,所有节点看到的账户余额变化应是一致的,不会出现某个节点显示A账户已扣钱但B账户未到账的情况。
常见保证一致性以实现数据完整性约束的方法
- 两阶段提交(2PC):
- 第一阶段(投票阶段):协调者向所有参与者发送事务内容,询问是否可以提交事务,参与者检查自身操作能否成功执行,并反馈给协调者。
- 第二阶段(提交阶段):如果所有参与者都反馈可以提交,协调者向所有参与者发送提交指令,参与者执行提交操作;若有任何一个参与者反馈不能提交,协调者向所有参与者发送回滚指令,参与者执行回滚操作。它的优点是原理简单,能保证强一致性;缺点是单点故障问题,协调者故障会导致整个事务阻塞,且性能开销较大,因为存在多次网络交互。
- 三阶段提交(3PC):
- CanCommit阶段:协调者询问参与者是否可以执行事务操作,参与者回复是否可以。此阶段主要是检测系统状态是否可进行事务操作。
- PreCommit阶段:若所有参与者都回复可以,协调者向参与者发送预提交请求,参与者执行事务操作,但不提交,然后反馈执行结果。若有参与者回复不可以,协调者发送中断请求。
- DoCommit阶段:协调者根据PreCommit阶段的反馈,若都成功则发送提交指令,参与者提交事务;若有失败则发送回滚指令,参与者回滚事务。3PC相比2PC,增加了CanCommit阶段,减少了协调者单点故障导致的阻塞问题,并且在一定程度上提升了性能,但依然存在网络分区等问题。
- Paxos算法:
- 它通过多轮的提案、投票过程,让集群中的节点就某个值达成一致。例如在一个分布式数据库中,多个节点需要对某个数据的更新达成一致。每个提案包含提案编号和提案值,节点会对收到的提案进行投票,只有获得大多数节点同意的提案才能被通过。它的优点是能保证最终一致性,在网络分区等复杂情况下仍能正常工作;缺点是算法复杂,实现难度大,且在节点数量较多时性能有所下降。
- Raft算法:
- 它将节点分为领导者(Leader)、跟随者(Follower)和候选者(Candidate)三种角色。领导者负责处理客户端请求,将日志复制到其他节点。选举过程中,候选者向其他节点发送选举请求,获得大多数节点投票则成为领导者。日志复制时,领导者将日志条目发送给跟随者,跟随者验证并追加到本地日志。它相对Paxos算法更加简单易懂,容易实现,广泛应用于分布式存储等场景,同样能保证最终一致性。
- 同步复制:
- 在写操作时,数据会同时被复制到多个副本节点,只有当所有副本节点都成功写入数据后,写操作才被认为成功返回给客户端。例如在分布式文件系统中,上传文件时,文件数据会同时写入多个存储节点,全部写入成功后客户端才收到上传成功的响应。这种方式能保证强一致性,但性能较低,因为要等待所有副本操作完成,且只要有一个副本写入失败,整个写操作就失败。
- 异步复制:
- 写操作先在主节点完成,然后异步将数据复制到其他副本节点。主节点完成写操作后就可以立即返回成功给客户端。例如在一些高并发的Web应用数据库中,主库完成写操作后,通过消息队列等方式异步通知从库进行数据同步。这种方式性能较高,但可能存在数据不一致窗口,在同步完成前,从库和主库数据不一致,适用于对一致性要求相对不那么严格,对性能要求较高的场景。