zookeeper功能介绍与常用命令

1.zookeeper概述

1.1:概述:

zookeeper是开源的apache的分布式项目

zookeeper是一个观察者模式的分布式框架,负责存储和管理大家关心的数据(1M、节点)

然后接受观察者的注册,一旦数据发生状态变化,zookeeper会负责通知zookeeper上注册的观察者做出相应反映,从而实现集群中类似Master/slave管理模式

1.2

zookeeper功能介绍与常用命令

zookeeper功能介绍与常用命令

1)Zookeeper:一个领导者(leader),多个跟随者(follower)组成的集群。

2)Leader 负责进行投票的发起和决议,更新系统状。

3)Follower 用于接收客户请求并向客户端返回结果,在选举 Leader 过程中参与投票。

4)集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务。

5)全局数据一致:每个 server 保存一份相同的数据副本,client 无论连接到哪个 server,数

据都是一致的。

6)更新请求顺序进行,来自同一个 client 的更新请求按其发送顺序依次执行。

7)数据更新原子性,一次数据更新要么成功,要么失败。

8)实时性,在一定时间范围内,client 能读到最新数据。

1.3:数据结构:

zookeeper功能介绍与常用命令

每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过

其路径唯一标识。(存储配置信息)

1.4:应用场景:

提供的服务包括:统一命名服务,统一配置管理,统一集群管理,服务器节点动态上下线,软负载均衡         

统一命名服务

zookeeper功能介绍与常用命令

统一配置管理

zookeeper功能介绍与常用命令

 统一集群管理     

   

zookeeper功能介绍与常用命令

  服务器动态上下线

zookeeper功能介绍与常用命令

 软负载均衡

                     

zookeeper功能介绍与常用命令

                                                                                                                                                                                

1.5:下载地址:

1)官网首页:

https://zookeeper.apache.org/

2)下载截图

 

zookeeper功能介绍与常用命令

2:zookeeper安装

2.1 本地模式安装部署

1)安装前准备:

(1)安装 jdk

(2)通过MobaXterm.exe 工具拷贝 zookeeper 到 linux 系统下

(3)修改 tar 包权限

[[email protected] software]$ chmod u+x zookeeper-3.4.10.tar.gz

(4)解压到指定目录

[[email protected] software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

2)配置修改

将/opt/module/zookeeper-3.4.10/conf 这个路径下的 zoo_sample.cfg 修改为 zoo.cfg;

进入 zoo.cfg 文件:vim zoo.cfg

修改 dataDir 路径为

dataDir=/opt/module/zookeeper-3.4.10/zkData

在/opt/module/zookeeper-3.4.10/这个目录上创建 zkData 文件夹

[[email protected] zookeeper-3.4.10]$ mkdir zkData

3)操作 zookeeper

(1)启动 zookeeper

[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start

(2)查看进程是否启动

[[email protected] zookeeper-3.4.10]$ jps

4020 Jps

4001 QuorumPeerMain

(3)查看状态:

[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: standalone

(4)启动客户端:

[[email protected] zookeeper-3.4.10]$ bin/zkCli.sh

(5)退出客户端:

[zk: localhost:2181(CONNECTED) 0] quit

(6)停止 zookeeper

[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh stop

2.2 配置参数解读解读zoo.cfg文件中参数含义

1)tickTime=2000:通信心跳数,Zookeeper服务器心跳时间,单位毫秒Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最时时间是2*tickTime)

2)initLimit=10:Leader和Follower初始通信时限

集群中的follower跟随者服务器与leader领导者服务器之间初始连接时能容忍的最多心

跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。

投票选举新leader的初始化时间

Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的

起始状态。

Leader允许Follower在initLimit时间内完成这个工作。

3)syncLimit=5:Leader 和 Follower 同步通信时限

集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,

Leader认为Follwer死掉,从服务器列表中删除Follwer。

在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机

制,来检测机器的存活状态。

如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在

线了。

4)dataDir:数据文件目录+数据持久化路径

保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据

库。

5)clientPort=2181:客户端连接端口

监听客户端连接的端口

zookeeper功能介绍与常用命令

3:zookeeper的内部机制

3.1 选举机制

1)半数机制(Paxos 协议):集群中半数以上机器存活,集群可用。所以 zookeeper

适合装在奇数台机器上。

2)Zookeeper 虽然在配置文件中并没有指定 master 和 slave。但是,zookeeper 工作时,是有一个节点为 leader,其他则为 follower,Leader 是通过内部的选举机制临时产生的。

3)以一个简单的例子来说明整个选举的过程。假设有五台服务器组成的 zookeeper 集群,它们的 id 从 1-5,同时它们都是最新启动。

(1)服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所

以它的选举状态一直是 LOOKING 状态。

(2)服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,

由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以

上的服务器都同意选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是继续保持

LOOKING 状态。

(3)服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1、2、3 中的老大,

而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的 leader。

(4)服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1、2、3、4 中最

大的,但是由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命

了。

(5)服务器 5 启动,同 4 一样当小弟。

3.2 节点类型

1)Znode 有两种类型:

短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除

持久(persistent):客户端和服务器端断开连接后,创建的节点不删除

2)Znode 有四种形式的目录节点(默认是 persistent )

(1)持久化目录节点(PERSISTENT)

客户端与 zookeeper 断开连接后,该节点依旧存在。

(2)持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)

客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称

进行顺序编号。

(3)临时目录节点(EPHEMERAL)

客户端与 zookeeper 断开连接后,该节点被删除。

(4)临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)

客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进

行顺序编号

zookeeper功能介绍与常用命令

3)创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护4)在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的

4:zookeeper实战

4.1 分布式安装部署

0)集群规划

在 hadoop102、hadoop103 和 hadoop104 三个节点上部署 Zookeeper。

1)解压安装

(1)解压 zookeeper 安装包到/opt/module/目录下

[[email protected] software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

(2)在/opt/module/zookeeper-3.4.10/这个目录下创建 zkData

mkdir -p zkData

(3)重命名/opt/module/zookeeper-3.4.10/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg

mv zoo_sample.cfg zoo.cfg

2)配置 zoo.cfg 文件

(1)具体配置

dataDir=/opt/module/zookeeper-3.4.10/zkData

增加如下配置

#######################cluster##########################

server.2=hadoop102:2888:3888

server.3=hadoop103:2888:3888

server.4=hadoop104:2888:3888

(2)配置参数解读

Server.A=B:C:D。

A 是一个数字,表示这个是第几号服务器;

B 是这个服务器的 ip 地址;

C 是这个服务器与集群中的 Leader 服务器交换信息的端口;

D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的

Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件myid,这个文件在dataDir 目录下,这个文件里面有一个数据

就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比

较从而判断到底是哪个 server。

3)集群操作

(1)在/opt/module/zookeeper-3.4.10/zkData 目录下创建一个 myid 的文件

touch myid

添加 myid 文件,注意一定要在 linux 里面创建,在 notepad++里面很可能乱码

(2)编辑 myid 文件

vi myid

在文件中添加与 server 对应的编号:如 2

(3)拷贝配置好的 zookeeper 到其他机器上

scp -r zookeeper-3.4.10/ [email protected]:/opt/app/

scp -r zookeeper-3.4.10/ [email protected]:/opt/app/

并分别修改 myid 文件中内容为 3、4

(4)分别启动 zookeeper

[[email protected] zookeeper-3.4.10]# bin/zkServer.sh start

[[email protected] zookeeper-3.4.10]# bin/zkServer.sh start

[[email protected] zookeeper-3.4.10]# bin/zkServer.sh start

(5)查看状态

[[email protected] zookeeper-3.4.10]# bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: follower

[[email protected] zookeeper-3.4.10]# bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: leader

[[email protected] zookeeper-3.4.5]# bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: follower

5. xsync远程同步 脚本

在/usr/local/bin 目录下创建 xsync 文件,向里面添加:

#!/bin/sh

# 获取输入参数个数,如果没有参数,直接退出

pcount=$#

if((pcount==0)); then

        echo no args...;

        exit;

fi

# 获取文件名称

p1=$1

fname=`basename $p1`

echo fname=$fname

# 获取上级目录到绝对路径

pdir=`cd -P $(dirname $p1); pwd`

echo pdir=$pdir

# 获取当前用户名称

user=`whoami`

# 循环

for((host=01; host<=03; host++)); do

        echo $pdir/$fname [email protected]$host:$pdir

        echo ==================slave$host==================

 

done

#Note:这里的slave对应自己主机名,需要做相应修改。另外,for循环中的host的边界值由自己的主机编号决定。

最后chmod a+x xsync给文件添加执行权限即可。

使用xsync filename就能将filename分发到集群中的各个节点中。

6.HA高可用

HA:解决系统的单点故障问题

6.1 HDFS单点故障

格式化的时候 两个的fsimage一致, nna 上边有edits操作,nnsb作用跟snn作用类似。如果nna宕机,journal里的数据+nnsb的数据编译成新的文件,可以快速恢namenode的作用。

Q-journal 分布式日志管理系统  基于zookeeper开发

数据同步策略与zookeeper相同,paxos算法做数据一致性同步 。

zkfc 基于zoopeeker的failover controller  控制发生故障状态的控制器,负责不断监控namenode的状态,不断发请求。一个机子上一个zkfc。他们两个会通过zoopeeker上记录信息告诉那个是nna记录状态。如果nna出故障,zkfc1发送消息个另外一个机子上的zkfc2, (jvm线程过多,gc无法同步回收,会暂停进程)如果出现2个namenode叫split sbain 脑裂,处理方法:1,ssh kill掉一个namenode。(有时候是网路问题,kill 不死)2,shell脚本,(利用用户提供的脚本方法处理,关闭nn网络)控制sandbynamenode作为active。

zookeeper功能介绍与常用命令

6.2 Yarn单点故障问题

yarn中没有什么job的状态继承可言。一个resourcesmanager不行,就多设计几个。都需要给zookeeper进行监听注册。

6.3 高可用环境搭建

最少需要13台机子,才能搭建一个高可用。

namenode  zkfc

namenode  zkfc

resourcemanager

resourcemanager

datanode nodemanager  zookeeper journalnode

datanode nodemanager zookeeper journalnode

datanode nodemanager zookeeper journalnode