- zookeeper:一个领导者(Leader)和多个跟随着(Follower)组成的服务器集群
- 集群有半数以上的节点存活,就可以正常服务
- 全局数据一致,每个服务器数据一样!!
- 更新请求顺序进行,每个客户端的更新请求按照发送顺序来执行
- 数据更新原子性:要么成功要么失败
- 实时性,在一个时间范围内,能读到最新数据(不同服务器同步速度快)
数据结构
树形结构:如Linux ntfs文件系统与Unix文件系统很相似
节点叫ZNode默认存储1MB的数据,每个ZNode都可以通过其路径唯一标识(每个节点有唯一标识,比如路径/Znode1/Znode2)
应用场景
统一命名服务:
访问域名而不是服务器
统一配置管理:
- 要求每个节点配置信息一致
- 配置文件修改后快速同步
ZooKeeper实现:
把配置文件写到一个ZNode上
各个客户端服务器都监听,一个更新,全部同步
一旦ZNode修改,通知各个客户端
统一集群管理
分布式中实时掌握各个节点的状态
ZooKeeper实现:
节点信息写入一个ZNode
监听这个ZNode
服务器动态上下线
客户端要看到服务器上下线的变化
可以迅速看到某个服务器挂掉或变化
软负载均衡
让访问数最少的服务器处理最新客户端请求
配置参数
1.tickTime=2000 心跳数,单位ms,超过这么长时间,断线
2.initLimit=10 初始化通信连接容忍度 单位tick心跳,10x2s=20s等待容忍时间
3.syncLimit=5 同步容忍时间 单位tick心跳 5x2s=10s 同步等待10秒容忍
4.dataDir数据持久化路径
5.clientPort客户端端口
内部原理
由于半数机制(超过半数台机器存活才可用)适合安装在奇数台服务器
例如5台机器 5/2>2 3台在工作即可运行 可容忍2台挂机
4台机器 4/2=2>台 只可容忍1台挂机
选举Leader 重点!
半数选举机制(启动时)
每个Leader候选人先投自己,如果超不过半数票则投给最大的myId服务器
选出Leader后再次加入新服务器,Leader不改变
节点类型
两种:持久或者短暂性
持久:断开连接节点不删除(Persistent)
短暂:断开连接即刻删除自己(Ephemeral)
1.持久化目录节点:断开连接后节点依旧存在
2.持久化顺序编号目录节点:断开连接后节点依旧存在,并且按照顺序编号
编号单调递增,由父节点维护
可以通过顺序号来推断事件的顺序
3.临时目录节点:断开连接后,节点被删除
4.临时顺序编号目录节点:断开连接时被删除,创建时按照顺序标号单调递增
Stat结构体
监听器原理(重点)!!
1.首先有一个main()线程
2.在main线程创建ZooKeeper客户端
会创建两个线程 一个负责通信(connect)一个负责监听(listener)
3.通过connect线程将注册的监听事件发送给ZooKeeper
4.在ZooKeeper的注册监听器列表中将注册的监听事件添加到列表里
5.ZooKeeper监听到数据或路径变化就会把这个消息发送给listener线程
6.listener线程内部调用了process()方法
写数据流程
客户端向一个服务器发送一个写请求
如果他不是Leader,会把信息转发给Leader
Leader广播写请求,所有Server写成功后通知Leader
当Leader收到了大于一半的成功了,那么数据就算成功了
之后Server1就会通知客户端认为写成功了
实战
分布式安装部署
zkData创建myid文件,编写对应编号
配置zoo.cfg
server. A=B:C:D
A 服务器编号
B 服务器ip地址
C 与Leader信息交换的端口号
D Leader挂了之后选举信息端口号
启动:bin/zkServer.sh start
客户端不加start
bin/zkCli
命令行操作
-
ls [path]
-
ls2 [path] 详细数据
-
创建节点
create [path] [data]
-
取数据
get [path]
-
创建短暂节点(断开客户端连接后删除)
create -e [path] [data]
-
创建序号节点
create -s [path] [data]
-
修改节点值
set [path] [data]
-
节点值变化监听
一次性有效
get [path] watch
-
监听子节点变化(路径变化)
ls [path] watch
-
删除节点
delete [path]
-
递归删除节点
deleteall [path]或者rmr(过时)
API应用
添加pom文件
拷贝log4j
连接ZooKeeper
创建子节点
create(path,data,ACL权限,创建模式(短暂或序号))
获取子节点并监控
因为需要watch所以写到监听器内部类中
判断节点是否存在
监听服务器动态上下线
服务器向ZooKeeper写入自己信息
客户端读取服务器信息
企业面试真题
选举机制
半数机制,达到半数,选择其作为Leader
监听原理
main中包含listener和connect
connect注册监听器,监听器列表增加一个客户端
当满足监听器要求,回调listener线程process()方法
服务器返回数据
部署方式 角色有哪些 集群最少需要几台机器
单机和集群
leader和follower
3
常见命令
get set create delete ls ls2