Zookeeper 初步认识及基本应用
初步认识zookeeper
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby的开源实现。Zookeeper的设计目的是将那些复杂且容易出错的分布式一致性服务封装起来。构成一个高效可靠的原语集(由若干条指令组成的,完成 一定功能的一个过程),并且以一些简单可用的接口提供给用户使用 zookeeper。
zookeeper 是什么
分布式数据一致性解决方案
zookeeper 解决的问题
作为一种中间件去解决资源共享的问题,如下:
-
协议地址维护
-
负载均衡机制
-
zookeeper 能做什么
数据的发布/订阅(配置中心:disconf)、负载均衡(dubbo利用了zookeeper机制实现负载均衡)、命名服务、
master选举(kafka、hadoop、hbase)、分布式队列、分布式锁
zookeeper 数据结构
zookeeper 的特性
- - 顺序一致性
从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中
- - **原子性**
所有的事务请求处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的所有机器都成功应用了某一事务、要么全都不应用。
- - **可靠性**
一旦服务器成功应用了某一事务数据,并且对客户端做了响应,那么这个数据在整个集群中一定是同步并且保留下来的
- - **实时性**
一旦一个事务被成功应用,客户端就能够立即从服务器端读取到事务变更后的最新数据状态;(zookeeper仅仅保证在一定时间内、近实时)
zookeeper 节点特性
- - **临时节点(生命周期)**(**session 关闭,临时节点清除**)
- - 持久化节点)
- - 有序节点(递增序列号)
- - 先有父节点,再有子节点
- - 临时节点下不能存在子节点
- - 同级节点下,节点名称必须是唯一
大多数时候,我们对zookeeper的操作都是在对节点进行增、删、改、查
zookeeper 核心zoo.cfg配置文件
- - tickTime=2000 zookeeper中最小的时间单位长度 (ms)
- - initLimit=10 follower节点启动后与leader节点完成数据同步的时间(10表示10个ticktime)
- - syncLimit=5 leader节点和follower节点进行心跳检测的最大延时时间 (2000 * 5=10秒)
- - dataDir=/tmp/zookeeper 表示zookeeper服务器存储快照文件的目录
- - dataLogDir 表示配置 zookeeper事务日志的存储路径,默认指定在dataDir目录下
- - clientPort 表示客户端和服务端建立连接的端口号: 2181
zookeeper安装
单机环境安装
http://archive.apache.org/dist/zookeeper/stable/
-
2、解压zookeeper
tar -zxvf zookeeper-3.4.10.tar.gz
-
3、cd 到ZK_HOME/conf,copy一份zoo.cfg cp zoo_sample.cfg zoo.cfg
-
4、sh zkServer.sh
{start|start-foreground|stop|restart|status|upgrade|print-cmd}
-
启动命令
sh zkServer.sh start
-
5、sh zkCli.sh -server ip:port
客户端连接
-
zookeeper连接
sh zkCli.sh -server localhost:2181
退出
./zkServer.sh stop
zookeeper 常用命令
- 连接服务器 :
- bin/zkCli.sh -server 127.0.0.1:2181
- 启动 ZK 服务: bin/zkServer.sh start
- 查看 ZK 服务状态: bin/zkServer.sh status
- 停止 ZK 服务: bin/zkServer.sh stop
- 重启 ZK 服务: bin/zkServer.sh restart
-
创建节点指令
create [-s] [-e] path data acl
-s 表示节点是否有序
-e 表示是否为临时节点
默认情况下,是持久化节点
[zk: 192.168.1.102:2181(CONNECTED) 4] create -e /node1/node-2 234
get path 获取指定节点的内容
-
删除节点
delete /node_1/node_1_10000000001
-
整个节点全删除
注意:delete只能删除不包含子节点的节点,如果要删除的节点包含子节点,使用rmr命令
rmr /node_1
查询相关指令
[zk: 192.168.1.102(CONNECTED) 18] ls /
[zookeeper]
-
cZxid = 0x500000015 创建节点时的事务id
-
ctime = Sat Aug 05 20:48:26 CST 2017 节点创建时间
-
mZxid = 0x500000016
-
mtime = Sat Aug 05 20:48:50 CST 2017 节点修改时间
-
pZxid = 0x500000015 子节点列表最后一次被修改的事务id(子节点变更以后才会产生pZxid的影响)
-
cversion = 0 节点版本号
-
dataVersion = 1 表示的是当前节点数据的版本号
-
aclVersion = 0 acl权限版本号(CREATE/READ/WRITE/DELETE/ADMIN)每种权限的粒度都不一
样
-
ephemeralOwner = 0x0 创建临时节点的时候,会有一个sessionId 。 该值存储的就是这个sessionid
-
dataLength = 3 数据值长度
-
numChildren = 0 子节点数
zookeeper 会话生命周期
- - ⼀个会话从NOT_CONNECTED状态开始,当ZooKeeper客户端初始化后转换到CONNECTING状态(箭头①)
- - 正常情况下,成功与 ZooKeeper服务器建⽴连接后,会话转换到CONNECTED状态(箭头②)
- - 当客户端与ZooKeeper服务器断开连接或者⽆法收到服务器的响应时,它就会转换回CONNECTING状态(箭头③)并尝试发现其他ZooKeeper服务器:
- - 如果可以发现另⼀个服务器或重连到原来的服务器,当服务器确认会话有效后,状态又会转换回CONNECTED状态(箭头②)
- - 否则,它将会声明会话过期,然后转换到CLOSED状态(箭头④)
- - 应⽤也可以显式地关闭会话(箭头④和箭头⑤)
zookeeper 实现原理