zookeeper学习

什么是Zookeeper-->Zookeeper的核心概念是什么-->zookeeper有几个节点-->每个节点有什么特点-->Zookeeper节点的实操-->Zookeeper ACL权限控制的实操-->Zookeeper 内存数据和持久化-->java和curator客户端连接工具操作Zookpper--->zookeeper集群的搭建及使用java和cutator客户端工具操作集群-->zookeeper的典型应用场景与实战(非公平锁/公平锁/共享锁,leader选举在分布式场景中的应用,注册中心实战)-->zookeeper实现互斥锁,怎样实现共享锁-->zookeeper配置中心和注册中心创建的是什么节点(持久化节点)-->zookeeper的分布式创建的是什么节点(临时顺序节点)-->Curator放入几种锁方案(互斥锁【分布式可重入排它锁,分布式排它锁】,共享锁【分布式读写锁,适合读多写少的场景】)zookeeper源码环境搭建-->源码如何启动集群-->leader启动选举的过程是什么-->zookeeper选举Leader源码分析-->zookeeper的集群动态配置-->什么是注册中心-->注册中心需要实现哪些功能--》zookeeper注册流程-->zookeeper的心跳监测-->zookeeper的Watch机制(1.主动拉取(Eureka),2.发布订阅(Zookeeper默认))-->zookeeper是否适合作为注册中心,为什么(zookeeper是CP模型,不太适合作为注册中心,因为一个节点挂掉后,会重新选举,选举期间是不能提供服务的)-->CAP理论(一致性,可用性,分隔容忍)

链接:zookeeper节点实操的链接:https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?product=smartapp&tk=c23e020ab04b0b329ada0bab85bb2394&share_url=https%3A%2F%2Fyebd1h.smartapps.cn%2Fpages%2Fblog%2Findex%3FblogId%3D115444734%26_swebfr%3D1%26_swebFromHost%3Dbaiduboxapp&domain=mbd.baidu.com 

备注知识点:

 

 创建持久化节点    创建带序号节点   创建临时节点     临时节点下不能有子节点   创建容器节点   创建TTL节点   

get -w path   创建一个监听,当服务端有变化时会主动推动给客户端,如果没有这个  则只会轮询去感知  会有延迟,且这个监听是一次性的

ls -w path  对目录进行监听  对目录进行监听

ls -R -w path  对所有的子节点进行监听

用户密码忘记了还可以使用超级管理员模式

操作日志是可以看得   都会持久化到磁盘中  需要加一些东西

集群模式 

 

zookeeper的客户端监听(单机) ,new zookper时看源码  其实是两个守护线程   

 

修改时基于版本号的修改  乐观锁的实现  避免两个线程同时去修改 

删除所有节点 

 

 异步监听

 

如果客户端创建成功好发送给服务端 服务端也收到了  但是在响应的过程中网络出现问题  这里就可以去重复创建  有一个UUID的生成  判断如果已经创建了 则不重复创建  whithProtcion方法 

 

 集群环境

 

zookper的集群搭建  并且看每一个服务是什么角色 

这是连接集群的方式  zookpper自带的   节点不存在后抛出异常后会自动重连 

 

currotor连接集群 

 

接着昨天的内容:

 

这就是分布式锁的原理 

 

 zookeeper分布式锁的原理图(非公平锁,没有办法控制接下来所有等待请求抢锁的先后顺序)

 那多人等待  那么多人去抢锁  给zookeeper带来没有必要的压力

 公平锁

 

 幽灵节点的产生及解决办法:

幽灵节点的产生:客户端创建节点后,服务端挂掉了没有给服务端响应,稍后服务端又重启,而恰好session还没有过期,这个时候因为客户端没有收到创建成功的响应,所以会再去创建一个重复的节点。这就叫做幽灵节点。catuor的解决方案是给这个节点带了个前缀(UUID),下次创建时,客户端携带着前缀看看这个节点是否创建过,如果创建了则不重复创建 

 nginx的使用:

 

 idea在一个项目中模拟分布式,用jmeter测试。

cuator的leader选举的代码和分布式锁的代码(官网)

Curator客户端初始化的方法 

 这样就加锁成功了  是如果没有抢到锁 让他一直等

 加锁acquire()方法的源码,这里就是可重入锁  加锁成功不需要在取抢锁了

上面源码的某个方法点击进来的 

这也是上面点进来的  加锁的主逻辑  跟容器节点相关 

这是上面的方法点进来的  创建好节点后接下来就要判断是不是最小的节点 

 上面的公平锁和非公平锁都是独占锁 这里是共享锁

 

 共享锁的逻辑:

 leader选举的demo

 

 这是leader选举的源码 方法点击进来的

 

插一个:幽灵节点解决的源码 withProtection()

 zookeeper做注册中心

springcloud的zookeeper注册中心搭建好后,启动两个实例,并且在服务器上去看他的实例。(注册中心注册的都是临时节点) 

 

 

 两轮投票选出leader:

 假如有三台机器,第一台启动会报错,因为他要和某个机器投票。第二台启动时不会报错,这时第二台就是leader了。第三台启动了,leader已经选出来了。  前两台的选举经过了两轮投票。第一台机器投自己,第二台机器也投自己。这个时候,就要选出一个zxid最大的,第一轮结束。第二轮开始时,第一台投那个大值,第二轮也投那个大值。所以选择了第二台作为leader。

源码框架图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值