面试官问:ZooKeeper 有几种节点类型?别再说 4 种啦!
本文作者:HelloGitHub-老荀
好久没更新 ZK 的文章了,我想死你们啦。之前发布的 HelloZooKeeper 系列文章完结后,项目收获了将近 600 个 star。这远远超过了我自己的预期,在这里感谢大家的支持~
后面会继续 ZooKeeper 的话题,通过单篇的形式就某个 ZK 的话题继续聊,今天我们先来看看 ZK 的节点类型。话不多说,我们进入今天的主题~
一、关于 ZK 的节点类型
大家如果刷过 ZK 相关面试题的话,就一定会刷到过 “ZK 有几种节点类型?”,大家通常背书的答案的话是:4 种!但其实 ZK (3.6.2)服务端支持 7 种节点类型,分别是:
- 持久
- 持久顺序
- 临时
- 临时顺序
- 容器
- 持久 TTL
- 持久顺序 TTL
这 7 种类型之前的文章中也有提到过,但是并没有展开讲。这次更新的单篇想要把这 7 种类型的节点,认认真真的讲一遍!Let's GO
二、简单介绍
2.1 持久、临时
持久不用我多说,是用的最多的一种类型,也是默认的节点类型,临时节点相较于持久节点来说,就是它会随着客户端会话结束而被删除,通常可以用在一些特定的场景,例如分布式锁释放,健康检查等。
2.2 持久顺序、临时顺序
这两种我放在一起介绍,因为他们相对于上面两种的特性就是 ZK 会自动在这两种节点之后增加一个数字的后缀,而路径 + 数字后缀是能保证唯一的,这数字后缀的应用场景可以实现诸如分布式队列,分布式公平锁等。
2.3 容器
容器节点是 3.5 以后新增的节点类型,只要在调用 create
方法时,指定 CreateMode
为 CONTAINER
即可创建容器的节点类型,容器节点的表现形式和持久节点是一样的,但是区别是 ZK 服务端启动后,会有一个单独的线程去扫描,所有的容器节点,当发现容器节点的子节点数量为 0 时,会自动删除该节点,除此之外和持久节点没有区别,官方注释给出的使用场景是 Container nodes are special purpose nodes useful for recipes such as leader, lock, etc.
说可以用在 leader 或者锁的场景中。
2.4 持久 TTL、持久顺序 TTL
关于持久和顺序这两个关键字,不用我再解释了,这两种类型的节点重点是后面的 TTL,TTL 是 time to live
的缩写,指带有存活时间,简单来说就是当该节点下面没有子节点的话,超过了 TTL 指定时间后就会被自动删除,特性跟上面的容器节点很像,只是容器节点没有超时时间而已,但是 TTL 启用是需要额外的配置(这个之前也有提过)配置是 zookeeper.extendedTypesEnabled
需要配置成 true
,否则的话创建 TTL 时会收到 Unimplemented
的报错
三、原理介绍
单纯的持久和临时节点我就不介绍了,之前的系列文章有讲
3.1 顺序关键字
客户端创建一个顺序节点的时候,服务端得知当前节点是顺序节点的时候会自动给路径加上后缀,后缀就是父节点的 cversion,代表创建子节点的个数
if (createMode.isSequential()) {
path = path + String.format(Locale.ENGLISH, "%010d", parentCVersion);
}
就是这么简单~
3.2 容器、TTL 关键字
这两种其实可以放在一起讲,服务端在启动的时候会额外启动一个定时任务线程,会定期的扫描所有的容器和 TTL 的节点,逐一判断子节点的数量以及一些相关配置,来决定是否删除,首先整个逻辑是在 ContainerManager
中,定时任务是由 TimeTask
实现的,相关的配置有
配置项 | 默认值 | 说明 |
---|---|---|
znode.container.checkIntervalMs | 60000(毫秒) | 定时任务检查的间隔 |
znode.container.maxPerMinute | 10000 | 和上面的参数联合成为最小的检查间隔,每个节点间隔必须差 (60000 / 10000)毫秒(默认 6 毫秒)以上 |
znode.container.maxNeverUsedIntervalMs | 0 | 如果配置不为 0 的话,当容器和 TTL 节点最后一次更新的时间和当前时间戳的差超过这个值的话,也会被删除 |
四、小结
- 持久关键字:客户端不主动删除的话,节点数据会一直存在
- 临时关键字:客户端连接断开后,节点数据会被一起删除
- 顺序关键字:服务端会自动为该节点加数字后缀
- 容器:服务端会定期扫描这些节点,当该节点下面没有子节点时(或其他条件时)服务端会自动删除节点
- TTL:需要额外配置才能启用,基本和容器相同,当超过 TTL 时间节点下面都没有再创建子节点时会被删除,但是当创建子节点会重置该超时时间
ZKr~好久没更了,这次先挑一个简单的话题。后面大家想学哪些 ZK 的知识可以留言告诉我。
关注 HelloGitHub 公众号 第一时间收到更新。
还有更多开源项目的介绍和宝藏项目等待你的发现。
面试官问:ZooKeeper 有几种节点类型?别再说 4 种啦!的更多相关文章
- 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单
这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...
- 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...
- 面试官:Zookeeper是什么,它有什么特性与使用场景?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Zook ...
- [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...
- 面试官问我,Redis分布式锁如何续期?懵了。
前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所 ...
- 面试官问:JS的this指向
前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...
- 面试官问线程安全的List,看完再也不怕了!
最近在Java技术栈知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章<出场率比较高的一道多线程安全面试题>里面讲过 ArrayList 的不安全 ...
- 美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧
本文首发于微信公众号:程序员乔戈里 public class testT { public static void main(String [] args){ String A = "hi你 ...
随机推荐
- Mysql无法通过临时密码访问
在Linux上安装Mysql: [步骤一]:将mysql的安装文件上传到Linux的服务器. [步骤二]:安装MYSQL服务端 [步骤三]:安装MYSQL客户端 我在步骤三遇到了问题,所以直接从步骤三 ...
- pandas(3):索引Index/MultiIndex
目录 一.索引概念 二.创建索引 ①导入数据时指定索引 ②导入数据后指定索引df.set_index() 三.常用的索引属性 四.常用索引方法 五.索引重置reset_index() 六.修改索引值( ...
- kubernets-java 动态修改deployment 的replicas
/** * Scale up/down the number of pod in Deployment * * @param deploymentName * @param numberOfRepli ...
- 鸿蒙HI3516-驱动开发(1.1-LTS)
代码在:https://gitee.com/kwydm/open-harmony-taurus 目录大致结构 1.驱动开发创建目录://vendor/huawei/hdf/LED/src 新建Make ...
- 1149 Dangerous Goods Packaging
When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...
- 展开说说,Spring Bean IOC、AOP 循环依赖
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 延迟满足能给你带来什么? 大学有四年时间,但几乎所有人都是临近毕业才发现找一份好工作 ...
- 【Java注解】@PostConstruct 注解相关
不多逼逼,直接看注解上面的文档, @PostConsturct PostConstruct注释用于需要执行的方法在依赖注入完成后执行任何初始化.这个方法必须在类投入服务之前调用. 这个所有支持依赖关系 ...
- hdu4848 DFS 暴搜+ 强剪枝
题意: 给你一个图,然后问你从1出发遍历所有的点的距离和是多少,这里的距离和是每一个点到1的距离的总和,不是选择一条遍历所有点的路径的总长度,时间限制是 8000ms. 思路: ...
- hdu4067 费用流(混合欧拉的宽展和延伸)
题意: 给以一个图,每个有向边都有两个权值,a,b其中a是保留这条边的花费,b是删除这条边的花费,让你删去一些边使图满足一下要求: (1)只有一个起点和一个终点 (2)所有的边都是又向的 ...
- ASLR 的关闭与开启(适用于 Windows7 及更高版本)
ASLR 是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术 有的时候 ...