zookeeper的特性
- 一致性:数据一致性,数据按照顺序分批入库
- 原子性:事务要么成功要么失败,不会局部化
- 单一视图:客户端连接集群中的任意zk节点,数据都是一致的
- 可靠性:每次对zk的操作状态都会保存在服务端
- 实时性:客户端可以读取到zk服务端的最新数据
安装zookeeper
下载地址
https://zookeeper.apache.org/
上传到服务器后解压,环境变量配置,需要先安装jdk
vim /etc/profile
添加环境变量
JAVA_HOME=/opt/jdk1.8.0_101 MAVEN_HOME=/opt/apache-maven-3.3.9 ZOOKEEPER_HOME=/usr/local/zookeeper PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$ZOOKEEPER_HOME/bin export PATH
重新加载配置文件
source /etc/profile
zookeeper目录结构
- bin:主要的一些运行命令
- conf:存放配置文件
- contrib:附加的一些功能
- dist-maven:mvn编译后的目录
- docs:文档
- lib:需要依赖的jar包
- recipes:案例demo代码
- src:源码
复制conf下的zoo_sample.cfg重新命名为confzoo.cfg
修改zoo.cfg配置,在/usr/local/zookeeper/目录下创建dataDir,dataLogDir文件夹
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/local/zookeeper/dataDir dataLogDir=/usr/local/zookeeper/dataLogDir # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
配置文件说明
- 1.tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小 超时时间是2*tickTime)
- 2.initLimit =10:LF初始通信时限
- 集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
- 3.syncLimit =5:LF同步通信时限
- 集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
- 4.dataDir:数据文件目录+数据持久化路径
主要用于保存Zookeeper中的数据。 - 把默认的dataDir修改位置,不建议使用临时目录,需要创建dataDir,dataLogDir目录
- dataDir:必须配置
- dataLogDir:日志目录,如果不配置会和dataDir公用
- 5.clientPort =2181:客户端连接端口
监听客户端连接的端口。
Zookeeper基本数据模型
- 是一个属性结构,类似于前端开发中的tree.js组件
- 每一个节点都称之为znode,他可以有子节点,也可以有数据
- 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失,永久节点需要人为操作才会消失
- 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息
- 每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)
- 删除/修改过时节点,版本号不会匹配则会报错
- 每个zk节点存储的数据不宜过大,几k即可
- 节点可以设置权限acl,可以通过权限来限制用户的访问
zookeeper运行
进入到bin目录下,分别启动服务端可客户端
./zkServer.sh start ./zkCli.sh
可以用help命令查看指令帮助
zookeeper作用体现
- master节点选举,主节点挂掉以后,从节点就会接手工作,并且保证这个节点时唯一的,这也是所谓首脑模式,从而保证我们的汲取是高可用的。
- 统一配置文件管理,即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器。
- 发布与订阅,类似消息队列MQ,dubbo发布者把数据存在znode上,订阅者会读取这个数据
- 提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程中的锁
- 集群管理,集群中保证数据的强一致性
zookeeper特性-session的基本原理
- 客户端与服务端之间的连接存在会话
- 每个会话都可以设置一个超时时间
- 心跳结束,session则过期
- session过期,则临时节点znode会被抛弃
- 心跳机制,客户端向服务端的ping包请求
zookeeper基本命令操作
用客户端进入后可以用help来查找指令帮助
- ls path [watch] 查看
- stat path [watch] 获得节点的更新信息
cZxid :创建节点的id,每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
ctime : 节点的创建时间
mZxid :修改节点的id
mtime :修改节点的时间
pZxid :子节点的id
cversion : 子节点的版本
dataVersion : 当前节点数据的版本
aclVersion :权限的版本
ephemeralOwner :判断是否是临时节点
dataLength : 数据的长度
numChildren :子节点的数量
- get获取节点数据和更新信息
- create [-s] [-e] path data acl 创建节点
-s表示是顺序节点,
-e表示是临时节点
默认是持久节点
acl表示权限
不加版本号号是直接可以修改或者删除的,如果添加版本号了可以使用乐观锁机制,在定版本号不对的时候,是不能修改或者删除数据的
- set path data [version] 修改数据
- delete path [version] 删除数据
- rmr path 递归删除数据
watcher机制
1.针对每个节点的操作,都会由一个监督者->watcher
2.当监控的某个对象(znode)发生了变化,则触发watcher事件
3.父节点,子节点增删改都能够触发其watcher
4.针对不同类型的操作,触发的watcher事件也不同:子节点的创建、删除、修改等
watcher命令行学习
- 通过get path [watch]设置watcher
- 父节点增、删、改操作触发watcher
创建父节点触发:NodeCreated
stat查看该节点的情况,没有的话watch也是可以设置的
修改父节点数据触发:NodeDataChanged
删除父节点触发:NodeDeleted
ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged
ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
ls为父节点设置watcher,修改子节点不触发事件
watcher使用场景
- 统一资源配置