大数据篇---ZooKeeper+ HBase学习

原创
2020/11/23 12:22
阅读数 59

1. Zookeeper简介

1.1 Zookeeper是什么?

Zookeeper 是一个分布式协调服务的开源框架。 主要用来解决分布式集群中应用系统的一致性问题,
例如怎样避免同时操作同一数据造成脏读的问题。分布式系统中数据存在一致性的问题!!
* ZooKeeper 本质上是一个分布式的小文件存储系统。 提供基于类似于文件系统的目录树方式的数
据存储,并且可以对树中的节点进行有效管理。
* ZooKeeper 提供给客户端监控存储在zk内部数据的功能,从而可以达到基于数据的集群管理。 诸
如: 统一命名服务(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息队列
(sub/pub)、分布式锁、分布式协调等功能。

1.2 zookeeper的架构组成

Leader

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

Follower

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

Observer

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

ZK也是Master/slave架构,但是与之前不同的是zk集群中的Leader不是指定而来,而是通过选举产 生。

1.3 Zookeeper 特点

1. Zookeeper:一个领导者(leader:老大),多个跟随者(follower:小弟)组成的集群。
2. Leader负责进行投票的发起和决议,更新系统状态(内部原理) 
3. Follower用于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票
4. 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。
5. 全局数据一致:每个server保存一份相同的数据副本,Client无论连接到哪个server,数据都是一
致的。
6. 更新请求顺序进行(内部原理) 
7. 数据更新原子性,一次数据更新要么成功,要么失败。

2. Zookeeper环境搭建

2.1 Zookeeper的搭建方式

Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。
■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境;
■ 伪集群模式:就是在一台服务器上运行多个Zookeeper 实例;
■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”

2.2 Zookeeper集群搭建

下载

上传

下载完成后,将zookeeper压缩包 zookeeper-3.4.14.tar.gz上传到linux系统/opt/lagou/software

解压 压缩包

tar -zxvf zookeeper-3.4.14.tar.gz -C ../servers/

修改配置文件创建data与log目录

#创建zk存储数据目录 
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data
#创建zk日志文件目录
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data/logs
#修改zk配置文件 cd /opt/lagou/servers/zookeeper-3.4.14/conf 
#文件改名 mv zoo_sample.cfg zoo.cfg vim zoo.cfg 
#更新datadir dataDir=/opt/lagou/servers/zookeeper-3.4.14/data 
#增加logdir dataLogDir=/opt/lagou/servers/zookeeper-3.4.14/data/logs 
#增加集群配置
##server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口 
server.1=linux121:2888:3888
server.2=linux122:2888:3888 
server.3=linux123:2888:3888 
#打开注释
#ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时 
autopurge.purgeInterval=1

添加myid配置

  1. 在zookeeper的 data 目录下创建一个 myid 文件,内容为1,这个文件就是记录每个服务器的ID
cd /opt/lagou/servers/zookeeper-3.4.14/data 
echo 1 > myid

安装包分发并修改myid的值

rsync-script /opt/lagou/servers/zookeeper-3.4.14

修改myid值 linux122

echo 2 >/opt/lagou/servers/zookeeper-3.4.14/data/myid

修改myid值 linux123

echo 3 >/opt/lagou/servers/zookeeper-3.4.14/data/myid

依次启动三个zk实例

  • 启动命令(三个节点都要执行)
/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh start
  • 查看zk启动情况
/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status

  • 集群启动停止脚本
vim zk.sh 

#!/bin/sh
echo "start zookeeper server..." 
if(($#==0));then 
echo "no params";
exit; 
fi
hosts="linux121 linux122 linux123" 
for host in $hosts 
do
ssh $host "source /etc/profile; /opt/lagou/servers/zookeeper- 3.4.14/bin/zkServer.sh $1" 
done

3. Zookeeper数据结构与监听机制

  • ZooKeeper数据模型Znode
在ZooKeeper中,数据信息被保存在一个个数据节点上,这些节点被称为znode。ZNode 是
Zookeeper 中最小数据单位,在 ZNode 下面又可以再挂 ZNode,这样一层层下去就形成了一个层次化
命名空间 ZNode 树,我们称为 ZNode Tree,它采用了类似文件系统的层级树状结构进行管理。见下图
示例:

在 Zookeeper 中,每一个数据节点都是一个 ZNode,上图根目录下有两个节点,分别是:app1 和
app2,其中 app1 下面又有三个子节点,所有ZNode按层次化进行组织,形成这么一颗树,ZNode的节
点路径标识方式和Unix文件系统路径非常相似,都是由一系列使用斜杠(/)进行分割的路径表示,开
发人员可以向这个节点写入数据,也可以在这个节点下面创建子节点。

3.1 ZNode 的类型

刚刚已经了解到,Zookeeper的znode tree是由一系列数据节点组成的,那接下来,我们就对数据节点
做详细讲解
Zookeeper 节点类型可以分为三大类:
持久性节点(Persistent)
临时性节点(Ephemeral)
顺序性节点(Sequential)
在开发中在创建节点的时候通过组合可以生成以下四种节点类型:持久节点、持久顺序节点、临时节
点、临时顺序节点。不同类型的节点则会有不同的生命周期
* 持久节点:是Zookeeper中最常见的一种节点类型,所谓持久节点,就是指节点被创建后会一直存在服务器,直到删除操作主动清除
* 持久顺序节点:就是有顺序的持久节点,节点特性和持久节点是一样的,只是额外特性表现在顺序上。
顺序特性实质是在创建节点的时候,会在节点名后面加上一个数字后缀,来表示其顺序。
* 临时节点:就是会被自动清理掉的节点,它的生命周期和客户端会话绑在一起,客户端会话结束,节点
会被删除掉。与持久性节点不同的是,临时节点不能创建子节点。
* 临时顺序节点:就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后面加上数字后缀。

* 事务ID

首先,先了解,事务是对物理和抽象的应用状态上的操作集合。往往在现在的概念中,狭义上的事务通
常指的是数据库事务,一般包含了一系列对数据库有序的读写操作,这些数据库事务具有所谓的ACID特
性,即原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

而在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新
操作,一般包括数据节点创建与删除、数据节点内容更新等操作。对于每一个事务请求,ZooKeeper都
会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个 64 位的数字。每一个 ZXID 对应一次
更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序
zk中的事务指的是对zk服务器状态改变的操作(create,update data,更新字节点);zk对这些事务操作都
会编号,这个编号是自增长的被称为ZXID。

3.2 ZNode 的状态信息

[zk: localhost:2181(CONNECTED) 2] get /zookeeper 
cZxid = 0x0 
ctime = Wed Dec 31 19:00:00 EST 1969 
mZxid = 0x0 
mtime = Wed Dec 31 19:00:00 EST 1969 
pZxid = 0x0 
cversion = -1
dataVersion = 0 
aclVersion = 0 
ephemeralOwner = 0x0
dataLength = 0 
numChildren = 1

整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。数据内容是空,其他的属于状态信 息。那么这些状态信息都有什么含义呢?

cZxid 就是 Create ZXID,表示节点被创建时的事务ID。
ctime 就是 Create Time,表示节点创建时间。 
mZxid 就是 Modified ZXID,表示节点最后一次被修改时的事务ID。 
mtime 就是 Modified Time,表示节点最后一次被修改的时间。 
pZxid 表示该节点的子节点列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,子 节点内容变更不会更新。 
cversion 表示子节点的版本号。 
dataVersion 表示内容版本号。 
aclVersion 标识acl版本
ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0 
dataLength 表示数据长度。
numChildren 表示直系子节点数。

3.3 Watcher 机制

Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能

一个典型的发布/订阅模型系统定义了一种 一对多的订阅关系,能够让多个订阅者同时监听某一个主题 对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。

在 ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服 务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么Zk就会向指定客户 端发送一个事件通知来实现分布式的通知功能。

整个Watcher注册与通知过程如图所示。 Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。

具体工作流程为:

  • 客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当 中
  • 当Zookeeper服务器触发Watcher事件后,会向客户端发送通知
  • 客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑

4. Zookeeper的基本使用

4.1 ZooKeeper命令行操作

现在已经搭建起了一个能够正常运行的zookeeper服务了,所以接下来,就是来借助客户端来对 zookeeper的数据节点进行操作

首先,进入到zookeeper的bin目录之后

通过zkClient进入zookeeper客户端命令行

./zkcli.sh 连接本地的zookeeper服务器
./zkCli.sh -server ip:port(2181) 连接指定的服务器

连接成功之后,系统会输出Zookeeper的相关环境及配置信息等信息。输入help之后,屏幕会输出可用 的Zookeeper命令,如下图所示

[zk: localhost:2181(CONNECTED) 3] help 
ZooKeeper -server host:port cmd args
	stat path [watch] 
	set path data [version] 
	ls path [watch] 
	delquota [-n|-b] path 
	ls2 path [watch] 
	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 
	addauth scheme auth 
	quit 
	getAcl path 
	close 
	connect host:port

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部