ZooKeeper教程
ZooKeeper教程
1、简介
ZooKeeper (注册中心) 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
三个分布式框架:Spark 、 Yarn 、storm(最快的)
我学习的第一个框架就是zookeeper,所有由它作为基础,学习别的框架易如反掌。
但前提是,这种思想你学会了,大数据的一系列的框架就很简单了。
推荐大家一本书:Java高可用实践。
2. Zookeeper的原理
在 ZooKeeper 中,有三种角色:Leader Follower Observer
ZooKeeper 默认只有 Leader 和 Follower 两种角色,没有 Observer 角色。
一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。
ZooKeeper 配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值}的{数值}部分。
zoo.cfg 文件内容示例:
#心跳的时间间隔
tickTime=2000
#初始化同步数据花费的时间 10个tickTime
initLimit=10
# leader和follwer之间互相发送心跳 检测对方 失效的时间间隔 5*tickTime
syncLimit=5
# 数据文件的存储目录
dataDir=D:\etop1610\zookeeper\zookeeper-3.4.10\zookeeper-3.4.10\data
# 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.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
2.2 会话(Session)
Session 是指客户端会话,在讲解客户端会话之前,我们先来了解下客户端连接。在 ZooKeeper 中,一个客户端连接是指客户端和 ZooKeeper 服务器之间的TCP长连接。
ZooKeeper 对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的 Watch 事件通知。
Session 的 SessionTimeout 值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 SessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
2.3 数据节点(ZNode)
在谈到分布式的时候,一般『节点』指的是组成集群的每一台机器。而ZooKeeper 中的数据节点是指数据模型中的数据单元,称为 ZNode。ZooKeeper 将所有数据存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径,就是一个ZNode,如 /hbase/master,其中 hbase 和 master 都是 ZNode。每个 ZNode 上都会保存自己的数据内容,同时会保存一系列属性信息。
在 ZooKeeper 中,ZNode 可以分为持久节点、临时节点、顺序节点。
持久节点
所谓持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,否则这个 ZNode 将一直保存在 ZooKeeper 上。
临时节点
临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
顺序节点
另外它可以这样理解,ZooKeeper 还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL。一旦节点被标记上这个属性,那么在这个节点被创建的时候,ZooKeeper 就会自动在其节点后面追加上一个整型数字,这个整型数字是一个由父节点维护的自增数字
zookeeper服务结构图
zookeeper中 有一个leader 该主机是用于写 写入的更新会自动同步到其他的 follower服务器中 如果leader挂掉后 会重新选举一个leader 所以如果是集群环境 最少
要求有三台以上机器 如果leader挂掉 只剩一台机器 选举引发性能问题
创建临时节点、顺序节点 dos命令
顺序节点一个可以创建多个节点。Ls0000000001节点的名字是唯一的!
常用的命令: create 、 get 、set。
参考资料:《从Paxos到ZooKeeper》
【详细可以参考——网址:http://www.sohu.com/a/137884523_262549】
3. ZooKeeper典型应用场景
ZooKeeper 是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架能够很好地保证分布式环境中数据的一致性。也是基于这样的特性,使得 ZooKeeper 成为了解决分布式一致性问题的利器。
3.1 数据发布与订阅(配置中心)
数据发布与订阅,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和动态更新。
3.3 分布式协调/通知
ZooKeeper 中特有 Watcher 注册与异步通知机制,能够很好的实现分布式环境下不同机器,甚至不同系统之间的通知与协调,从而实现对数据变更的实时处理。使用方法通常是不同的客户端都对ZK上同一个 ZNode 进行注册,监听 ZNode 的变化(包括ZNode本身内容及子节点的),如果 ZNode 发生了变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应的处理。
ZK的分布式协调/通知,是一种通用的分布式系统机器间的通信方式。
3.3.1 心跳检测
机器间的心跳检测机制是指在分布式环境中,不同机器(或进程)之间需要检测到彼此是否在正常运行,例如A机器需要知道B机器是否正常运行。在传统的开发中,我们通常是通过主机直接是否可以相互PING通来判断,更复杂一点的话,则会通过在机器之间建立长连接,通过TCP连接固有的心跳检测机制来实现上层机器的心跳检测,这些都是非常常见的心跳检测方法。
3.4 Master选举
Master 选举可以说是 ZooKeeper 最典型的应用场景了。比如 HDFS 中 Active NameNode 的选举、YARN 中 Active ResourceManager 的选举和 HBase 中 Active HMaster 的选举等。
针对 Master 选举的需求,通常情况下,我们可以选择常见的关系型数据库中的主键特性来实现:希望成为 Master 的机器都向数据库中插入一条相同主键ID的记录,数据库会帮我们进行主键冲突检查,也就是说,只有一台机器能插入成功——那么,我们就认为向数据库中成功插入数据的客户端机器成为Master。
依靠关系型数据库的主键特性确实能够很好地保证在集群中选举出唯一的一个Master。
但是,如果当前选举出的 Master 挂了,那么该如何处理?谁来告诉我 Master 挂了呢?显然,关系型数据库无法通知我们这个事件。但是,ZooKeeper 可以做到!
利用 ZooKeepr 的强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够保证全局唯一性,即 ZooKeeper 将会保证客户端无法创建一个已经存在的 ZNode。
也就是说,如果同时有多个客户端请求创建同一个临时节点,那么最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很容易地在分布式环境中进行 Master 选举了。
成功创建该节点的客户端所在的机器就成为了 Master。同时,其他没有成功创建该节点的客户端,都会在该节点上注册一个子节点变更的 Watcher,用于监控当前 Master 机器是否存活,一旦发现当前的Master挂了,那么其他客户端将会重新进行 Master 选举。
这样就实现了 Master 的动态选举。
二 .zookeeper安装
常用的数据操作命令(树结构节点数据的操作)
ls / 显示根节点下所有的节点
[zk: localhost(CONNECTED) 1] ls /
[zookeeper]
create 在/ 下 新增一个sex节点 节点的值是 boy
[zk: localhost(CONNECTED) 2] create /sex boy
Created /sex
[zk: localhost(CONNECTED) 3] ls /
[sex, zookeeper]
1. *
2. * 通过create命令 判断是哪一种节点类型 //没有 -e -s表示持久节点 // -e 表示临时节点 // -s 表示持久顺序节点 // -e
3. * -s 表示临时顺序节点
4. *
其他
help 查看所有命令的帮助
close/quit 退出登录
connect ip:port 重新登录
histroy 查看操作历史记录 每个历史记录都有一个编号
redo 编号 重新执行history中编号对应的语句
close 关闭客户端连接
stat /sex 查看znode的/sex的状态信息
ls2 /sex 查看/sex所有的子节点 同时查看状态信息
rmr /sex 删除/sex以及他的所有子节点
setquota -n 1 /test 给/test节点设置允许的子节点个数是1个 添加子节点操作1个 给予警告 可以添加
-b 10 /test 给/test的值的长度限制为 10个字节
listquota /test 列出/test所有的配额
delquota -n /test 删除子节点设置的额配合
三 zokeeper的客户端
创建maven项目,首先引入一个maven(关于zookeeper)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>ZOOKEEPER_CLIENT</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
</project>
其次,自己用java代码实现一个dos版本客户端。。
4 web客户端的使用
可以使用web客户客户端exhibitor 下载地址(https://github.com/soabase/exhibitor)
可以使用jar包和war包的方式发布 安装过程参考 https://github.com/soabase/exhibitor/wiki/Building-Exhibitor
配置向导可以参考 https://github.com/soabase/exhibitor/wiki/Configuration-UI
eclipse插件更新地址:http://www.massedynamic.org/eclipse/updates/
zookeeper分布式应用:http://blog.csdn.net/liaomin416100569/article/details/71642091
下一篇: SDRAM使用总结