赞
踩
之所以要判断自己是否是最小节点,因为如果是最小节点,则立马可以上锁。
如果用上述的上锁方式,只要有节点发生变化,就会触发其他节点的监听事件,这样对zk的压力非常大。
如果有100个并发,都要上写锁,但是目前已经有一个锁存在,则这100个并发都会去监听第一个锁,如果第一个锁发生变化,则这100个节点只有一个能成功,接着剩下99个又去监听这一个节点,这样会对 zk 的压力非常大。
而羊群效应,可以调整成链式监听。解决这个问题:
每个节点都只要监听上一个节点即可。
如果三节点断开了,则四节点会去监听2节点。
我们可以把Watch理解成是注册在特定Znode上的触发器。当这个Znode发生改变,也就是调用了create,delete,setData方法的时候,将会触发Znode上注册的对应事件,请求Watch的客户端会收到异步通知。
具体交互过程如下:
客户端使用了 NIO 通信模式监听服务端的调用
监听 test9 节点,当9节点发生变化,比如:
那么监听的变化信息:
可以看到,这里只会告诉我们发生了变化,但是发生了什么变化还是需要自己去操作相关命令去查看。
如果是删除节点,那么告诉我们的信息会发生变化:
如果是创建子节点,监听并不会被触发。
create /test date
get -w /test 一次性监听节点。
ls -w /test 监听目录(只监听目录)。创建和删除子节点会收到通知,但是子节点中新增节点不会被监听到。
ls -R -w /test 监听子节点中节点的变化,但内容的变化不会收到通知。
当服务端节点数据发生变化时:
zookeeper集群中的节点有三种角色
先把开启的单节点服务停止。
先进到该目录下:
/root/apache-zookeeper-3.7.1-bin/zkdata
然后创建四个文件夹:
然后每个 zk 的文件夹都需要创建一个文件,叫 myid,然后给一个值,这个值是描述该节点(是服务器节点)的唯一标识,这个值不能重复。
然后重新进入 conf 目录,准备四个 zoo.cfg 配置文件去启动四台 zk:
然后修改 zoo1.cfg 配置文件:
上面的 abserver 打错了,是 observer。
保存后再复制三份,zoo2 zoo3 zoo4 。
然后修改这些复制出来的配置文件,只需要修改日志路径,还有对客户端的端口号即可:
3、4同理。
接着启动这四个文件:
可以通过下面命令查看是什么状态的机子:
zookeeper作为非常重要的分布式协调组件,需要进行集群部署,集群中会以一主多从的形式进行部署。zookeeper为了保证数据的一致性,使用了ZAB(Zookeeper Atomic Broadcast)协议,这个协议解决了Zookeeper的崩溃恢复和主从数据同步的问题。
Leader建立完后,Leader周期性地不断向Follower发送心跳(ping命令,没有内容的socket)。当Leader崩溃后,Follower发现socket通道已关闭,于是Follower开始进入到Looking状态,重新回到上一节中的Leader选举过程,此时集群不能对外提供服务。
看第六步,可以看到是半数以上的 ack,这个半数是对候选还是整个集群?
这个半数是针对整个集群,可以很明显看到候选中数量是偶数,如果是半数以上,只有奇数才好判断半数以上。
Zookeeper在数据同步时,追求的并不是强一致性,而是顺序一致性(事务id的单调递增)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。