zookeeper介绍
一、概念
Zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务 ,比如同步,配置管理,集群管理,名空间。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端跑在java上,提供java和C的客户端API。
什么是分布式系统:
多台计算机构成,计算机之间通过网络通信,彼此进行交互,并实现共同目标。
分布式系统存在什么问题:
计算机间会很混乱,不可控,这时候就需要一个协调者,zookeeper就可以充当这个协调者。
二、zookeeper功能结构介绍
协调: 多个节点一起完成的一个动作
作用:
1.集群成员管理 Group membership
2.锁 Locking
3.选主 Leader Election
4.同步 Synchronization
5.发布/ 订阅 Publisher/Subscriber
zookeeper数据模型
分层结构
树形结构中的每个节点叫做Znode
每个Znode都有数据 byte[]类型 ,也可以有子节点
节点路径
-斜线分隔 /Zoo/Duck
-没有相对路径
通过数据结构stat来存储数据的变化 ACL的变化和时间戳
数据发生变化时,版本号会递增
可以对Znode中的数据进行读写操作
三、应用场景
1.数据发布/订阅
数据发布/订阅即所谓的配置中心:发布者将数据发布到zk的一个或者一系列节点上,订阅者进行数据订阅,当数据有变化时,可以及时得到数据的变化通知
2.负载均衡
本质是利用zookeeper的配置管理功能,涉及的步骤为:
1)服务提供者把自己的域名及IP端口的映射注册到zk中
2)服务消费者通过域名从zk中获取到对应的IP及端口,这个IP及端口有多个,只是获取其中一个
3)当服务提供者宕机时,对应的域名与IP的对应就会减少一个映射
4)阿里的dubbo服务框架就是基于zk来实现服务路由和负载
3.命名服务
在分布式系统中,命名服务(Name Service)也是很重要的应用场景,通过zk也可以实现类似于J2EE中的JNDI的效果;分布式环境 ,命名服务更多是资源定位,并不是真正的实体资源,其本质也是用到zk的集中配置管理和查找
4.分布式协调/通知
通过watcher和通知机制实
-分布式锁
-分布式事物
5.集群管理
-当前集群中的机器数量
-集群中机器的运行时状态
-集群中节点的上下线操作
-集群节点的统一配置
6.Master选举
-临时节点
-顺序节点
7.分布式锁
-排他锁
-共享锁
8.分布式队列
FIFO
四、zookeeper基本概念
1.集群角色
-Leader:为客户端提供读和写服务
-Follower:提供读服务,所有写服务都需要转交给Leader角色,参与选举
-Observer:提供读服务,不参与选举过程,一般是为了增强zk集群的读请求并发能力
2. 会话 session
-Zk的客户端与zk的服务端之间的连接
-通过心跳检测保持客户端连接的存活
-接收来自服务端的watch事件通知
-可以设置超时时间
3.数据节点(Znode)
不是机器的意思而是Zk树形结构中的数据节点,用于存储数据
-持久节点:一旦创建,除非主动调用删除操作,否则一直存储在zk上
-临时节点:与客户端的会话绑定,一旦客户端会话失效,这个客户端创建的所有临时节点都会被移除
-SEQUENTIAL Znode:创建节点时,如果设置属性SEQUENTIAL,则会自动在节点名后面追加一个整型数字
4.版本
-Version:当前Znode的版本
-Cversion:当前Znode的子节点的版本
-Aversion:当前Znode的ACL(访问控制)版本
5.Watcher
作用于Znode节点
多种事件通知:数据更新,子节点状态等
6. ACL
Access Control Lists 类似于linux/unix的权限控制 CREATE和DELETE是针对子节点的权限控制
-CREATE:创建子节点的权限
-READ:获取节点数据和子节点列表的权限
-WRITE:更新节点数据的权限
-DELETE:删除子节点的权限
-ADMIN:设置节点ACL的权限
五、zookeeper单机模式—安装部署
注意:单机模式不能用在生产环境上,因为无论从系统可靠性还是读写性能上都不能满足生产的需求
Zk是基于java语言开发,因此单机模式的资源需求跟普通的java程序差不多,1个he的CPU和1G内存就足够
1.环境准备
-Jdk1.6及以上
-机器配置: 2核/2G
2.安装
-zk下载地址: http://www.apache.org/dyn/closer.cgi/zookeeper/
-解压文件
Windows下采用winzip或者winwar都行
Linux下采用tar –zxvf zookeeper-3.4.6.tar.gz
-配置环境变量
ZOOKEEPER_HOME=/home/zookeeper-3.4.6
PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
3.zookeeper目录介绍
bin
-.sh linux环境
-.cmd windows环境
conf
-zoo_sample.cfg为样例配置文件,需要修改为自己的名称,一般为zoo.cfg
-Log4j.properties为日志配置文件
Contrib:一些用于操作zk的工具包
lib:zk依赖的某些包
Recipes:zk某些用法的代码示例
Dist-maven:maven编译后的发布目录
4.运行前配置
把conf下的zoo_sample.cfg修改为zoo.cfg
Zoo.cfg
-tickTime:默认3000ms,作为一种基本单元,可用它的倍数来表示系统内部的时间间隔配置,比如:
2*tickTime是客户端会话的超时时间
1*tickTime是客户端与zk服务器端的心跳时间
-dataDir:无默认配置,必需配置;用于配置存储快照文件的目录,如果没有配置dataLogDir,那么事物日志也会存储在此目录
-clientPort:zk的运行端口,默认是2181
5.启动
-Windows:直接双击zkServer.cmd
-Linux:sh zkServer.sh start
六、客户端命令行
-Linux:bin/zkCli.sh
-Windows:bin/zkCli.cmd
不带任何参数默认连接到localhost:2181
zkCli.cmd –server ip:port连接到指定的服务器地址
命令行输入help或其他人任何字符查看所有命令列表及语法
1.读取
ls path [watch]
-Path表示指定数据节点的节点路径
-列出指定节点下的所有子节点
-只能查看第一级的所有子节点
-刚安装时 ls / 下只有默认的zookeeper保留节点
-Watch表示监听path的子节点的变化
2.创建
create [-s] [-e] path data acl
-创建zookeeper节点
- -s或者-e表示创建的是顺序或临时节点,不加默认创建的是持久节点
-Path为节点的全路径,没有相对节点的表示方式
-Data为当前节点内存储的数据
-Acl用来进行权限控制,缺省情况下不做任何权限控制
3.读取
get path [watch]
-获取指定节点的数据内容和属性信息
-Path表示指定数据节点的节点路径
4.更新
set path data [version]
-更新指定节点的数据内容
-Path表示被更新的节点路径
-data为更新的数据
-Version为指定被更新的数据版本,一般不指定,如果数据版本已经更新,则指定旧版本时会报错
5.删除
delete path [version]
-删除指定节点
-Path表示被删除的节点
-Version为指定被删除的数据版本,一般不指定,如果数据版本已经更新,则指定旧版本时会报错
你投入得越多,就能得到越多得价值