Zookeeper学习---基础知识
如若还没安装ZooKeeper,请看这
Zookeeper的安装
一脸懵逼搭建Zookeeper分布式集群
定义: Zookeeper
是一个高性能、分布式的开源分布式应用协调服务。Zookeeper
的设计目标是将那些复杂且容易出错的分布式协同服务封装起来,抽象出一个高效可靠的原语集,并以一些列简单的接口提供给用户使用。
它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,配置管理,集群管理,命名空间。它被设计为易于编程,使用文件系统目录作为数据模型。服务端跑在java
上,提供java
和C的客户端API。
Zookeeper 适用于存储和协同相关的关键数据,不适合用于大数据量存储。
zk本身就是分布式系统
ZooKeeper的特性
- 一致性:数据的一致性,数据按照顺序先后存储;
- 原子性:要么全部成功,要么全部失败;
- 单一视图:客户端连接集群的任一zk节点,数据都是一致的;
- 可靠性:每次对zk的操作状态都会保存到服务端;
- 实时性:客户端可以读取到zk服务端的最新数据;
ZooKeeper解压包下的目录介绍
- bin:
- config:
- contrib:附加目录(一般用不到);
- dist-maven:mvn编译后的目录;
- docs:文档帮助;
- lib:需要依赖的jar包;
- recipes:案例demo代码;
- src:源码;
ZooKeeper的zoo.cfg配置文件
- tickTime: 用于计算的时间单元,比如 session超时: N * tickTime;
- initLimit: 用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数来表示;
- syncLimit: 用于集群,master主节点与从节点之间发送消息,请求和应答时间长度.(心跳机制)
- dataDir:必须配置,是一些数据文件的保存路径;
- dataLogDir:日志目录,如果不配置,将会和dataDir使用同一路径;
- clientPort: 连接服务器的端口,默认2181;
ZooKeeper数据模型
ZooKeeper的数据模型是层次模型。
层次模型常见于文件系统,层次模型和 key-value 模型是两种主流的数据模型。 ZooKeeper 使用文件系统模型主要基于以下两点考虑:
- 文件系统的树形结构便于表达数据之间的层次关系。
- 文件系统的树形结构便于为不同的应用分配独立的命名空间(namespace)。
ZooKeeper 的层次模型称作 data tree。 Data tree的每个节点叫做 znode. 不同于文件系统,每个节点都可以保存数据。每个节点都有一个版本(version)。 版本从 0 开始计数。
znode分类
- 持久性的 znode(PRESISTENT):这样的znode在创建之后即使发生ZooKeeper集群宕机或者client宕机也不会丢失;
- 临时性的 znode(EPHEMERAL):client宕机或者client在指定的 timeout 时间内没有给 ZooKeeper集群发消息,这样的 znode 就会消失;
znode 也可以是顺序性的。每一个顺序性的znode关联一个唯一的单调递增整数。这个单调递增整数是 znode 名字的后缀。如果上面两种 znode具备顺序性,又有以下两种 znode: - 持久顺序性的 znode(PRESISTENT_SEQUENTIAL):znode除了具备持久性 znode 的特点之外, znode 的名字具备顺序性;
- 临时顺序性的 znode(EPHEMERAL_SEQUENTIAL): znode除了具备临时性 znode 的特点之外,znode的名字具备顺序性;
ZooKeeper总体架构
应用使用 ZooKeeper 客户端使用 ZooKeeper 服务. ZooKeeper 客户端负责和 ZooKeeper 集群的交互. ZooKeeper 集群可以有两种模式: standalone(单点)模式 和 quorum(多点)模式. 处于 standalone模式的 Zookeeper集群只有一个独立运行的 Zookeeper 节点. 处于 quorum 模式的 Zookeeper 集群包含多个 Zookeeper 节点;
standalone模式一般用于开发, quorum模式一般用于生产环境;
Quorum 模式
处于 Quorum模式的 Zookeeper 集群包含多个 Zookeeper节点. 下图中的 Zookeeper 集群有3个节点,其中节点1 是 leader节点,节点 2 和节点 3是follower节点. leader节点可以处理读写请求, follower节点只可以处理读请求. follower 在接到写请求时会把写请求转发给leader 来处理;
ZooKeeper常用命令
启动ZooKeeper Server 和 client
client端进行命令的操作
- ls:查看节点信息—ls /
- ls2:查看zookeeper节点的状态信息 —ls2 /zookeeper
- get:get /
- stat:stat /
- create:
- create /app1 app1-data(默认:持久化节点)。
create -e /app1/tmp app1 tmp-data(临时节点session断开之后不会立即失效,与心跳时间有关)。
create -s /app1/sec sec01(创建顺序节点)。
set:
set / app1 new-app1-data(修改数据)
set /app1 new-app1-data 1(指定版本,乐观锁,与当前版本对比,不一致不能修改)。
delete:
delete /app1/sec0000001(直接删除)。
delete /app1/sec0000002(添加乐观锁删除最新版本)。
rmr /node (删除节点包括子节点)
查看节点状态时各个属性的意义
- cZxid:zookeeper创建这个节点之后,为这个节点分配的一个id。
- ctime:zookeeper的创建时间。
- mZxid:修改后的zookeeper分配的id。
- mtime:修改时间。
- pZxid:子节点的id。
- cversion:子节点版本
- dataVersion:当前节点的数据版本号(修改数据后会加一)。
- aclVersion:权限发生变化会加一。
- ephemeralOwner:表示是临时节点还是持久化节点。
- dataLength:数据长度。
- numChildren:子节点的个数。
session的基本原理
Zookeeper 客户端库和 Zookeeper 集群中的某个节点创建一个 session. 客户端可以主动关闭 session. 另外如果 Zookeeper 节点没有在 session 关联的 timeout 时间内收到客户端的消息的话,Zookeeper 节点也会关闭 session. 另外 Zookeeper 客户端库如果发现连接的 Zookeeper 出错,会自动和其它 Zookeeper 节点建立连接;
- 客户端与服务端之间的连接存在会话;
- 每个会话都可以设置一个超时时间;
- 心跳结束,session则过期;
- session过期,则临时节点znode就会被抛弃;
- 心跳机制是指,客户端向服务端的ping包请求;
watcher机制
- 针对每个节点,都会有一个监督者—watcher;
- 当监控的某个对象(znode)发生了变化,则触发watcher事件;
- zk中的watcher是一次性的,出发后立即销毁.
- 父节点,子节点增删改都能够触发其watcher;
- 针对不同类型的操作,触发的watcher事件也是不同的;
zk在开源项目中的使用:
- Hadoop:使用 Zookeeper 做 Namenode的高可用。
- HBase:保证集群中只有一个 master,保存集群中的 RegionServer 列表,保存 hbase:meta 表的位置;
- Kafka:集群成员管理,controller节点选举。
zk的应用场景:
- 配置管理(configuration management)
- DNS 服务
- 组成员管理(group membership)
- 各种分布式锁