微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Zookeeper

文章目录


在这里插入图片描述

前言:

zookeeper是分布式应用程序协调服务,负责协调其他的大数据框架。学习要求:会用即可。因此本文主要简单阐述一下zookeeper是怎么用的,基本的原理是啥。

1 zookeeper概述

1.1 作用

zookeeper是一个基于观察者设计模式的分布式服务管理框架,负责存储和管理集群中几点的数据,接受观察者的注册,一旦这些数据状态发生改变,Zookeeper就将负责通知已经在zookeeper中注册的那些观察者做出相应的反映。
zookeeper = 文件系统 + 通知机制

1.2 特点

在这里插入图片描述

zookeeper也是一个分布式的程序,具有多个节点,具有如下特点:

  • 一个领导者(leader),多个跟随者(follower)组成的集群
  • 集群中只要有半数以上节点活着,zookeeper就能正常服务,所以zookeeper适合安装奇数台服务器。
  • 全局数据一致:每一个server爆粗那一份相同的副本,Client无论连接到哪一台Server,拿到的数据都是一致的。
  • 更新请求顺序执行,来自同一个Client的更新请求按照其发送顺序依次执行
  • 数据更新原子性,一个数据更新要么成功,要么失败
  • 实时性,在一定时间范围内,Client能够读到最新的数据。

1.3 数据结构

在这里插入图片描述

zookeeper数据模型以节点树的数据结构构建,每个节点称为一个znode,每一个znode认存储1MB的数据(可以看到数据量很小,只可以存储一些配置信息)。

1.4 应用场景

  • 统一命名服务

    在这里插入图片描述

  • 统一配置管理(之前hadoop的学习使用的是分发功能

    在这里插入图片描述

  • 统一集群管理

    在这里插入图片描述

  • 服务器节点动态上下线

    在这里插入图片描述

  • 负载均衡(节点间的负载均衡)

    在这里插入图片描述


    官网:https://zookeeper.apache.org/

2 zookeeper安装

2.1 本地模式安装与配置

下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/
本文是基于3.5.7来进行安装的。

安装步骤:
1)下载、上传、解压、安装JDK
2)修改配置:

  • 将安装目录下conf/zoo_sample.cfg改名为zoo.cfg
  • 修改zoo.cfg文件的dataDir为自己创建的非tmp目录(认值在/tmp目录中,linux系统隔一段时间会删除这些文件),修改后结果类似于下图。

    在这里插入图片描述

3)zookeeper初步了解:

在这里插入图片描述


查看zookeeper的目录结构:

  • bin:框架相关命令操作:启动、停止,客户端、服务端
  • conf: 配置文件
  • docs文档
  • lib 配置文档的依赖

查看bin目录下的文件

在这里插入图片描述


用的多的有:

  • 集群启动:zkServer.sh start
  • 集群关闭zkServer.sh stop
  • 查看状态:zkServer.sh status
  • 客户端启动:zkCli.sh
  • 客户端退出quit
  • 查看进程是否启动:jps

第2步中修改了zookeeper配置文件,其主要参数除了dataDir之外还有:

在这里插入图片描述


其具体含义为:

  • tickTime = 2000:zookeeper服务器与客户端心跳时间,单位毫秒
  • initLimit = 10:初始化通信的时间,最多不能超过的时间(10*心跳时间),超过的话,通信失败
  • synclimit = 5:建立好连接后,下次的通信时间如果超过(5*心跳时间),通信失败
  • dataDir:保存zookeeper的数据,认是tmp会被系统定期清除
  • clientPort =2181:客户端的连接端口,一般不需要修改

2.2 集群模式安装与配置

与hadoop需要在配置文件中指定谁是namenode、secondary NameNode、resourceMannager不同,zookeeper它能够自己选出leader,所以不需要进行相关配置。但是需要自己配置每台机器的myid(用来唯一标识每一台机器的ID,每台机器不能重复),并需要在zoo.cfg文件中配置一下,告诉所有机器zookeeper集群本应该在哪几台机器上运行。

接下来进入安装步骤:
1)按照本地模式安装与配置安装一台机器
2)在存储目录dataDir中新建myid文件,并在其中写入惟一的编号。
3)将安装目录和存储目录分发到你要配置的机器上,然后分别为他们修改myid。
4)需要重新配置zoo.cfg文件增加如下配置,之后分发个各个集群:

server.1=hadoop100:2888:3888
server.3=hadoop102:2888:3888
server.4=hadoop103:2888:3888

当前主要配置编号的参数是server.A=B:C:D

  • A:标识第几台服务器(myid)。zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
  • B:标识服务器映射地址。
  • C:标识服务器 Follower 与集群中的 leader 服务器交换信息的端口。
  • D:主要是用来选举,如果leader 服务器挂了。这个端口就是用来执行选举时服务器相互通信的端口,通过这个端口进行重新选举leader

5)制作批量启动、停止、查看状态的脚本

#!/bin/bash

case $1 in
"start"){
	for i in hadoop100 hadoop102 hadoop103
	do
	echo ---------- zookeeper $i 启动 ------------
	ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
	done
};;
"stop"){
	for i in hadoop100 hadoop102 hadoop103
	do
	echo ---------- zookeeper $i 停止 ------------ 
	ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
	done
};;
"status"){
	for i in hadoop100 hadoop102 hadoop103
	do
	echo ---------- zookeeper $i 状态 ------------ 
	ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
	done
};;
esac

做一下说明:这个脚本能用前提是配置了主机名称映射和ssh免密登录和可执行权限。运行启动脚本,查看状态,得到如下图:

在这里插入图片描述


解释一下:hadoop100配置的myid = 1,hadoop102配置的myid = 3,hadoop103配置的myid = 4。为啥hadoop2是leader下面揭晓。

3 zookeeper选举机制

这个PPT讲的很清楚了:

在这里插入图片描述


在这里插入图片描述


唯一解释一下的是ZXID:

Zxid 是一个 64 位的数字,其中低 32位是一个简单的单调递增的计数器,针对客户端每一个事 务请求,计数器加 1;而高 32 位则代表leader 周期 epoch 的编号。

每个当选产生一个新的 leader服务器,就会从这个 leader服务器上取出其本地日志中最大事务的 ZXID,并从中读取 epoch值,然后加 1,以此作为新的 epoch,并将低 32 位从 0 开始计数。

Zxid(Transaction id)类似于 RDBMS 中的事务 ID,用于标识一次更新操作的 Proposal(提议)
ID。为了保证顺序性,该 zkid 必须单调递增。

依据上面选举的原理,就不难理解为啥hadoop102是leader了而不是hadoop103。初始化谁是leader与启动顺序和myid都有关系。

4 zookeeper实操

4.1 客户端命令行操作

4.2 客户端API操作

4.3 服务器动态上下监听案例

4.4 分布式锁案例

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐