Zookeeper简介
提出问题
概述
- 中间件,提供协调服务。
- 作用于分布式系统,发挥其优势,可以为大数据服务。
- 支持Java,提供Java和C语言的客户端API。
Zookeeper的特性
- 一致性:数据一致性(非强一致性),数据按照顺序分批入库。
- 原子性:事务要么成功,要么失败,不会局部化。
- 单一视图:客户端连接集群中的任一zk节点,数据都是一致的。
- 可靠性:每次对zk的操作状态都会保存在服务端。
- 实时性:客户端可以读取到zk服务端的最新数据。
Zookeeper目录结构
- bin:主要的一些运行命令。
- conf:存放配置文件。
- zoo.cfg。
- tickTime:用于计算的时间单元,是基本的时间单元。比如session超时:N*tickTime。
- initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数表示。
- syncLimit:用于集群,master主节点与从节点间发送消息,请求和应答的时间长度(心跳机制)。
- dataDir:数据存放的目录。
- dataLogDir:日志目录,不配置则值为dataDir。
- clientPort:连接服务器的端口,默认2181。
- zoo.cfg。
- contrib:附加的功能。
- dist-maven:mvn编译后的目录。
- docs:文档。
- lib:需要依赖的jar包。
- recipes:案例demo代码。
- src:源码。
Zookeeper作用
- master节点选举:主节点挂了后,从节点就会接手工作,并且保证这个节点是唯一的,即首脑模式,从而保证我们的集群是高可用的。
- 统一配置文件管理:即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中运用很多(如修改了redis统一配置)。
- 发布与订阅,类似消息队列,dubbo发布者将数据存在znode中,订阅者会读取这个数据。
- 提供分布式锁,分布式环境中不同进程间争夺资源,类似于多线程中的锁。
- 集群管理,集群中保证数据的强一致性。
- 会将主节点的数据同步到子节点中。
应用
适用性
案例1
对比
Zookeeper基本数据模型
是一个树形结构,类似于前端开发中的tree.js:
- 即zookeeper的数据模型可以理解为一个文件目录:/user/local等。
每一个节点都称为znode,可以有子节点,也可以有数据。
- 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失。
- 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息。
- 每当节点数据发生变化,则节点的版本号会累加(乐观锁)。
- 删除/修改过时节点,版本号不匹配会报错(乐观锁)。
- 每个zk节点存储的数据不宜过大,几K即可。
- 节点可以设置权限acl,通过权限限制用户的访问。
Zookeeper数据模型基本操作
启动zookeeper:sh zkServer.sh start
常用命令行操作
进入zookeeper
在bin目录下的sh zkCli.sh <server>
则会进入到zookeeper当中。
命令
- ls:查看zookeeper的节点或数据。
- ls2:会显示状态信息,ls+stat。
- get:提前当前目录的数据。
- stat:状态信息,==status。
- cZxid:创建后,zookeeper为这个节点所分配的ID。
- cTime:创建时间。
- mZxid:修改后的ID。
- pZxid:子节点的ID。
- cversion:子节点的version。
- dataVersion:当前数据的版本号。
- aclVersion:权限。
- ephemeralOwner:如果有值则为临时节点。
- dataLength:数据长度。
- numChildren:下面子节点的数目。
create命令:
create [-s] [-e] path data acl
- -e:创建一个临时节点。
- -s:顺序节点。
set命令
set path data [version]
- 每次set后,dataversion都会改变。
- 乐观锁:
set path data [originalVersion] [version]
delete命令
delete path [version]
Zookeeper特性
session的基本原理
客户端与服务端之间的连接存在会话。
每个会话都可以设置一个超时时间。
心跳结束,session则过期。
session过期,则临时节点znode会被抛弃。
心跳机制,客户端向服务端的ping包请求。
watcher机制
- 针对每个节点的操作,都会有一个监督者->watcher。
- 即当节点发生一些变化,都会触发一个watcher,即一个事件。
- 当监控的某个对象发生了变化,则触发watcher事件。
- zk中的watcher是一次性的,触发后立即销毁。
- 也可以设置为永久性的。
- 父节点、子节点的增删改都能够触发其watcher。
- 不同的操作会触发不同的watcher事件。
- (子)节点创建(删除\数据变化)事件。
watcher设置
get path [watch]
。设置watcher。stat path [watch]
。ls path [watch]
。ls2 path [watch]
。
事件类型
创建父节点触发:NodeCreated。
1
2
3watcher::
WatchedEvent state:SyncConnected type:NodeCreated path:/path
修改父节点数据触发:NodeDataChanged。
删除父节点触发:NodeDeleted。
创建子节点触发:NodeChildrenChanged。
删除子节点触发:NodeChildrenChanged。
修改子节点不会触发事件。如果要监听子节点的修改事件,必须将其当作父节点。而删除等操作,其与父节点存在联系,对其有影响。
适用性
- 统一资源配置。
- 当更新了节点为新的配置信息,则触发watcher去更新其他的客户端配置。
ACL
access control lists。
- 针对节点可以设置相关读写等权限,目的是为了保障数据安全性。
- 权限permissions可以指定不同的权限范围与角色。
概述
默认权限 :
1 | ‘world,'anyone |
ACL构成
[scheme: id:permissions]来构成权限列表。
- scheme:代表采用的某种权限机制。
- world:world下只有一个id,即只有一个用户,也就是anyone。
- auth:代表认证登录,需要注册用户有权限就可以,需要明文密码。
- digest:需要对密码加密才可以访问。
digest:username:BASE64(SHA1(password)):[permissions]
,需要密文密码。
- id:代表允许访问的用户。
- ip:当设置为IP指定的IP地址,此时限制IP进行访问,例如
ip:192.168.1.1:[permisssion]
。 - super:代表超级管理员,拥有所有的权限。
- ip:当设置为IP指定的IP地址,此时限制IP进行访问,例如
- permissions:权限组合字符串,缩写crdwa。
- 赋值时可以任意组合,例如crw。
- CREATA:创建子节点。READ:获得节点/子节点。WRITE:设置节点数据。DELETE:删除子节点。ADMIN:设置权限,即是最高的权限。
命令行
getAcl path
:获取某个节点的acl权限信息。setAcl path acl
:设置某个节点的acl权限信息。addauth
:输入认证授权信息,注册时输入密码登录。
适用性
- 开发/测试环境分离,开发者无权操作测试库的节点,只能看。
- 生产环境上控制指定IP的服务可以访问相关节点,防止混乱。
四字命令
Four Letter Words
- zk可以通过它自身提供的简写命令来与服务器进行交互。
- 需要使用nc命令,yum install nc。
echo [command] | nc [ip] [port]
- stat:查看zk的状态信息,以及是否mode,即是集群模式还是单例模式。
- ruok:查看当前zkserver是否启动,返回imok,即已启动。
- dump:列出未经处理的会话和临时节点。
- conf:查看服务器配置。
- cons:展示连接到服务器的客户端信息。
- envi:环境变量。
- mntr:监控zk健康信息。
- node数目、watch数目,临时节点等
- wchs:展示watch的信息。
- wchc与wchp:session与watch以及path与watch信息。
Zookeeper集群
zk集群:
- 主从节点。
- 心跳机制(选举模式)。
最少的集群至少有3个节点。当master挂掉后,经过选举模式,zz上位。如果xx节点恢复重连,则也无法回到Master位置上,而是作为一个Slave。
集群搭建注意点:
- 配置数据文件myid 1/2/3对应server1/2/3。即存在3台服务器。
- 通过./zkCli.sh -server [ip]:[port]检测是否配置成功。