介绍Zookeeper前,看下面这个图:
在这张图片里,我们可以看到Hadoop是一只大象,HIVE是一只蜜蜂,Bigtop是马戏团,Pig是一只猪,HAMA是一只河马…只有Zookeeper是一个拿着铁锹的人,我们可以将Zookeeper理解为动物园的管理员…它负责管理动物园中的动物,如果某个动物出现了问题,它就会第一时间知道并进行处理。此时再用官方的解释来说,Zookeeper是一个开源的分布式的、为分布式应用提供服务的Apache项目。好了,这就是Zookeeper,是不是很好理解。
它既然是一个管理员,那么它就需要知道自己管辖范围内的各种情况,如果有问题就及时处理;我们从设计模式的角度来理解:zookeeper是一个基于观察者模式设计的分布式服务管理框架;它负责存储和管理大家都关心的数据,然后接收观察者的注册、一旦这些数据发送了变化,zookeeper就将负责通知已经在zookeeper上注册的那些观察者做出相应的反应。
类似其他分布式工具,Zookeeper是支持复制的,由一系列的Server组成,Client与Server相连以获取相关的服务。
在这里插入图片描述
集群结构说明:
集群数量为奇数,并且超过N+1台,只要集群中大多数节点都处于可用状态,那么集群就是可用的,集群中的服务器角色有:
1)领导者:复杂投票的发起和决议,并更新系统状态
2)学习者:包括跟随者和观察者,从Leader处获取最新的系统状态
3)Follower用于接受客户端请求,并向客户端返回结果,在选举过程中参与投票
4)Observer观察者可以接受客户端请求,将写请求转发给Leader,但是不参与投票,只同步状态。它的目的是为了扩展系统,以提高读取速度。
集群中由一个Leader节点和N个Follower节点组成,所有的Server之间能彼此通信,并且在各自内存中维护了状态图,与之一致的事务日志和快照位于持久化存储中。这一点类似Redis的Sentinel模式,它们都具有高度的自治能力,一旦Leader节点不可达,则自动完成新Leader的选举并恢复服务。
Zookeeper的数据模型结构与我们学习的Unix文件系统类似,只不过它是由节点组成,Unix是由文件组成,Zookeeper的每一个节点称作ZNode,每个节点可以存储1M的数据,看起来它很小,其实很大了,因为它只会存储关键的数据,通常情况下,每个节点ZNode中只存储的xxkb的数据。每个ZNode都可以通过路径做唯一的标识
在 Apache 下载 Zookeeper 软件包,(我们的平台已经安装了Zookeeper组件,我们可以跳过这步,想自己安装的小伙伴可以输入以下命令尝试一下):
wgat https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz
vim /etc/profile 打开环境变量配置文件
export ZOOKEEPER_HOME=/usr/cstor/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
修改完成后,我们输入以下命令激活我们修改的环境变量
source /etc/profile
进入到Zookeeper根目录下的下conf文件中复制zoo_sample.cfg并命名为zoo.cfg
cd /usr/cstor/zookeeper/
cd conf/
ls
cp zoo_sample.cfg zoo.cfg
ls
修改zoo.cfg文件
vim zoo.cfg
dataDir=/usr/cstor/zookeeper/data
dataLogDir=/usr/cstor/zookeeper/log
Zookeeper中的配置文件zoo.cfg中参数含义解读如下:
tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
initLimit =10:LF初始通信时限
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
syncLimit =5:LF同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
dataDir:数据文件目录+数据持久化路径
主要用于保存Zookeeper中的数据。
clientPort =2181:客户端连接端口
监听客户端连接的端口
回到zookeeper根目中创建data、log(因为datadir、dataLogDir指向它)
cd ../
mkdir data
mkdir log
/bin/zkServer.sh start|stop|status|restart
# 启动zookeeper服务 :
启动成功。
/bin/zkCli.sh #启动客户端
quit #退出客户端
本地模式部署完成。
(1)、首先,集群模式要在前面本地模式没有问题并且三个节点都成功的情况下进行
(2)、然后我们需要先把先把zookeeper服务停掉
bin/zkServer.sh stop
log和data中的数据全部删除
分别在三个节点(master、slave1、slave2)在zookeeper/data中创建myid文件。并在文件中写一个数值,类似我们Hadoop集群时的hostname。该值代表zookeeper节点Id。注意:该值在整个集群中是唯一的。
cd ../
cd data/
vim myid
master 的myid内容为1
slave1 的myid内容为2
slave2 的myid内容为3
slave1、slave2操作如上。
vim conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# 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 port at which the clients will connect
clientPort=2181
# the directory where the snapshot is stored.
dataDir=/usr/cstor/zookeeper/data
dataLogDir=/usr/cstor/zookeeper/log
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
将修改好的zoo.cfg文件分发到slave1和slave2节点上
scp -r conf/zoo.cfg slave1:/usr/cstor/zookeeper/conf/
scp -r conf/zoo.cfg slave2:/usr/cstor/zookeeper/conf/
分别在三个节点进入bin目录,启动ZooKeeper服务进程:
cd /usr/cstor/zookeeper/bin
./zkServer.sh start
master:
slave1:
slave2:
在各机器上依次执行脚本,查看ZooKeeper状态信息
./zkServer.sh status
master:
slave1:
slave2:
./zkCli.sh -server master:2181,slave1:2181,slave2:2181