数字马力面试题

文章目录

  • 1.ZooKeeper 问题
  • 2.什么是 Zab 协议?
  • 3.ZooKeeper 如何进行崩溃修复?
  • 4.HashMap 底层实现?
  • 5.ConcurrentHashMap 原理?为什么要这样改进?
  • 6.乐观锁?CAS?ABA 问题?
  • 7.括号算法匹配?
  • 小结

1.ZooKeeper 问题

答案解析:其实前三个问题的答案是一样的,所以我猜测,应该是应聘者没回答上来要点,所以面试官在刻意引导应聘者。

因为,ZooKeeper 实现的核心原理就是 Zab 协议,而 Zab 协议里面又包含了崩溃修复的具体流程。

2.什么是 Zab 协议?

答:ZAB (Zookeeper Atomic Broadcast,ZooKeeper 原子消息广播协议),它被用于实现分布式系统中的数据一致性和可靠性。
ZAB 协议总共包含以下两部分内容:

  1. ZAB 协议通过两阶段提交的方式来确保分布式系统的一致性。这两阶段分别是:准备阶段和提交阶段。在准备阶段,一个节点(称为 Leader)向其他节点(称为 Follower)发送提案,Follower 接受并确认提案。在提交阶段,Leader 将提案发送给所有节点,并等待多数节点的确认。一旦多数节点发送确认消息,Leader 就可以将提案确定为最终结果,然后通知所有节点进行更新。
  2. ZAB 协议还包括了崩溃恢复机制,当 Leader 节点崩溃时,系统会选择一个新的 Leader 来取代原先的 Leader 节点。新的 Leader 通过比对已完成的事务日志和未完成的临时提案来进行恢复。

所以,ZAB 协议通过原子广播的方式,在分布式系统中实现了一致性和可靠性,保证了数据的一致性和正确性。

3.ZooKeeper 如何进行崩溃修复?

答:在说崩溃修复之前,我们需要先了解一些前置内容。

在 ZooKeeper 中有三种节点类型,它们分别是:

  1. Leader(主节点):能够处理读写请求,也同时负责同步写事务请求给其他节点且需要保证事务的顺序性,是整个集群的老大。
  2. Follower(跟随者):只负责处理读请求,无权写,因此收到写请求需要转发给 Leader 处理,待 Leader 写完后再同步给 Follower。如果 Leader 挂了,那么 Follower 是有资格参与竞选的。
  3. Observer(观察者):和 Follower 一样,唯一不同的是,不参与 Leader 的选举,可以利用不参与 Leader 选举的特性用来线性扩展读的 QPS。

也就是说,所有写操作会先到 Leader 节点,然后 Leader 节点在通过 2PC(两阶段提交:预提交、ACK、确认提交等流程)来进行数据同步,当写入成功过半就认为信息写入成功。而跟随者和观察者是为了增加读性能的,只不过跟随者还可以通过竞选主节点来保证集群的稳定性。

了解了这些之后,我们再来看 ZooKeeper 崩溃修复的流程(也就是当主节点崩溃后的流程),咱们先假设 ZooKeeper 集群有两个节点,ServerA 和 ServerB,它的崩溃修复的选举流程如下:
各自投票:

  1. ServerA 先投票给自己,投票信息包含节点 sid 和 zxid,sid 就是 myid(集群 ID,启动集群时必须设置的 ID,是在配置文件当中配置死的,整个集群内唯一),zxid 是事务 id,自增(每次写入操作时生成)。假设 ServerA 将票投给自己,那么投票信息就为 (1,1)。
  2. ServerB 也投票给自己,假设 ServerB 的 sid 为 2 ,那么此时 ServerB 投票信息为 (2,1)。

投票广播:

  1. 接下来 ServerA 和 ServerB 分别将自己的投票信息广播给集群中其他节点。也就是 ServerA 将(1,1) 广播给 ServerB, ServerB 将(2,1)广播给 ServerA。
  2. ServerA 收到 ServerB 的投票信息后,检查下 ServerB 的状态是否是本轮投票,以及是否是 LOOKING 寻主的状态。 反之,ServerB 收到 ServerA 的投票信息后也是一样的。

投票对比:
优先对比 zxid,其次对比

你可能感兴趣的:(面试题库,java)