大数据笔记10:ZooKeeper入门

第10天——ZooKeeper入门


一、ZooKeeper概述
二、Zookeeper单机模式安装
三、Zookeeper数据结构与指令


一、ZooKeeper概述
官网: http://zookeeper.apache.org/
大数据笔记10:ZooKeeper入门_第1张图片
What is ZooKeeper?

ZooKeeper is a centralized service for maintaining configuration information , naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

ZooKeeper 是一种集中服务,用于维护配置信息、命名、提供分布式同步、以及提供群组服务。分布式应用程序以某种形式来使用这些服务。……

1、ZooKeeper 介绍
ZooKeeper 是分布式应用程序的协调服务框架,是Hadoop的重要组件。
它要解决的问题:
(1)分布式环境下的 数据一致性
(2)分布式环境下的 统一命名服务
/zk01/node1/
(3)分布式环境下的 配置管理
配置文件。通过结点来实现,在结点上注册监听。
(4)分布式环境下的 分布式锁
单台机器使用的锁:同步代码块、重入锁。但是在分布式环境这个锁就发挥不出来作用。分布锁分为共享锁和排它锁。普通顺序结点、临时顺序结点。
(5)集群管理问题

2、分布式概念(集群-cluster)
分布式的思想就是人多干活快,即 用多台机器同时处理一个任务 。分布 式的编程和单机的编程思想是不同的,随之也带来新的问题和挑战。

3、分布式编程容易出现的问题
(1)死锁
死锁(Deadlock),是操作系统或软件运行的一种状态:在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程本身或其它进程占用时,就形成了死锁。有个变种叫活锁。
(2)活锁
活锁定义:在程序里,由于某些条件的发生碰撞,导致重新执行,再碰撞=》再执行,如此循环往复,就形成了活锁。活锁的危害:多个线程争用一个资源,但是没有任何一个线程能拿到这个资源。(死锁是有一个线程拿到资源,但相互等待互不释放造成死锁),活锁是死锁的变种。补充:活动更深层次的危害,很耗尽CPU 资源(在做无意义的调度)。

扩展:ZooKeeper 是根据Google 的一篇论文 The Chubby lock service for loosely-coupled distributed systems 《用于松耦合分布式系统的锁服务》

(3)需要考虑集群的管理问题,需要有一套机制来检测到集群里节点的状态变化。(可以用心跳机制来做,但zookeepr不是用心跳机制来做的)

(4)如果用一台机器做集群管理,存在 单点故障 问题,所以针对集群管理, 也需要形成一个集群。

(5)管理集群里Leader 的 选举问题 (要根据一定的算法和规则来选举), 包括要考虑Leader 挂掉之后,如何从剩余的follower 里选出Leader。

采用Fast Paxos算法(过半选举)。

(6)分布式锁的实现,用之前学的重入锁,同步代码块是做不了的。
大数据笔记10:ZooKeeper入门_第2张图片
二、Zookeeper单机模式安装
1、由EmptyOS克隆一个虚拟机zookeeper
大数据笔记10:ZooKeeper入门_第3张图片 大数据笔记10:ZooKeeper入门_第4张图片 大数据笔记10:ZooKeeper入门_第5张图片 大数据笔记10:ZooKeeper入门_第6张图片
单击完成按钮,这样就由EmptyOS克隆出虚拟机zookeeper。
大数据笔记10:ZooKeeper入门_第7张图片
2、配置网络连接
(1)在终端查看 # cat /etc/udev/rules.d/70-persistent-net.rules
大数据笔记10:ZooKeeper入门_第8张图片
(2)修改一下文件70-persistent-net.rules
(删除name='eth0'和name='eth1'两行,然后将name='eth2'那一行的name值修改为eth0)
大数据笔记10:ZooKeeper入门_第9张图片
(3)打开Network Connections
大数据笔记10:ZooKeeper入门_第10张图片 大数据笔记10:ZooKeeper入门_第11张图片
(4)采用手动方式设置IP地址、子网掩码、网关以及DNS
大数据笔记10:ZooKeeper入门_第12张图片
(5)修改主机名
执行:vim /etc/sysconfig/network

NETWORKING=yes
HOSTNAME= zookeeper

存盘退出。

(6)域名映射
执行:vim /etc/hosts
大数据笔记10:ZooKeeper入门_第13张图片
(7)利用SecureCRT登录虚拟机zookeeper
大数据笔记10:ZooKeeper入门_第14张图片
(8)设置会话选项
大数据笔记10:ZooKeeper入门_第15张图片 大数据笔记10:ZooKeeper入门_第16张图片 大数据笔记10:ZooKeeper入门_第17张图片
(9)修改连接名
大数据笔记10:ZooKeeper入门_第18张图片 大数据笔记10:ZooKeeper入门_第19张图片 大数据笔记10:ZooKeeper入门_第20张图片



为了方便主机与虚拟机之间传递文件。利用rpm安装lrzsz。
大数据笔记10:ZooKeeper入门_第21张图片
大数据笔记10:ZooKeeper入门_第22张图片
表明,该虚拟机已经安装好lrzsz工具软件。


3、创建工作目录
执行:[root@zookeeper ~]# mkdir /home/software
进入该目录:[root@zookeeper ~]# cd /home/software

4、上传、安装和配置JDK
(1)上传JDK
大数据笔记10:ZooKeeper入门_第23张图片 大数据笔记10:ZooKeeper入门_第24张图片
(2)安装JDK
大数据笔记10:ZooKeeper入门_第25张图片
JDK安装到哪里了?
大数据笔记10:ZooKeeper入门_第26张图片

(3)配置环境变量
执行:vim /etc/profile
添加以下内容:
JAVA_HOME=/usr/java/jdk1.8.0_111
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH CLASSPATH

执行:source /etc/profile,让配置文件生效。
5、从官网下载zookeeper
http://www.apache.org/dyn/closer.cgi/zookeeper/
大数据笔记10:ZooKeeper入门_第27张图片 大数据笔记10:ZooKeeper入门_第28张图片 大数据笔记10:ZooKeeper入门_第29张图片
下载到指定位置:
大数据笔记10:ZooKeeper入门_第30张图片
6、上传到虚拟机并安装zookeeper
(1)上传zookeeper到虚拟机
大数据笔记10:ZooKeeper入门_第31张图片
(2)解压缩
执行:[root@zookeeper software]# tar -zxvf zookeeper-3.4.10.tar.gz
解压缩之后,查看zookeeper-3.4.10目录下的东西:
大数据笔记10:ZooKeeper入门_第32张图片

(3)创建zookeeper临时目录
进入zookeeper-3.4.10目录,执行:mkdir tmp,创建临时目录。

7、配置zookeeper
进入zookeeper-3.4.10/conf目录,拷贝zoo_sample.cfg到zoo.cfg:
[root@zookeeper zookeeper-3.4.10]# cd conf
[root@zookeeper conf]# cp zoo_sample.cfg zoo.cfg

修改配置文件zoo.cfg:
大数据笔记10:ZooKeeper入门_第33张图片
注意:clientPort=2181

8、为zookeeper配置环境变量
执行:vim /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_111
ZK_HOME=/home/software/zookeeper-3.4.10
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$ZK_HOME/bin:$PATH
export JAVA_HOME PATH CLASSPATH ZK_HOME

大数据笔记10:ZooKeeper入门_第34张图片

别忘了,执行:source /etc/profile,让配置生效。

9、启动zookeeper服务
在zookeeper安装目录的bin目录下有启动zk服务和客户端的执行程序:
大数据笔记10:ZooKeeper入门_第35张图片

由于配置了环境变量,可以在任何目录下启动zkServer.sh。


启动之后,可以用jps(jvm process status)查看进程状况:

zookeeper进程名为QuorumPeerMain。


利用zkServer.sh status来查看zk服务状态:


目前运行模式为standalone,即单机模式。

10、启动zookeeper客户端
执行:[root@zookeeper ~]# zkCli.sh
大数据笔记10:ZooKeeper入门_第36张图片 大数据笔记10:ZooKeeper入门_第37张图片

利用zookeeper指令操作节点:

大数据笔记10:ZooKeeper入门_第38张图片

create /zk01 lzy 创建节点
get /zk01 查看节点信息
set /zk01 ied 修改节点内容
delete /zk01 删除节点

11、退出zk客户端

大数据笔记10:ZooKeeper入门_第39张图片

12、停止zk服务
执行:zkServer.sh stop


小结zk服务三个命令:
zkServer.sh start 启动zk服务
zkServer.sh status 查看zk服务状态(模式)
zkServer.sh stop 停止zk服务

三、ZooKeeper数据结构与指令
(一)ZooKeeper数据结构

大数据笔记10:ZooKeeper入门_第40张图片

1. ZooKeeper有一个最开始的节点(根节点:/)
2. ZooKeeper的节点叫做znode节点
3. 每个znode节点都可存储数据
4. 每个znode节点都可创建自己的子节点
5. 多个znode节点共同形成了znode树
6. znode树的维系是在内存中,目的是供用户快速的查询
7. 每个znode节点都是一个路径(通过路径来定位这个节点)
8. 每个路径名都是唯一的。

(二)ZooKeeper指令
指令
示例
ls 查看指令
ls /
create 创建节点指令,注意,在创建节点时,要分配初始数据。
create /zk01
 hello1701
create /zk02 ‘’
get 查看节点数据指令
hello1701  数据
cZxid = 0x2
ctime = Mon May 15 05:58:32 PDT 2017创建节点的时间戳
mZxid = 0x2
mtime = Mon May 15 05:58:32 PDT 2017修改此节点数据的最新时间戳
pZxid = 0x2
cversion = 0
dataVersion = 0数据版本号,每当数据发生编号,版本号递增1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9数据大小
numChildren = 0子节点个数
get /zk01
set更新节点数据指令(执行后mtime、dataVersion可定会放生变化,dataLength可能会变化)
set /zk01 hellozk
delete删除节点
delete /zk02
create指令补充:
1. 创建子节点
2. Zk节点分四种类型:分别是:
普通持久节点 :
普通临时节点 :创建此临时节点的客户端失去和zk连接后,此节点消失。zk是通过临时节点监控哪个服务器挂掉的。
 
顺序持久节点 :会根据用户指定的节点路径,自动分配一个递增的顺序号。(顺序节点实现分布式锁的效果,服务器1抢到zk05分配zk050001,服务器2抢到zk05分配zk050002)
顺序临时节点:
1. create /zk01/node01 hello
2. 
2.1.create /zk01 hello
2.2. create –e /zk02 abc
2.3.create –s /zk03 abc
2.4.create –s -e /zk05 abcd
zk050000000003
再创建一个就是:
zk050000000004
quit 退出zk客户端
 

大数据笔记10:ZooKeeper入门_第41张图片

1、创建结点
create [选项] 结点路径 [数据]

-s: sequential 顺序的
-e: empheral 临时的

create /zk01 'aaa' #普通持久结点
create -s /zk02 bbb #顺序持久结点
create -e /zk03 ccc #普通临时结点
create -e -s /zk04 ddd #顺序临时结点

大数据笔记10:ZooKeeper入门_第42张图片

由于/zk03和/zk040000000008是临时节点,退出客户端之后再次进入客户端,你会发现它们都被自动删除掉了。

利用临时节点这个特性,可以利用zk来监听连接zk服务器的节点是否挂掉了。

2、设置结点数据
将zk01节点数据设置为“howard”,执行 set /zk01 howard

大数据笔记10:ZooKeeper入门_第43张图片

每次修改操作执行之后,事务id(mZxid)会递增,同时dataVersion也会递增,看看,dataLength也变了,是howard的长度。最开始,是aaa的长度:3。

3、访问节点内容
访问节点/zk01的内容,执行 get /zk01

大数据笔记10:ZooKeeper入门_第44张图片

4、删除节点(不能删除非空节点)
为了说明方便起见,在/zk01里创建子结点/luzhou。
现在我们来删除节点/zk01,看看是否可行。
执行:delete /zk01

提示,节点/zk01非空,不能删除。
怎么办?先删除/zk01/luzhou,再删除/zk01:

看,/zk01节点被删除了。

你可能感兴趣的:(大数据基础)