第10天——ZooKeeper入门
一、ZooKeeper概述
二、Zookeeper单机模式安装
三、Zookeeper数据结构与指令
一、ZooKeeper概述
官网:
http://zookeeper.apache.org/
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)分布式锁的实现,用之前学的重入锁,同步代码块是做不了的。
单击完成按钮,这样就由EmptyOS克隆出虚拟机zookeeper。
2、配置网络连接
(1)在终端查看
:
#
cat /etc/udev/rules.d/70-persistent-net.rules
(2)修改一下文件70-persistent-net.rules
(删除name='eth0'和name='eth1'两行,然后将name='eth2'那一行的name值修改为eth0)
(3)打开Network Connections
(4)采用手动方式设置IP地址、子网掩码、网关以及DNS
(5)修改主机名
执行:vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=
zookeeper
存盘退出。
(6)域名映射
执行:vim /etc/hosts
(7)利用SecureCRT登录虚拟机zookeeper
为了方便主机与虚拟机之间传递文件。利用rpm安装lrzsz。
表明,该虚拟机已经安装好lrzsz工具软件。
3、创建工作目录
执行:[root@zookeeper ~]# mkdir /home/software
进入该目录:[root@zookeeper ~]# cd /home/software
4、上传、安装和配置JDK
(1)上传JDK
(2)安装JDK
JDK安装到哪里了?
(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/
下载到指定位置:
6、上传到虚拟机并安装zookeeper
(1)上传zookeeper到虚拟机
(2)解压缩
执行:[root@zookeeper software]# tar -zxvf zookeeper-3.4.10.tar.gz
解压缩之后,查看zookeeper-3.4.10目录下的东西:
(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:
注意: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
别忘了,执行:source /etc/profile,让配置生效。
9、启动zookeeper服务
在zookeeper安装目录的bin目录下有启动zk服务和客户端的执行程序:
由于配置了环境变量,可以在任何目录下启动zkServer.sh。
启动之后,可以用jps(jvm process status)查看进程状况:
zookeeper进程名为QuorumPeerMain。
利用zkServer.sh status来查看zk服务状态:
目前运行模式为standalone,即单机模式。
10、启动zookeeper客户端
执行:[root@zookeeper ~]# zkCli.sh
利用zookeeper指令操作节点:
create /zk01 lzy 创建节点
get /zk01 查看节点信息
set /zk01 ied 修改节点内容
delete /zk01 删除节点
11、退出zk客户端
12、停止zk服务
执行:zkServer.sh stop
小结zk服务三个命令:
zkServer.sh start 启动zk服务
zkServer.sh status 查看zk服务状态(模式)
zkServer.sh stop 停止zk服务
三、ZooKeeper数据结构与指令
(一)ZooKeeper数据结构
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客户端
|
|
1、创建结点
create [选项] 结点路径 [数据]
-s: sequential 顺序的
-e: empheral 临时的
create /zk01 'aaa' #普通持久结点
create -s /zk02 bbb #顺序持久结点
create -e /zk03 ccc #普通临时结点
create -e -s /zk04 ddd #顺序临时结点
由于/zk03和/zk040000000008是临时节点,退出客户端之后再次进入客户端,你会发现它们都被自动删除掉了。
利用临时节点这个特性,可以利用zk来监听连接zk服务器的节点是否挂掉了。
2、设置结点数据
将zk01节点数据设置为“howard”,执行 set /zk01 howard
每次修改操作执行之后,事务id(mZxid)会递增,同时dataVersion也会递增,看看,dataLength也变了,是howard的长度。最开始,是aaa的长度:3。
3、访问节点内容
访问节点/zk01的内容,执行 get /zk01
4、删除节点(不能删除非空节点)
为了说明方便起见,在/zk01里创建子结点/luzhou。
现在我们来删除节点/zk01,看看是否可行。
执行:delete /zk01
提示,节点/zk01非空,不能删除。
怎么办?先删除/zk01/luzhou,再删除/zk01:
看,/zk01节点被删除了。