zookeeper的相关知识
-
zookeeper的linux下的安装
-
修改配置文件 zoo_sample.cfg 这是一个参考的模板 先复制或移动 cp zoo_sample.cfg zoo.cfg
# The number of milliseconds of each tick tickTime=2000 每次心跳的时间间隔 每隔2秒 # The number of ticks that the initial # synchronization phase can take initLimit=10 初始化过程中的心跳个数 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 请求和响应之间的心跳次数 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/hadoop/zookeeper 快照存储目录 # the port at which the clients will connect clientPort=2181 客户端通信端口 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. #
-
添加集群信息
- server.1=hadoop:2888:3888
- server固定写法
- 1每台节点的id可以随意写但是不能有重复这个id 存储在你的快照目录中
- hadoop通信的主机名
- 2888:3888 zookeeper的内部通信端口
-
添加每个节点的id 配置快照的目录下 dataDir=/usr/hadoop/zookeeper 创建一个文件 叫myid myid这个文件不能有空格或空行
-
配置环境变量
vim /etc/profile 打开配置文件 export ZOOKEEPER_HOME=/usr/hadoop/zookeeper/zookeeper-3.4.14 配置环境变量 export PATH=$PATH:$ZOOKEEPER_HOME/bin source /etc/profile 配置完成之后执行该命令
-
如果是hadoop的集群需要把每个节点都重复上述的步骤
-
启动zookeeper zkServer.sh start 如果是集群则每个节点都需要启动
-
启动完成之后 jps 显示 QuorumPeerMain这个进程 然后检查 zkServer.sh status 显示 Mode: standalone启动成功 集群则显示 Mode: follower Mode: leader
-
zookeeper是主从架构 主是选举出来的所以zookeeper的个数是奇数个
-
zookeeper关闭命令 zkServer.sh stop
-
-
zookeeper的投票信息
- 顺序启动时全新的zookeeper的投票是id低的主动投给id高的 当票数过半是选出leader
- 同时启动时 过半以下的id是不可能成为leader
-
zookeeper安装的节点
- server.serverid=host.2888:3888
- serverid的范围为1~255之间也就说最多可有255个节点
- 2888:是通信端口 3888:端口是选主端口
- 节点安装的越多数据同步越困难,7-15是比较优的选择。
-
zookeeper的产生:
-分布式的产生 分布式的节点越多越难数据统一
-zookeeper的产生就是为了解决数据一致性 -
CAP理论:2000年产生的 一个分布式系统不可能同时满足三个需求
- Consistency 一致性 多个副本数据的一致性 强一致性:实时保持一致性 弱一致性:具有延迟大部分保持一致 最终一致性:接受一定时间的延迟 在一定的时间内达到一致性就可以。hdfs文件上传属于最终一致性
- Availability 可用性:系统提供的服务必须一直处于可用,对于用户的请求总能返回结果,高可用。
- Partition tolerance分区容错性:对外提供一致性数据。
- CAP理论是相互制约的没有一个理论是可以满足这个理论
-
BASE理论指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。 这个理论可以实现
-
paxos算法 过半选举 不是所有人都参与投票也不是同时投票。zookeeper是这个算法的最完美的实现 zookeeper是不可替代的。
-
zookeeper的shell
-
zookeeper的客户端 zkCli.sh 进入客户端的脚本 help查看所有zookeeper的命令
stat path [watch] 查看当前的znode的信息 set path data [version] 修改znode的存储数据 ls path [watch] 查看指定路径下的内容 目录结构类似于linux delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history 查看历史执行命令 只显示近10条 redo cmdno printwatches on|off delete path [version] 删除节点但是不能删除有子节点的 sync path listquota path rmr path 删除节点可以删除有子节点的节点 get path [watch] 获取znode的节点信息 1921 cZxid = 0xc 创建的id 记录全局的事件提交顺序 由集群维护整个集群全局唯一 ctime = Fri Jun 21 15:16:14 CST 2019 创建时间 mZxid = 0xc 修改的id 记录的是修改时间的顺序 mtime = Fri Jun 21 15:16:14 CST 2019 修改时间 pZxid = 0xc 父id 分为高18位 整个集群leader的信息这个信息不变则整个集群的leader 和低18位 表示时间的提交标号 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 临时节点的拥有者 如果 是永久节点则是0x0 临时节点是zookeeper的sessionid dataLength = 4 存储的数据长度 numChildren = 0 字节的个数 注意:cZxid 和 mZxid创建的时候两个id相等当修改的时候 mZxid 会增加 create [-s] [-e] path data acl 创建节点 addauth scheme auth quit getAcl path close connect host:port 连接到某个节点
-
-
zookeeper的架构
-
文件系统
- zookeeper文件系统类似于linux 根节点是/
- zookeeper的寻址只能通过绝对路径不能通过相对路径
- linux 文件下有可能有文件或目录 但是zookeeper的不存在文件也不存在目录但是既有文件的功能也有目录的功能叫做znode、
- znode分类 按生命周期分
- 持久的znode
- 创建持久的node create 绝对路径 “”; 这个节点就是持久节点只有用户手动删除才会删除
- 临时的znode 创建临时节点 create -e /tt “” 临时节点 当前会话结束自动删除
-按编号分 - 持久无编号节点 create path data
- 持久的有编号的节点 create -s path data ==== create -s /test01 “”
- 临时无编号的节点 create -e /test02 “”
- 临时的有编号的节点 create -e -s /test03 “”
- 这里的编号是有父节点维护的同一个父节点维护的编号会顺序增加,不管这个节点是否有编号都会顺序增加编号是从零开始的
- 有编号和无编号的区别:有编号的可以反复创建同名节点,无编号节点只能创建一次
- 临时节点不能有子节点
- 有子节点的节点一定是持久节点
- 有几个zookeeper节点数据就保持几份,但是这几份数据是完全一样的。
- znode数据存储有上限,擅长存储小数据,每个znode存储的数据最多不要超过1M 最好不要超过1KB
- znode存储的数据量越大一致性越难维护。
- znode理论上只存储核心数据就行
- 通常情况下存储的仅仅只是状态信息
- znode上可以添加监听,监听添加的地方是添加到znode上。 监听—检测状态
- znode分类 按生命周期分
-
文件监听机制
- 分布式一致性监听就是对数据进行监控,zookeeper的监听对象就是znode所以会对znode的数据变化添加监听。通过监听机制监听文件系统的数据变化,包括数据内容的改变和文件结构的改变等等。
- 监听事件:nodedatachanged 节点数据内容的改变
- nodecreate:节点创建事件
- nodedelete:节点删除事件
- nodechilderchanaged:子节点变化事件
- 注册监听:如果用户对某个数据变化感兴趣就需要添加监听。可以添加监听的 监听注册一次只生效一次
- ls 显示子节点 子节点发生变化 触发 NodeChildrenChanged 事件
- get 监听节点数据内容的 数据内容发生变化触发监听 NodeDataChanged
- API 中exists
-
-
ecplise的zookeeper的页面的可视化配置
-
打开ecplise help**>>>install>>>**add 输出网址 http://www.massedynamic.org/eclipse/updates/
-
选择 zookeeper **>>>next >>> 全选>>>**下载
-
完成之后重启ecplise
-
重启之后window>>>show view>>>找到zookeeper
-
分别填写 一下 参数 1.name自定义的名字2.你所要连接的目录为根目录 / 3.填写超时时间 默认为5秒
-
填写完成之后测试创建一个java项目
//获取zookeeper的对象 /** * connectString 连接字符串 主机名加端口 * sessionTimeout 超时是时间 * watcher 监听 如果不需要监听写null */ ZooKeeper zk=new ZooKeeper("hadoop:2181", 5000, null); //只要获取到就说明连接上了 System.out.println(zk);
-
-
zookeeper的API
/** * path, 节点路径 * data, 字节内容 * acl, 权限 * createMode 创建的节点类型 * 返回创建成功的节点路径 */ zk.create("/bd02", "bd1921".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //参数2 version 如果不知道则写-1 path 表示路径 删除节点 zk.delete("/bd02", -1); // path 路径, data 字节数组, version 版本 返回值是当前节点的详细信息 Stat setData = zk.setData("/bd02","hahahha".getBytes(),-1); System.out.println(setData); // path 路径, watch 监听, stat 节点的详细信息 获取节点内容 byte[] tmp = zk.getData("/bd02", null, null); System.out.println(Arrays.toString(tmp)); //获取子节点 List<String> childer = zk.getChildren("/bd02", null); System.out.println(childer.toString()); //判断节点是否存在 如果存在着返回节点的详细信息 如果不存在则返回null Stat exists = zk.exists("/tre", null); System.out.println(exists);