1.zookeeper简介
- 中间件:提供协调服务。
- 作用于分布式系统,发挥其优势,可以为大数据服务。
- 支持java,提供Java和C语言的客户端API。
2.什么是分布式系统
- 很多计算机组成的一个整体,一个整体一致对外,并且处理同一请求。
- 内部的每台计算机都可以相互通信。(rest/rpc)
- 客户端到服务端的一次请求到响应结束会经历多台计算机。
3.zookeeper的特性
- 一致性:数据的一致性,数据按照顺序先后入库。
- 原子性:要么全部成功,要么全部失败。
- 单一视图:客户端连接集群的任一zk节点,数据都是一致的。
- 可靠性:每次对zk的操作状态都会保存到服务端。
- 实时性:客户端可以读取到zk服务端的最新数据(高并发情况需要断开重新连接)。
4.zookeeper目录介绍
- bin:
- config:
- contrib:附加目录(一般情况用不到)。
- dist-maven:mvn编译后的目录。
- docs:文档帮助。
- lib:需要依赖的jar包。
- recipes:案例demo代码。
- src:源码。
5.zoo.cfg配置
- tickTime:用于计算的时间单元,。比如session超时:N * tickTime。
- initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数来表示。
- syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答时间长度。(心跳机制)
- dataDir:必须配置,一些数据文件保存。
- dataLogDir:日志目录,如果不配置会和dataDir公用。
- clientPort:连接服务器的端口,默认2181。
6.zookeeper的基本数据模型
- 是一个树形结构。
- 每一个节点都称为znode,可以有子节点,也可以有数据。
- 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失。
- 每个zk节点都有自己的版本号,可以通过命令行来显示版本信息。
- 每当节点数发生变化,那么该节点的版本号会累加(乐观锁)。
- 删除/修改过时节点,版本不匹配则会报错。
- 每个zk几点存储的数据不宜过大,几K接口。
- 节点可以设置acl权限,可以通过权限来限制用户的访问。
7.zookeeper基本操作
- ls /
- ls /zookeeper/quota
8.zookeeper的作用
- master节点选举,主节点挂掉之后,从节点就会接手工作,并且保证这个节点是唯一的,这就是首脑模式,从而保证我们的集群是高可用的。
- 统一配置文件的管理,即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用到的比较多(例如修改了redis的统一配置)。
- 发布与订阅,类似消息队列MQ,dubbo发布者将数据存在znode上,订阅者会读取这个消息。
- 提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程中的锁。
- 集群管理,集群中保证数据的强一致性。
9.zookeeper的常用命令
- ls:查看节点信息---ls /
- ls2:查看zookeeper节点的状态信息 ---ls2 /zookeeper
- get:get /
- stat:stat /
- create:
- create /imooc imooc-data(默认:持久化节点)。
- create -e /imooc/tmp imooc-tmp-data(临时节点session断开之后不会立即失效,与心跳时间有关)。
- create -s /imooc/sec sec01(创建顺序节点)。
- set:
- set / imooc new-imooc-data(修改数据)
- set /imooc new-imooc-data 1(指定版本,乐观锁,与当前版本对比,不一致不能修改)。
- delete:
- delete /imooc/sec0000001(直接删除)。
- delete /imooc/sec0000002(添加乐观锁删除最新版本)。
- rmr /node (删除节点包含子节点)
- 状态中的属性(get/stat)
- cZxid:zookeeper创建这个节点之后,为这个节点分配的一个id。
- ctime:zookeeper的创建时间。
- mZxid:修改后的zookeeper分配的id。
- mtime:修改时间。
- pZxid:子节点的id。
- cversion:子节点版本
- dataVersion:当前节点的数据版本号(修改数据后会加一)。
- aclVersion:权限发生变化会加一。
- ephemeralOwner:表示是临时节点还是持久化节点。
- dataLength:数据长度。
- numChildren:子节点的个数。
10.session的基本原理
- 客户端与服务端之间的连接存在会话。
- 每个会话都可以设置一个超时时间
- 心跳结束,session则过期
- session过期,则临时节点znode会被抛弃。
- 心跳机制,客户端向服务端的ping包请求。
11.watcher机制
- 针对每个节点,都会有一个监督者---watcher。
- 当监控得某个对象(znode)发生了变化,则触发watcher事件。
- zk中的watcher是一次性的,触发后立即销毁。
- 父节点,子节点增删改都能够触发其watcher。
- 针对不同类型的操作,触发的watcher事件也是不同的。
- (子)节点创建事件。
- (子)节点删除事件。
- (子)节点数据变化事件。
12.watcher命令行
- 通过 get path [watcher]设置watcher。
- 父节点增删改操作触发watcher。
- 子节点增删改操作触发watcher。
13.watcher事件类型
- 创建父节点触发:NodeCreated。
- 针对imooc创建一个watcher事件: stat /imooc watcher。
- create /imooc 123 (先创建内容,后创建事件也可以)。
14.子节点watcher事件
- 修改父节点数据触发:NodeDataChanged。
- 删除父节点触发:NodeDeleted。
- ls为父节点创建watcher,创建子节点触发NodeChildrenChanged。
- ls为父节点创建 watcher,删除子节点触发NodeChildrenChanged。
- ls为父节点创建 watcher,修改子节点不触发事件。
15.watcher使用场景(类似触发器)
- 统一资源配置:主机节点更新配置信息,客户端监听到watcher事件,也更新客户端配置信息。
16.补充命令
- zookeeper当节点还有子节点的时候,delete命令无法删除父节点,可以使用rmr命令 rmr = rm -rf
- history查看历史命令