zookeeper是分布式应用程序的高性能协调服务,顾名思义,zookeeper用来保存分布式应用程序的多个节点之间的状态、配置等信息,以确保分布式程序的正确、高速运行。html
1 客户端访问zookeeper时,链接到leader与链接到follower之间的区别?java
2 集群搭建node
zookeeper的数据模型是树(猜想是b+树,但未进行确认),
1 树上每一个节点被称为Znode;Znode由3部分组成:stat(znode的状态信息)、data(znode中的数据信息)和children(znode子节点的信息)
2 节点Znode的特色:算法
3 Znode节点的属性:shell
- jps查看zookeeper进程:QuorumPeerMain - 链接zookeeper集群:zkCli.sh -server zookeeper:2181 - 建立节点:create [-s] [-e] path data acl; -s表示顺序节点、-e表示临时节点 - 读取节点:ls path [watch] 获取节点的子节点、get path [watch] 获取节点保存的数据和节点属性信息、ls2 path [watch] 获取节点的子节点和当前节点属性信息 - 更新节点数据:set path data [version] - 删除节点:delete path [version]、rmr path 递归删除数据
- 算法:FastLeaderElection - 选举算法用到的概念: 服务器ID:数值型,编号越大权重越大 选举状态: LOOKING,观望状态 FOLLOWING,随从状态, OBSERVING,观察者状态,同步leader状态,不参与选举 LEADING,领导者状态 数据ID:最新写入的数据的ID 逻辑时钟:每轮投票,逻辑时钟的次数相同;(根据逻辑时钟判断集群中的节点是否不稳定) - 新集群选举: 1. 前提: 1.1. 每一个机器都给本身投票; 1.2. 投票数过半,选举结束; 2. 思路:集群中的机器启动后,给本身投一票,而后开始与其余机器交换投票结果,若是没有其余机器能够交换,则进入LOOKING状态;若是有其余机器能够交换投票,则根据服务器ID大小,服务器ID小的机器将本身的票投给服务器ID大的机器;当有一台机器拿到过半的票数时,将结束选举;同一集群中,先启动服务的机器将有更大的机会得到leader。 - 运行中的集群选举: 1. 前提同上;此时选举须要用数据ID、服务器ID、逻辑时钟 2. 思路:首先,同一逻辑时钟,逻辑时钟小的被淘汰,逻辑时钟相同的机器将从新投票;而后,机器中数据ID大的胜出;若是数据ID相同,那么服务器ID大的胜出。
- 发布者将数据发布到zookeeper中,订阅者来获取新的数据更新本身的配置; - 注意点: 1. 统一管理的数据不能太大; - 原理: 1. 全部订阅者首次启动时,访问zk指定的节点获取相关的订阅信息; 2. 获取数据的同时,设置对节点数据变化的监听; zk.getData(path, true);设置对指定path的监听 3. 被监听的path上的节点数据发生改变时,监听被触发,全部对次path的订阅者将收到zookeeperde通知,而后访问zookeeper获取新的配置信息; 4. 获取数据时,再次对path设置监听; - 疑问:zookeeper中的数据发生改变时,zookeeper如何通知订阅者?给订阅者发送了什么通知?