Zookeeper

文章目录


Zookeeper

前言:

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

1 zookeeper概述

1.1 作用

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

1.2 特点

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

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

1.3 数据结构

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

1.4 应用场景

  • 统一命名服务
    Zookeeper

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

  • 统一集群管理
    Zookeeper

  • 服务器节点动态上下线
    Zookeeper

  • 软负载均衡(节点间的负载均衡)
    Zookeeper
    官网: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系统隔一段时间会删除这些文件),修改后结果类似于下图。
    Zookeeper

3)zookeeper初步了解:
Zookeeper
查看zookeeper的目录结构:

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

查看bin目录下的文件
Zookeeper
用的多的有:

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

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

  • 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免密登录和可执行权限。运行启动脚本,查看状态,得到如下图:
Zookeeper
解释一下:hadoop100配置的myid = 1,hadoop102配置的myid = 3,hadoop103配置的myid = 4。为啥hadoop2是leader下面揭晓。

3 zookeeper选举机制

这个PPT讲的很清楚了:
Zookeeper
Zookeeper
唯一解释一下的是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 分布式锁案例

上一篇:微信官方小程序示例demo 微信开发者工具打开不显示云开发按钮


下一篇:zookeeper-3.4.5-cdh5.14.2安装部署(三节点)