1. 官网
2. 简单概念
zookeeper也是基于内存的,数据保存在内存中,可以实现高吞吐量和低延迟
可以在大型的分布式系统中使用
zookeeper用于分布式协调
acl:访问控制
二进制安全:放的是字节数组
在csdn中搜索xxx
xxx site:csdn.com
3. 主从
zookeeper集群(主从,复制集群)
leader挂了以后,会进入无主状态
官方压测,zookeeper选择新的leader的时间不到200ms,可以很快进入高可用状态
4. 目录树结构
每个节点都可以存放数据,数据量很小,1MB
不要把zookeeper当成数据库使用,会减缓速度
5. 特征
6. 节点类型
持久节点(PERSISTENT)
持久顺序节点(PERSISTENT_SEQUENTIAL)
临时节点(EPHEMERAL)
顺序临时节点(EPHEMERAL_SEQUENTIAL)
client和server之间有session,session就是临时节点
可以通过session实现分布式锁,seesion在说明代码没有执行完毕,要继续加锁;session不在说明代码执行完毕,不要继续加锁了。比redis的setNx更方便
create -s :不会覆盖创建,会进行序列化
7. 集群配置
zookeeper的集群需要在配置文件中手动添加(redis的哨兵通过发布订阅知道的)
如果leader没有启动,通过3888端口进行通信,如果leader启动过了,通过2888端口进行通信
3888:用于选主投票
2888:用于leader接收write请求
8. 操作命令
session是临时节点,但也会统一视图,连接的server挂了以后,操作在其他server也可见
9. zookeeper安装
1. 下载、解压
2. 添加环境变量(ZOOKEEPER_HOME、PATH)
3. 复制一份zoo.cfg文件,并修改配置文件(dataDir、server.1 = node01:2888:3888)
4. 添加myid文件,并写入1
5. 启动:zkServer.sh start-foreground
6. 连接:zkCli.sh
10. observer
observer不参与投票,只提供读功能
设置observer:server.1=node01:2888:3888:observer
11. 算法
Paxos:基于消息传递的一致性算法
zookeeper协议:ZAB(原子广播协议)
原子:通过队列+2PC实现
广播:通过过半实现
因为过半就可以确定消息已经完成写操作,那么就有可能发生,Client读取到的是没有进行写操作的Follower,此时,可以通过sync从leader上同步一下数据。
ZAB流程图:
12 集群选主
1. 各个节点一直通过3888端口两两通信,所以能很快知道leader挂了
2. 只要任何节点发起投票,都会触发准leader发起自己的投票
3. 推选制:先选择Zxid最大的,再比较myid最大的
13. watch
zookeeper提供watch功能;
watch可以监控客户端的操作
watch分2类:
1. new zookeeper的时候,传入的watch,是session级别的,和path、node没有关系
2. getData时传入的watch
watch是一次性的,有了结果以后需要重新监听
重新监听new zk的watch:可以通过将zk.getData(path, watch, stat)中的watch设置为true
重新监听getData中的watch:将上面的watch设置为this
getData时也可以设置回调方法,是异步的
14. 用法
连接一个server挂了以后,重新连接新的server,session_id不会改变
zookeeper没有连接池的概念
可以在redis连接字符串中设置根目录(自己的跟目录)
刚new出来的Zookeeper,它的状态是连接中的状态,还没有准备好,可以通过countDownLatch来等Zookeeper准备完成;在状态是SyncConnected时,表示Zookeeper连接建立完成
zookeeper可以用于分布式配置,完成注册、发现
15. 分布式锁