1. 什么是ZooKeeper?
- 是Google的Chubby的一个开源实现版
- ZooKeeper
- 一个主从架构的分布式框架、开源的
- 对其他的分布式框架的提供协调服务(service)
- Zookeeper 作为一个分布式的服务框架
- 它提供类似于linux文件系统(有目录节点树)的简版文件系统来存储数据
- Zookeeper 维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理
- 主要用来解决分布式集群中应用系统的一致性问题
2. 为什么要用ZooKeeper
- ZooKeeper简单易用,能够很好的解决分布式框架在运行中,出现的各种协调问题。
- 比如集群master主备切换、节点的上下线感知、统一命名服务、状态同步服务、集群管理、分布式应用配置管理等等
3. ZooKeeper应用初体验
- ZooKeeper集群也是主从架构的:leader为主;follower为从
- 通过客户端操作ZooKeeper集群,有两种类型的客户端
- ①命令行zkCli
- ②Java编程
- zkCli命令行
- # 启动ZooKeeper集群;在ZooKeeper集群中的每个节点执行此命令
${ZK_HOME}/bin/zkServer.sh start
- # 停止ZooKeeper集群(每个节点执行以下命令)
${ZK_HOME}/bin/zkServer.sh stop
- # 查看集群状态(每个节点执行此命令)
${ZK_HOME}/bin/zkServer.sh status
- # 使用ZooKeeper自带的脚本,连接ZooKeeper的服务器
zkCli.sh -server node01:2181,node02:2181,node03:2181
2181:默认端口,-server选项后指定参数node01:2181,node02:2181,node03:2181,客户端随机的连接三个服务器中的一个
- 客户端发出对ZooKeeper集群的读写请求
- ZooKeeper集群中有类似于linux文件系统的一个简版的文件系统;目录结构也是树状结构(bi 目录树)
- 重要技巧:不会就喊help
- 还记得其它框架中help的使用吗?
- 常用命令
- #查看ZooKeeper根目录/下的文件列表 ls /
- #创建节点,并指定数据 create /kkb kkb
- #获得某节点的数据 get /kkb
- #修改节点的数据 set /kkb kkb01
- #删除节点 delete /kkb
- Java API编程
- 略
4.基本概念和操作
4.1 分布式通信有几种方式
- 1、直接通过网络连接的方式进行通信
- 2、通过共享存储的方式,来进行通信或数据的传输(ZooKeeper使用第二种方式,提供分布式协调服务)
4.2 ZooKeeper数据结构(ZooKeeper=①简版文件系统(Znode)+②原语+③通知机制(Watcher)。)
- ZK文件系统
- 基于类似于文件系统的目录节点树方式的数据存储
- 原语
- 可简单理解成ZooKeeper的基本的命令
- Watcher(监听器)
4.3 数据节点ZNode
4.3.1 什么是ZNode(Zookeeper的目录有专门的称呼:ZNode)
- ZNode分为四类:
- 1、持久的无序节点 create
- 2、持久的有序节点 create -s
- 3、临时的无序节点 create -e
- 4、临时的有序节点 create -s -e
4.3.2 持久节点:类比,文件夹
- # 创建节点/zk_test,并设置数据my_data
- create /zk_test my_data
- # 持久节点,只有显示的调用命令,才能删除永久节点
- delete /zk_test
4.3.3 临时节点:临时节点的生命周期跟客户端会话session绑定,一旦会话失效,临时节点被删除。
- # client1上创建临时节点
- create -e /tmp tmpdata
- # client2上查看client1创建的临时节点
- ls /
- # client1断开连接
- close
- # client2上观察现象,发现临时节点被自动删除
- ls /
4.3.4 有序节点:
- ZNode也可以设置为有序节点
- 为什么设计临时节点?
- 防止多个不同的客户端在同一目录下,创建同名ZNode,由于重名,导致创建失败
- 如何创建临时节点
- 命令行使用-s选项:create -s /kkb kkb
- Curator编程,可添加一个特殊的属性:CreateMode.EPHEMERAL
- 一旦节点被标记上这个属性,那么在这个节点被创建时,ZooKeeper 就会自动在其节点后面追加上一个整型数字
- 这个整数是一个由父节点维护的自增数字。
- 提供了创建唯一名字的ZNode的方式
- # 创建持久、有序节点
- create -s /test01 test01-data
4.4会话(Session)
4.4.1 什么是会话
- 客户端要对ZooKeeper集群进行读写操作,得先与某一ZooKeeper服务器建立TCP长连接;此TCP长连接称为建立一个会话Session。
- 每个会话有超时时间:SessionTimeout
- 当客户端与集群建立会话后,如果超过SessionTimeout时间,两者间没有通信,会话超时
4.4.2 会话的特点
- 客户端打开一个Session中的请求以FIFO(先进先出)的顺序执行;
- 如客户端client01与集群建立会话后,先发出一个create请求,再发出一个get请求;
- 那么在执行时,会先执行create,再执行get
- 若打开两个Session,无法保证Session间,请求FIFO执行;只能保证一个session中请求的FIFO
4.4.3 会话的生命周期
- 会话的生命周期
- 未建立连接
- 正在连接
- 已连接
- 关闭连接
4.4.4 请求
- 读写请求
- 通过客户端向ZooKeeper集群中写数据
- 通过客户端从ZooKeeper集群中读数据
4.5 事务zxid
- 事务
- 客户端的写请求,会对ZooKeeper中的数据做出更改;如增删改的操作
- 每次写请求,会生成一次事务
- 每个事务有一个全局唯一的事务ID,用 ZXID 表示;全局自增
- 事务特点
- ACID:
- 原子性atomicity | 一致性consistency | 隔离性isolation | 持久性durability
- ZXID结构:
- 通常是一个64位的数字。由epoch+counter组成
- epoch、counter各32位