================================================================================
-
Watch可以理解成注册在特定Znode上的触发器
-
当Znode发生改变的时候,调用create,delete,setData方法,将会触发Znode上注册的对应事件,请求的Watch的客户端会接收到异步通知
-
Zookeeper事件通知的交互过程:
-
客户端调用getData方法,watch的参数是true,服务端接收到请求,返回节点数据,在对应的Hash表中插入被Watch的Znode路径以及Watcher列表
-
当被Watch的Znode删除,服务端会查找Hash表,找到该Znode对应的所有Watcher,异步通知客户端,并且删除Hash表中对应的key-value
================================================================================
-
Zookeeper Service集群是一主多从结构
-
在更新数据时,首先更新到主服务器,再同步到从服务器
-
在读数据时,直接读取任意节点
-
采用ZAB协议,为了保证主从节点数据的一致性
ZAB协议
-
ZAB(Zookeeper Automic Broadcast): 解决Zookeeper集群崩溃恢复,主从数据同步问题
-
ZAB三种节点状态:
-
Looking:选举状态
-
Following:Following节点(从节点)所处的状态
-
Leading:Leading(主节点)所处的状态
-
最大ZXID: 节点本地的最新事务编号,包含epoch和计数两部分
ZAB集群崩溃恢复
-
当Zookeeper的主节点服务器宕机后,集群就会进行崩溃恢复,分成三个阶段:
-
Leader election(选举阶段):
-
集群中的节点处于Looking状态,各自向其它节点发起投票,投票当中包含自己服务器的ID和最新事务ID(ZXID)
-
节点用自身的ZXID和其它节点收到的ZXID作比较,如果发现其它节点的ZXID比自身大,即数据比自己新,就重新发起投票,投票给目前已知最大ZXID所属节点
-
每次投票后,服务器都会统计投票数量,判断是否某个节点得到半数以上的投票,这样的节点将会成为准Leader,状态变为Leading,其它节点状态变为Following
-
Discovery(发现阶段):
-
在从节点发现最新的ZXID和事务日志,目的是为了防止在意外情况,选举产生多个Leader
-
Leader接收所有Follower发送的最新的epoch值,Leader从中选出最大的epoch,基于此值+1,生成新的epoch分发给各个Follower
-
各个Follower接收到最新的epoch,返回ACK(响应码)给Leader,带上各自最大的ZXID和历史事务日志,Leader选出最大的ZXID,并更新自身历史日志
-
Synchronization(同步阶段):
-
将Leader收集得到的最新历史事务日志,同步给集群中的所有Follower,只有当半数Follower同步成功,这个准Leader才能成为正式Leader.集群崩溃恢复正式完成
ZAB主从数据同步
- Broadcast
Zookeeper常规情况下更新数据的时候,由Leader广播到所有的Follower:
-
客户端发出写入数据请求给任意的Follower
-
Follower把写入数据请求转发给Leader
-
Leader采取二阶段提交方式:(先保留提交日志,再提交数据)先发送Propose广播给Follower
-
Follower接收到Propose消息,写入日志成功后,返回ACK消息给Leader
-
Leader接收到半数以上的ACK消息,返回成功给客户端,并且广播commit请求给Follower
数据一致性:
强一致性
弱一致性
顺序一致性:Zookeeper,依靠事务ID和版本号,保证数据的更新和读取是有序的
================================================================================
-
分布式锁: 应用Zookeeper的临时顺序节点,实现分布式锁
-
服务注册与发现: 利用Znode和Watcher,实现分布式服务注册与发现,如Dubbo
-
共享配置和状态信息: Redis的分布式解决方案Codls,利用Zookeeper存放数据路由表和codls-proxy节点元信息,同时colds-config发起的命令都会通过Zookeeper同步到各个存活的codls-proxy
-
高可用实现: Kafka,HBase,Hadoop都依靠Zookeeper同步节点信息,实现高可用
======================================================================================
1.创建docker-compose.yml
zoo:
image: zookeeper
restart: always
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
大家看完有什么不懂的可以在下方留言讨论也可以关注。
觉得文章对你有帮助的话记得关注我点个赞支持一下!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
论也可以关注。
觉得文章对你有帮助的话记得关注我点个赞支持一下!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-EyB04C1q-1712783424495)]