zookeeper学习笔记

简介

ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。从而用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。诸如:统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等功能。

一个典型的分布式数据一致性解决方案

特性

  1. 全局数据一致:每个 server 保存一份相同的数据副本,client 无论连接到哪个 server,展示的数据都是一致的,这是最重要的特征;
  2. 可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受。
  3. 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 Server 上消息 a 都将在消息 b 前被发布;偏序是指如果一个消息 b 在消息 a 后被同一个发送者发布,a 必将排在 b 前面。
  4. 数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态;
  5. 实时性:Zookeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。 6.监听+Znode节点(持久/短暂[临时]

应用场景

  • 担任服务生产者和服务消费者的注册中心
  • 统一配置管理、统一命名服务、分布式锁、集群管理。

集群角色

Leader

Zookeeper集群工作的核心 事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务器的调度者。 对于 create,setData,delete 等有写操作的请求,则需要统一转发给leader 处理,leader 需要决定编号、执行操作,这个过程称为一个事务。

Follower:

处理客户端非事务(读操作)请求,转发事务请求给 Leader; 参与集群 Leader 选举投票。 此外,针对访问量比较大的 zookeeper 集群,还可新增观察者角色。

Observer:

观察者角色,观察 Zookeeper 集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给 Leader服务器进行处理。 不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。

节点类型

  • 有序和无序
  • 持久和临时

权限控制

增,读,写,删,管理

注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

ALC举例

  • setAcl /niocoder/merryyou auth:test:test:cdrwa
  • setAcl /niocoder/merryyou world:anyone:cda
  • addauth digest test:test
  • setAcl /niocoder/ip ip:192.168.0.68:cdrwa

授权方式

IP,Digest用户名和密码,world(任何人都可以访问),super(超级管理员)

事件监听

None,NodeCreated,NodeDeleted,NodeDataChanged,NodeChildrenChanged

节点Stat结构

czxid:节点创建时的zxid

mzxid:节点最后一次修改时的zxid

pzxid:子节点最后一次修改时的zxid

ctime:节点创建时的时间戳,毫秒

mtime:节点最后一次修改时的时间戳,毫秒

version:节点数据的修改次数

cversion:子节点数据的修改次数

aversion:节点ACL的修改次数

ephemeralOwner:如果这是临时节点,保存节点拥有者的session id;否则为0

dataLength:节点数据长度

numChildren:子节点个数

安装与使用

安装

sudo apt-get install zookeeper

启动

cd /usr/share/zookeeper/bin

zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

连接

zkCli.sh -server host:port

命令

stat path [watch]
set path data [version]:版本一致时才更新,默认-1
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]:ls命令和stat命令的整合
setAcl path acl
setquota -n|-b val path
history 
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl:s顺序节点,e临时节点
addauth scheme auth
quit 
getAcl path
close 
connect host:port
 

四字命令

  1. 可以通过命令:echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader
  2. 使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。
  3. echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。
  4. echo kill | nc 127.0.0.1 2181 ,关掉server
  5. echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。
  6. echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。
  7. echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。
  8. echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。
  9. echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。
  10. echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
  11. echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

集群配置

server.A=B:C:D配置项 A:这是一个数字,表示这是第几号服务器 B:A服务器的IP地址 C:通讯端口,即A服务器与集群中的 Leader 服务器交换信息的端口 D:选举通讯端口,表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。 server.4=192.168.30.104:2182:2183:observer (observer的服务要在zoo.cfg里增加peerType=observer配置)

Author: bkdwei