一、分布式系统与Zookeeper简介
1. 简单介绍一下Zookeeper
- 是一个中间件,可以提供协调服务,比如说存储消息
- 作用于分布式系统,发挥其优势,可以为大数据服务
- 支持Java,提供java和c客户端的API
2. 什么是分布式系统?
- 很多台计算机组成一个整体,一个整体一致对外并且处理同一个请求
- 内部的每台计算机都可以互相通信(rest/rpc)
- 客户端到服务端的一次请求到相应结束会历经多台计算机

3. 列举一下Zookeeper的特性
- 一致性:数据一致性,只能保证数据的最终一致性,而不是强一致性,也就是说数据按照顺序分批入库,慢慢保存进来
- 原子性:事务要么成功,要么失败,不会局部化,局部化指的是部分机器成功,部分机器失败
- 单一视图:客户端连接集群中任意一个zookeeper节点,数据都是一致的
- 可靠性:每次对zookeeper的操作状态都会保存到服务端,我们可以去查看这个状态
- 实时性:客户端可以读到zookeeper服务端的最新数据
4. zoo.cfg常用配置有哪些?
-
tickTime:用于计算的基本时间单元,默认是2000ms。比如Session超时:给一个N倍数,N*ticktime后,会销毁
-
initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime倍数表示,默认10倍
-
syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答的时间(心跳机制),默认5倍
-
dataDir:数据存储的目录,必须指定
-
dataLogDir:日志目录,如果没有配置,将存储在dataDir
-
clientPort:连接服务器的端口,默认2181
5. Zookeeper都有哪些作用?
- master节点选举:主节点挂了以后,从节点就会接手主节点的工作,并且保证这个节点是唯一的。这也是首脑模式,从而保证我们的集群是高可用的。
- 统一配置文件管理:只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的比较多,比如可以统一修改redis的配置
- 发布与订阅:类似消息队列MQ,dubbo发布者把数据存储在znode上,订阅者会读取这个数据
- 提供分布式锁:提供在分布式环境下,类似于多线程中锁的机制,让不同的进制之间争夺资源

- 集群管理:集群中保证数据的强一致性。一个客户端修改了主节点的数据,那么主节点的附属节点也会同步修改,保证客户端不管从哪个节点读取数据,都是一致的
6. session的基本原理
-
客户端与服务端之间的连接存在会话,类似于Servlet中的session
-
每个会话都可以设置一个超时时间,客户端会定时向服务端发送一个ping包;心跳检测超时后,会话就会被清除
-
如果session过期,临时节点znode就会被抛弃或者删除
二、Zookeeper的基本数据模型
1. 简介
- 是一个树形结构,zk的数据模型也可以理解为linux/unix的文件目录:/usr/local…
- 每一个节点都称之为znode,它可以有子节点,也可以有数据
- 每一个节点分为临时节点和永久节点。临时节点除了人为对数据的操作,数据在客户端断开后也会消失;而永久节点相当于一个持久化的过程,这些数据只能人为添加或者删除。
- 每一个zk节点都有各自的版本号,可以通过命令行来显示节点信息
- 每当该节点的数据发生变化,该节点的版本号就会采用乐观锁的方式累加
- 删除或者修改过时的节点,版本号不匹配会报错
- 每个zk节点存储的数据不宜过大,几k即可
- 节点可以设置权限acl,可以通过权限限制用户的访问
2. 基本操作
- 启动zk和客户端连接zk
../bin/zkServer.sh start
../bin/zkCli.sh
- 显示指定节点的子节点
ls /xxxx/xxx
- 显示指定节点的子节点以及状态信息
ls2 /xxxx/xxx # 相当于ls + stat
状态信息解释:
cZxid:创建时节点的id
ctime:创建节点的时间
mZxid:修改后的节点id
mtime:修改节点的时间
pZxid:子节点的id
cversion:子节点的version
dataVersion:当前节点的版本号
aclVersion:权限相关版本号
ephemeralOwner:如果是0x0代表是永久节点,反之是临时节点
dataLength:数据长度
numChildren:子节点的个数
- 显示节点的状态
stat /xxx/xxx
- 取出指定节点的数据
get /xxx/xxx
- 创建节点
creat [节点名称] [数据] # 默认创建一个无序且持久化的永久节点
creat -e [节点名称] [数据] # 创建一个临时的节点
creat -s [节点名称] [数据] # 默认创建一个有序且持久化的永久节点,每次累加1
- 覆盖节点的数据
set [节点名称] [数据] # 直接覆盖节点的数据,并让其版本号+1
set [节点名称] [数据] [期望的版本号] # 类似于CAS,比较当前版本号和期望版本号是否相同,不同会报错
- 删除节点
delete [节点名称] # 直接删除该节点
delete [节点名称] [期望的版本号] # 只有版本号和当前最新的匹配才可以删除
建议使用带版本号的更新和删除机制,这样才可以实现乐观锁的机制
三、Watcher机制
1. 简单描述一下Watcher机制
- 针对每个节点的操作,比如说更新删除操作,都会有一个监督者,叫做watcher
- 当监控的某个对象(znode)发生了变化,则触发watcher事件,对于不同的操作,触发的watcher是不同的,比如说:节点创建、节点删除、节点数据更新
- zk中watcher是一次性的,触发后就会立即销毁
- 父节点和子节点都会触发watcher,也就是说对子节点进行操作时,该子节点的父节点也会触发
2. Watcher的事件类型都有哪些?
- 创建父节点触发:NodeCreated
- 修改父节点数据触发:NodeDataChanged
- 删除父节点触发:NodeDeleted
- 创建子节点时触发:NodeChildrenChanged,需要先在父节点创建watcher
- 删除子节点时触发:NodeChildrenChanged,需要先在父节点创建watcher
- 修改子节点时:不会触发任何事件,如果想要触发watcher,需要把该子节点当作父节点来创建和观察watcher
3. 创建节点的Watcher
get [节点名称] watcher
stat [节点名称] watcher
ls [节点名称] watcher
ls2 [节点名称] watcher
4. watcher的使用场景
- 统一资源配置:在一个zk集群中,给每个节点设置一个watcher。修改集群中节点的数据,此时会触发watcher修改客户端的配置;与此同时,集群中所有的zk都会更新数据并且触发watcher,最后将更新所有的配置信息
四、ACL权限控制
1. 简介
- 针对节点可以设置相关读写等权限,目的是保障数据安全性
- 权限permissions可以指定不同的权限范围和角色
2. Acl权限列表的构成
acl通过[scheme: id : permissions]来构成权限列表
- scheme:代表某种权限机制
- id:代表允许访问的用户
- permissions:权限组合字符串
3. 权限机制
-
world:world下只有一个id,即只有一个用户,也就是anyone,代表的是默认权限。组合的写法就是:world:anyone: [permissions]
-
auth:代表认证登录,需要注册用户拥有权限。组合的写法就是:auth:user:password:[permissions]
-
digest:需要对密码加密后才能访问。组合的写法就是:digest:user:BASE64(SHA1(password)):[permissions]
-
ip:限制ip地址访问。组合的写法就是:ip:xxx.xxx.xxx.xxx:[permissions]
-
super:超级管理员,拥有所有的权限。
auth和digest的区别在于,前者明文后者密文
对于super权限,需要修改zkServer.sh增加super管理员,最后重启zkServer.sh
4. 权限组合字符串
权限字符串列表:crdwa
- create:创建当前节点的子节点
- read:获取当前节点以及子节点
- write:设置当前节点的数据
- delete:删除当前节点的子节点
- admin:可以分配当前节点的权限
5. 命令行相关操作
- 获取某个节点的权限信息
getAcl [节点名称]
- 设置某个节点的权限信息
setAcl [节点名称] [权限列表]
- 注册用户
注册时输入明文密码,但是在zk系统中是以加密的形式存在的
addauth digest [用户名]:[密码]
6. 常用使用场景
- 开发和测试环境分离,开发者无权操作测试库的节点,只能看;测试和开发连接的节点不同。
- 防止集群连接混乱,生产环境上控制指定ip的服务可以访问相关节点
五、Four Latter Words
1. 简介
- zk可以通过它自身提供的简写来和服务器进行交互
- 需要安装nc:yum install nc
- 基本使用规则:echo [commond] | nc [ip] [port],端口和ip之间是一个空格而不是冒号
2. 常见四字命令
- stat:查看zk状态信息,以及是否是集群模式
- ruok:查看zkServer是否启动,如果启动会返回一个imok
- dump:列出未经处理的会话和临时节点
- conf:查看zk相关配置
- cons:展示连接到zk的客户端信息
- envi:查看zk的环境变量
- mntr:监控zk的健康信息
- wchs:展示watch的个数
- wchc和wchp:展示watch的详细信息