广播模式需要保证 proposal 被按顺序处理,因此 zk 采用了递增的事务 id 号(zxid)来保证。所有的提议(proposal)都在被提出的时候加上了 zxid。
实现中 zxid 是一个 64 为的数字,它高 32 位是 epoch 用来标识 leader 关系是否改变,每次一个 leader 被选出来,它都会有一个新的 epoch。低 32 位是个递增计数。
当 leader 崩溃或者 leader 失去大多数的 follower,这时候 zk 进入恢复模式,恢复模式需要重新选举出一个新的 leader,让所有的 server 都恢复到一个正确的状态。
如果往多了来讲,它内部原理具体分为以下十项:
- 请求、事务和标识符
- 群首选举
- Zab:状态更新的广播协议
- 观察者
- 服务器的构成
- 本地存储
- 服务器与会话
- 服务器与监视点
- 客户端
- 序列化
**面试官:**怎么样小伙子?知道了吗?
**程序员Y:**虽然听了半天我也没有听懂你说的什么,但是感觉很有道理的样子,告辞!
程序员Y头也没回的走出了面试房间…
**面试官赶忙擦了一把汗:**还好是我知道的zk,要是前面几个什么kafka、RabbitMQ,就出丑大了
**面试官(拿出手机,拨出一个电话):**喂,是人事吗?你们怎么回事?我这里招的是中高级程序员,给出的薪资是24K,你们是不是把隔壁部门的初级岗位应聘者丢我这里来了?
…
看完上面的小故事,小on就来给大家分享Zookeeper的相关知识了。
注意:以下内容摘自一份283页的pdf,《Java核心技术点》↓
还有一些大厂面试真题↓
需要的程序员朋友,私信霸哥【面试】免费领取!
Zookeeper 概念
Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与通知机制。
Zookeeper 角色
Zookeeper 集群是一个基于主从复制的高可用集群,每个服务器承担如下三种角色中的一种
Leader
- 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader,它会发起并维护与各 Follwer及Observer间的心跳。
- 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器。只要有超过半数节点(不包括 observeer 节点)写入成功,该写请求就会被提交(类 2PC 协议)。
Follower
言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
资料领取方式:点击这里下载](https://gitee.com/vip204888/java-p7)
[外链图片转存中…(img-7no8gpi6-1628633146733)]
搜集费时费力,能看到此处的都是真爱!