Zookeeper内部原理

📅 2026/7/28 14:18:13
Zookeeper内部原理
目录Zookeeper内部原理选举机制节点类型stat结构体监听器原理写数据流程Zookeeper分布式安装部署ZK集群操作客户端操作Zookeeper内部原理在Zookeeper的集群中每一个节点都有自己的权重权重小的给权重大的节点投票而每个节点的权重由两个因素决定。1SeverID由用户配置2Zxid数据ID选举机制1半数机制Paxos协议集群中半数以上机器存活集群可用。所以zookeeper适合装在奇数台机器上。2Zookeeper虽然在配置文件中并没有指定master和slave。但是zookeeper工作时是有一个节点为leader其他则为followerLeader是通过内部的选举机制临时产生的。3以一个简单的例子来说明整个选举的过程。假设有五台服务器组成的zookeeper集群它们的id从1-5同时它们都是最新启动的也就是没有历史数据在存放数据量这一点上都是一样的。假设这些服务器依序启动来看看会发生什么。a.服务器1启动此时只有它一台服务器启动了它发出去的报没有任何响应所以它的选举状态一直是LOOKING状态。b.服务器2启动它与最开始启动的服务器1进行通信互相交换自己的选举结果由于两者都没有历史数据所以id值较大的服务器2胜出但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3)所以服务器1、2还是继续保持LOOKING状态。c.服务器3启动根据前面的理论分析服务器3成为服务器1、2、3中的老大而与上面不同的是此时有三台服务器选举了它所以它成为了这次选举的leader。d.服务器4启动根据前面的分析理论上服务器4应该是服务器1、2、3、4中最大的但是由于前面已经有半数以上的服务器选举了服务器3所以它只能接收当小弟的命了。e.服务器5启动同4一样当小弟。节点类型(1Znode有两种类型短暂ephemeral客户端和服务器端断开连接后创建的节点自己删除持久persistent客户端和服务器端断开连接后创建的节点不删除(2Znode有四种形式的目录节点默认是persistenta.持久化目录节点PERSISTENT(小写persistent)客户端与zookeeper断开连接后该节点依旧存在。b.持久化顺序编号目录节点PERSISTENT_SEQUENTIAL)小写persistent_sequential)客户端与zookeeper断开连接后该节点依旧存在只是Zookeeper给该节点名称进行顺序编号。c.临时目录节点EPHEMERAL(ephemeral)客户端与zookeeper断开连接后该节点被删除。d.临时顺序编号目录节点EPHEMERAL_SEQUENTIAL(ephemeral_sequential)客户端与zookeeper断开连接后该节点被删除只是Zookeeper给该节点名称进行顺序编号。3创建znode时设置顺序标识znode名称后会附加一个值顺序号是一个单调递增的计数器由父节点维护4在分布式系统中顺序号可以被用于为所有的事件进行全局排序这样客户端可以通过顺序号推断事件的顺序stat结构体我们启动客户端获取节点结构 。1czxid- 引起这个znode创建的zxid创建节点的事务的zxid每次修改ZooKeeper状态都会收到一个zxid形式的时间戳也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid如果zxid1小于zxid2那么zxid1在zxid2之前发生。2ctime - znode被创建的毫秒数(从1970年开始)3mzxid - znode最后更新的zxid4mtime - znode最后修改的毫秒数(从1970年开始)5pZxid-znode最后更新的子节点zxid6cversion - znode子节点变化号znode子节点修改次数7dataversion - znode数据变化号8aclVersion - znode访问控制列表的变化号9ephemeralOwner- 如果是临时节点这个是znode拥有者的session id。如果不是临时节点则是0。10dataLength- znode的数据长度11numChildren - znode子节点数量监听器原理1. 监听原理详解1首先要有一个main线程2在main线程中创建ZK客户端这是会创建两个线程一个负责网络连接通信connect,一个负责监听listener3通过connect线程将注册的监听事件发送给ZK4在ZK的注册监听器列表中将注册的监听事件添加到列表中5ZK监听到有数据或路径发生变化时就会将这个消息发送给listener线程6Listener线程内部调用process()方法2. 常见的监听1监听节点数据的变化Get path [watch]2监听子节点增减的变化Ls path [watch]写数据流程读是局部性的即client只需要从与它相连的server上读取数据即可而client有写请求的话与之相连的server会通知leader然后leader会把写操作分发给所有server。所以写要比读慢很多。Zookeeper分布式安装部署搭建一个zookeeper集群。1发送安装包至其余机器并且分别解压。2在/opt/module/zookeeper-3.4.10/这个目录下创建zkData3重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg4配置zoo.cfg文件dataDir/opt/module/zookeeper-3.4.10/zkData server.1bigdata111:2888:3888 server.2bigdata112:2888:3888 server.3bigdata113:2888:3888Server.AB:C:D。A是一个数字表示这个是第几号服务器B是这个服务器的ip地址C是这个服务器与集群中的Leader服务器交换信息的端口D是万一集群中的Leader服务器挂了需要一个端口来重新进行选举选出一个新的Leader而这个端口就是用来执行选举时服务器相互通信的端口。集群模式下配置一个文件myid这个文件在dataDir目录下这个文件里面有一个数据就是A的值Zookeeper启动时读取此文件拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。5在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件并在文件中添加自己对应的节点编号比如节点2就在myid中添加1。ZK集群操作1启动zookeeper。2查看ZK状态。无法连接服务器的是因为此时只有一个节点无法发起投票得到sever所以我们可以再启动一个节点。再看Zk状态此时就可以发现节点1成为了集群leader。而节点2为follower。客户端操作命令基本语法功能描述help显示所有操作命令ls path [watch]使用ls命令来查看当前znode中所包含的内容ls2 path[watch]查看当前节点数据并能看到更新次数等数据create普通创建(永久节点)-s含有序列-e临时重启或者超时消失get path [watch]获得节点的值set设置节点的具体值stat查看节点状态delete删除节点rmr递归删除节点