zookeeper是分布式应用程序的高性能协调服务,顾名思义,zookeeper用来保存分布式应用程序的多个节点之间的状态、配置等信息,以确保分布式程序的正确、高速运行。
1 客户端访问zookeeper时,连接到leader与连接到follower之间的区别?
2 集群搭建
zookeeper的数据模型是树(猜测是b+树,但未进行确认),
1 树上每个节点被称为Znode;Znode由3部分组成:stat(znode的状态信息)、data(znode中的数据信息)和children(znode子节点的信息)
2 节点Znode的特点:
3 Znode节点的属性:
- 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如何通知订阅者?给订阅者发送了什么通知?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。