1.Zookeeper是什么?
-
Zookeeper是apache基金会的顶级项目中的一员。
-
它是一个中间件,提供协调服务,是一个zoo keeper 即动物园管理者,协调“动物园”(Hadoop生态圈等)的各个“动物”(大象(Hadoop),蜜蜂(Hive))等。(据说动物管理员是当时雅虎的一位首席科学家RaghuRamakrishnan脱口而出的玩笑话)
-
它主要用于分布式系统,为大数据服务,常见的功能如Hadoop的HA机制
-
支持Java和C两种语言API
2.Zookeeper的特点
- 一致性:这里的一致性指数据一致性,数据按照顺序入库
- 原子性:和数据库的原子性一样,事务要么成功,否则失败
- 单一视图:客户端连接到集群的任一节点,访问的数据都是一致
- 可靠性:每次对zk的操作状态都会保存到服务端
- 实时性:客户端可以读取到zk服务端最新的数据
3.Zookeeper的目录结构
- bin 主要是运行命令
- conf Zookeeper的配置文件,主要是修改zoo.cfg进行配置
- contrib 附带的额外功能
- docs Zookeeper的文档
- lib Zookeeper的依赖jar包
- dist-maven Maven 编译后的目录,里面是一些jar包和相关pom等文件
- recipes Zookeeper提供的官方demo
- src Zookeeper源码
3.Zookeeper的配置
Zookeeper的配置都是在conf文件夹下的zoo.cfg中配置的,开始安装解压后文件名是zoo_sample.cfg 要复制一份并把文件名命名成zoo.cfg即可
- tickTime 用于计算的时间单元 比如session超市是N*tickTime
- initLimit 用于集群,允许从节点连接并同步到主节点的初始化连接时间,还是以tickTime的倍数
- syncLimit 用于集群,主节点与从节点之间发送消息,请求应答的时间长度,即心跳机制(客户端向服务端发送ping包请求)
- dataDir,必须要配置,而且路径不能是默认的,否则,机器重启之后/tmp可能会丢失,导致Zookeeper启动失败,此外此文件夹还是保存快照的路径
- dataLogDir 日志目录,不配置就和dataDir同一目录
- clientPort 连接服务端的接口,默认是2181
4. Zookeeper的数据模型
- 可以是一个树形结构,类似于前端的trss.js,我们在开发Zookeeper的Manager的界面时,也是使用tree.js进行展示
- Zookeeper的数据模型和linux1的文件结构差不多,每个文件夹被称为一个节点即znode,一个节点可以有多个子节点,节点都可以有数据
- 每个节点分为永久节点和临时节点,临时节点当客户端关闭,心跳结束后,临时节点则自动删除
- 每个Zookeeper节点都有各自的版本号,可以通过命令行显示节点信息
- 当节点数据发生改变时,版本号则自动累加(乐观锁)
- 删除修改过时的节点,版本号不匹配则会报错
- 每个Zookeeper节点存储数据不宜过大,几k即可
- Zookeeper可以通过acl命令设置权限,以此限制用户的访问
5.Zookeeper的特点
- 主从机制,主节点挂之后,从节点接手工作,保证Zookeeper的高可用
- 统一配置文件管理 ,即只需要部署一台服务器,则可以把相同的配置文件同步到集群中的其他服务器中,在云计算使用比较多,如修改了redis统一配置
- 发布订阅,类似于MQ,Kafka,dubbo 发布者把数据发布到znode,订阅者在znode读取数据
- 提供分布式锁
- 集群管理,保证数据的强一致性