一、概述
zookeeper是什么
一种分布式应用协调服务,解决分布式数据的一致性,将那些复杂的、容易出错的分布式一致性封装起来,构成一个可靠的原语集,并提供一系列简单易用的接口给用户使用。
zookeeper的典型应用场景
1、数据发布与订阅服务
应用配置集中到节点上,应用启动时主动获取,并在节点上注册一个watcher,每次配置更新都会通知到应用。
2、负载均衡
多个应用服务与zk保持连接,在zk上都会注册一个节点,如果某一个应用服务出现了问题,则这个节点会在zk中删除,那么zk就能保证服务器列表一直是最新的可用列表
3、命名服务
提供一个全局唯一的名称。例如数据库的主键唯一性,在分布式的情况下,zk则可以提供一个全局唯一自增的的主键id。
4、分布式通知/协调
不同的系统都监听同一个节点,一旦有了更新,另一个系统能够收到通知。
二、zookeeper中的基本概念
1、集群角色:
集群角色有3种:Leader、Follower、Observer。
Leader:整个zookeeper集群中的核心。
Follower:zookeeper集群中的跟随者。
Observer:服务器充当观察者角色
2、会话:
指客户端与zookeeper服务器的连接,zookeeper中的会话就叫session,客户端靠与zookeeper建立一个TCP的长连接来维持一个session,客户端在启动的时候首先会与zookeeper建立一个TCP连接,通过这个连接,客户端能通过心跳检测与服务器保持有效的会话,也能向zk发送请求并响应。
3、节点:
集群中的一台zk服务器称为一个节点、数据模型中的一个单元znode也为一个节点。zookeeper的数据模型是一棵树,树的节点就是znode,znode中可以保存信息,znode分为两种:持久型和临时型。
所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。
和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
4、版本:
当数据节点数据发生了更新则版本号会加一,版本存在的目的是为了解决分布式中的事务,通过版本提供悲观锁和乐观锁。
版本类型 | 说明 |
---|---|
version | 当前数据节点内容的版本号 |
cversion | 当前数据节点子节点的版本号 |
aversion | 当前数据节点ACL变更的版本号 |
5、事件监听器(watcher):
zk允许用户在指定节点上注册一些watcher,当数据节点发生变化时,zk服务器会把这个变化的通知发送给该watcher。
6、ACL权限控制:
access control lists的简写,zookeeper采用ACL策略来进行权限控制。控制数据节点增删改查的权限。
三、zookeeper环境搭建
这里模拟在一台物理机(linux虚拟机)上搭建3个zookeeper集群。
1、下载zookeeper:http://www.apache.org/dyn/closer.cgi/zookeeper/
2、解压到你的物理机上,这里我解压到了/opt目录下,同时拷贝出3个zookeeper,便于搭建3个集权
3、创建配置文件:在conf目录下根据给的zoo_sample.cfg拷贝出一个zoo.cfg文件,然后编辑
配置数据存放的位置:dataDir=/var/zk,其他两个分别配置为/var/zk2,/var/zk3
配置端口:2181,其他两个分别配置为2182,2183
配置集群的ip和端口(3个都配置一样):
server.1=192.168.1.105:2888:3888
server.2=192.168.1.105:2889:3889
server.3=192.168.1.105:2890:3890
4、在dataDir的路径下各新建一个myid文件,内容分别记录1、2、3。代表了集群中的server.1,server.2,server.3。
5、启动zk。(启动文件在bin目录下)(分别启动其他两个zk)
./zkServer.sh start
6、确认是否3个都已经启动了
使用jps命令确定是否有3个进程。
使用telnet命令连接其中一个zk服务器,使用stat命令查看状态
四、zookeeper客户端使用
1、连接客户端:
./zkCli.sh -timeout 5000 -server 192.168.1.104:2181
2、创建节点:
create [-s] [-e] path data acl:-s代表顺序节点,-e代表临时节点(只在当前连接的会话有效)
create /node_1 data1
3、查看节点状态与值:
get path [watch]
get /node_1
相关说明:
cZxid:创建是分配的唯一事务id。
ctime:创建时间
mZxd:更新时分配的唯一事务id
mtime:修改时间
pzxid:当前节点的子节点最后一次修改的事务id(子节点的修改包括增加了一个子节点或者删除了一个子节点)
。。。
4、修改节点
set path data [version]
set /node_1 data2
修改之后数据节点的版本号dataVersion就会增加1。
5、删除节点
delete path [version]:只能删除没有子节点的节点
rmr path:可以删除某个节点下的所有节点。当某个节点存在子节点的时候,会把子节点也会删除掉。
6、设置与查看节点的子节点个数和数据的长度:
setquota -n|-b val path:-n代表子节点个数;-b代表节点数据长度。
listquota path:查看
delquota [-n|-b] path:删除
五、zookeeper的权限控制
权限由3部分组成:
* 1、权限模式(scheme):ip、digest
* 2、授权对象:
* ip权限模式:具体授权的ip
* digest权限模式:具体授权的用户Base64(SHA-1(username:password))
* 3、权限(permission):create(C)、delete(D)、Read(R)、write(W)、admin(A)