Zookeeper学习总结
1、概述
zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目观察者模式涉及的分布式服务管理框架
负责存储和管理用户关心的数据
如果数据状态发生变化就会通知zookeeper用户做出反应
zookeeper:文件系统+通知机制
2、特点
- 有一个领导者和多个跟随者组成的集群
- 集群中只要有半数以上节点存活就可以正常服务,适合安装奇数台服务器(刚好一半也没办法正常服务)
- 全局数据一致性,每个Server保存一份相同的数据副本,client无论连接到哪个Server,数据都是一致的
- 更新请求顺序执行,同一个客户端更新请求依照发送顺序执行
- 数据更新原子性,更新要么成功要么失败
- 实时性,在一定时间范围内用户端能读取到最新数据
3、数据结构
与UNIX文件系统类似可以看做一个树,每个节点称作ZNode,默认可以存储1MB数据,通过路径唯一标识
4、提供的服务
- 统一命名服务(IP不容易记住但是域名容易)
- 统一配置管理(配置文件及修改同步)
- 统一集群管理
- 服务器节点动态上下线
- 软负载均衡
5、安装
安装到指定位置后打开CONF文件夹修改zoo_sample.cfg为zoo.cfg修改cfg中的数据存储目录,文件中的/tmp路径只是一个例子
问题1:JAVA_HOME路径问题
解决方法:去/etc/profile添加JAVA路径问题2:端口占用
查找8080端口占用并kill了对应PID
6、zoo.cfg参数解读 tickTime=2000 通信心跳时间 initLimit=10 初始通信时限 syncLimit=5 同步通信时限 dataDir:保存数据零
clientPort=2181 客户端连接端口,通常不做修改
7、增加配置
8、第一次启动选举机制
9、非第一次启动
10、zkCLi参数
11、节点类型
- 持久:客户端和服务器断开连接后创建的节点不删除
- 短暂:客户端和服务器断开连接后创建的节点自己删除
带序号的节点在添加时zookeeper会自动使用序号自加区分,不会报错不带序号的节点在添加时如果重名会报错
-e:临时节点
-s:自动给文件名添加序号
12、监听器原理
-w 监听,可以监听数据变换和路径变换
一次监听只会返回一次数据变换结果,想要继续监听就需要重新设置
delete 删除单个文件
deleteall 删除多个文件
13、写数据 leader端
客户端
14、面试真题
15、客户端、服务端API流程
- 客户端
【1】获取zk连接,Zookeeper(connectString(目标主机名),sessionTimeout(等待时长),new Watcher()(监控器))
【2】监控子节点,getChildren(监控子路径,是否监控T/F),这里会拿到子目录下所有子节点的,需要使用数组承接,后续使用遍历输出
【3】业务逻辑,睡眠
Thread.sleep(Long.MAX_VALUE),用于等待服务端节点的数据变化
- 服务端
【1】获取zk连接,Zookeeper(connectString(目标主机名),sessionTimeout(等待时长),new Watcher()(监控器))
【2】注册服务器到zk集群
create("/servers/"+hostname(目录名),hostname.getBytes()(数据),ZooDefs.Ids.OPEN_ACL_UNSAFE(要创建的节点的访问控制列表),CreateMode.EPHEMERAL_SEQUENTIAL(节点类型,临时/永久/是否带有序号))
【3】业务逻辑,睡眠
Thread.sleep(Long.MAX_VALUE),用于等待等待后续操作