Zookeeper学习笔记

Zookeeper学习笔记

一、Zookeeper简介

Zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂的且容易出错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并以⼀些简单的接⼝提供给⽤户使⽤。zookeeper是⼀个典型 的分布式数据⼀致性的解决⽅案,分布式应⽤程序可以基于它实现诸如数据订阅/发布、负载均衡、命名 服务、集群管理、分布式锁和分布式队列等功能。

二、Zookeeper基本概念

2.1 集群角色

  • Leader
  • Follower
  • Observer

2.2 会话(Session)

2.3 数据节点(Znode)

2.4 版本

2.5 Watcher(事件监听器)

2.6 ACL

Zookeeper采⽤ACL(Access Control Lists)策略来进⾏权限控制,其定义了如下五种权限:
CREATE:创建⼦节点的权限。
READ:获取节点数据和⼦节点列表的权限。
WRITE:更新节点数据的权限。
DELETE:删除⼦节点的权限。
ADMIN:设置节点ACL的权限。
其中需要注意的是,CREATE和DELETE这两种权限都是针对⼦节点的权限控制

3. Zookeeper环境搭建

3.1 Zookeeper的搭建方式

Zookeeper安装⽅式有三种,单机模式和集群模式以及伪集群模式。

  • 单机模式
  • 集群模式
  • 伪集群模式

3.2 单机模式搭建

  1. 下载地址Zookeeper官网
  2. 安装并启动
# 解压缩包3. 
tar -zxvf zookeeper-3.4.14.tar.gz
# 修改配置文件名称
mv zoo_sample.cfg zoo.cfg
# 修改zoo.cfg中的datadir
dataDir=/root/zookeeper-3.4.14/data
# 启动服务
./bin/zkServer.sh start
# 关闭服务
./bin/zkServer.sh stop
# 查看状态
./bin/zkServer.sh status

3.2 伪集群模式环境的搭建

Zookeeper伪集群模式就是在一台机器上部署多个Zookeeper实例,主要为方便测试,测试完成后方便迁移到真实的集群环境,这们既保证了可行性,也提高了实验效率

  1. 注意事项:
  • clientPort
    • 需要在每个实例配置不同的clientPort
  • dataDir和dataLogDir
    • 每个实例配置数据目录和数据日志也都需要在不同的目录下
  • server.x和myid
    • server.X 这个数字就是对应,data/myid中的数字。在3个server的myid⽂件中分别写⼊了1,2,3,那么每个server中的zoo.cfg都配 server.1 server.2,server.3就⾏了。
  1. 安装并启动
# 改变名称
mv zookeeper-3.4.14 zookeeper01
cp -r zookeeper01/ zookeeper02
cp -r zookeeper01/ zookeeper03
# 分别在zookeeper01、zookeeper02、zookeeper03⽬录下创建data及logs⽬录
mkdir data
cd data
mkdir logs
# 配置zookeeper01的zoo.cfg里的dataDir和clientPort
clientPort=2181
dataDir=/zkcluster/zookeeper01/data
dataLogDir=/zkcluster/zookeeper01/data/logs
# 配置zookeeper02的zoo.cfg里的dataDir和clientPort
clientPort=2182
dataDir=/zkcluster/zookeeper02/data
dataLogDir=/zkcluster/zookeeper02/data/logs
# 配置zookeeper03的zoo.cfg里的dataDir和clientPort
clientPort=2183
dataDir=/zkcluster/zookeeper03/data
dataLogDir=/zkcluster/zookeeper03/data/logs
# 在每个Zookeeper实例的data目录下创建一个myid文件,内容分别是1,2,3。这个文件就是记录每个服务器的ID
touch myid
# 在每⼀个zookeeper 的 zoo.cfg配置客户端访问端⼝(clientPort)和集群服务器IP列表。
server.1=10.211.55.4:2881:3881
server.2=10.211.55.4:2882:3882
server.3=10.211.55.4:2883:3883
#server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝

# 最后依次启动Zookeeper实例就可以了
./bin/zkServer.sh start

四、Zookeeper基本使用

4.1 Zookeeper系统模型

4.1.1 ZNode介绍
4.1.2 ZNode类型

Zookeeper节点类型可以为分三大类:

  • 持久性节点(Persistent)
  • 临时性节点(Ephemeral)
  • 顺序性节点(Sequential)
    在开发中在创建节点的时候通过组合可以⽣成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的⽣命周期
  • 持久节点
  • 持久顺序节点
  • 临时节点
  • 临时顺序节点
4.1.3 事务ID
4.1.4 ZNode的状态信息
4.1.5 Watcher–数据变更通知
4.1.6 ACL–保障数据的安全

4.2 Zookeeper命令行操作

通过zkClient开启与zookeeper服务端的会话

# 连接本地的zookeeper服务器
./zkCli.sh
./zkCli.sh -server ip:port 连接指定的服务器
4.2.1 创建节点
  • 语法
# -s 指节点特性的顺序节点
# -e 指节点特性的临时节点,若不指定,则创建持久节点
# acl 用来进行权限控制
create [-s][-e] path data acl
  • 创建顺序节点
create -s /zk-test 123

zookeeper创建顺序节点

  • 创建临时节点
create -e /zk-temp 123

zookeeper创建临时节点

  • 创建永久节点
create /zk-permanent 123

zookeeper创建永久节点

4.2.2 读取节点

与读取相关的命令有ls 命令和get 命令

ls命令

ls命令可以列出Zookeeper指定节点下的所有⼦节点,但只能查看指定节点下的第⼀级的所有⼦节点

  • ls命令语法
# path表示的是指定数据节点的节点路径
ls path

zookeeper的ls命令

get命令
# path表示的是指定数据节点的节点路径
get path

zookeeper的get命令

4.2.3 更新节点

在zookeeper中,节点的数据是有版本概念的,这个参数⽤于指定本次更新操作是基于Znode的哪⼀个数据版本进⾏的

语法
# data就是要更新的新内容
# version表示数据版本
set path data [version]

zookeeper更新节点

4.2.4 删除节点
语法
delete path [version]

4.3 Zookeeper的API使用

4.3.1 zookeeper

见这里https://gitee.com/hqgit/study-training/tree/master/302-zookeeper/study-zookeeper

4.3.2 zkclient

见这里https://gitee.com/hqgit/study-training/tree/master/302-zookeeper/study-zookeeper

4.3.3 curator-framework

见这里https://gitee.com/hqgit/study-training/tree/master/302-zookeeper/study-zookeeper

五、Zookeeper的应用场景

  Zookeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架,而且Zookeeper丰富的数据节点类型交叉使用,再配合Zookeeper的Watcher事件通知机制,可以非常方便的构建分布式应用中的一些核心功能,如:数据发布/订阅、命名服务、集群管理、Master选举、分布式锁和分布式队列等。

5.1 数据发布/订阅

  数据发布/订阅系统,即所谓的数据配置中心,将数据发布到Zookeeper的一个或一系列节点上,使订阅者进行数据订阅,从而达到动态获取数据的目的,方便分布式平台集中式管理和数据动态的更新。
  发布/订阅一般分为两种模式:推(Push)模式和拉(Pull)模式
推(Push)模式: 服务器端将数据更新发送给所有订阅的客户端,
拉(Pull)模式: 订阅的客户端主动向服务器获取到最新的数据。通常采用定时任务轮询的方式拉取
  Zookeeper采用推拉相结合的模式:客户端向服务端注册自己关注的节点,一旦关注的节点的数据发生变更,那么客户端接收到通知后,主动向服务端获取到最新的数据。

5.2 命名服务

  命名服务(Name Service)也是分布式系统中比较常见的一类场景,是分布式系统最基本公共服务之一。在分布式系统中,我们可以把集群中的机器,服务器地址或远程对象等都可以统称为名字(Name),其中较为常见的是一些常见的分布式服务(RPC、RMI)框架中,通过命名服务,客户端根据名字获取到服务地址、资源实体和提供者的其它信息。
  Zookeeper提供的命名服务通过以资源引用的方式定位到资源及使用,从广义上讲命名服务资源定位不是真正意义的实体资源,在分布式应用中,上层应用只需要获取到唯一的名字即可,类似于数据库中的唯一主键。
具体应用:可以使用Zookeeper来实现一套分布式全局唯一ID的分配机制。

5.3 集群管理

  随着分布式系统规模日益扩大,机器数量也逐渐增加,对于集群管理也显得越来越重要了。
  集群管理的是集群监控集群控制这两块。
集群监控: 侧重对集群运行时状态的收集。
集群控制: 侧重对集群进行操作与控制。
在日常开发和运维过程中,经常会有以下几个需求:

  1. 如何快速的统计出当前集群有多少台机器
  2. 如何快速的获取到机器上下线的的情况
  3. 如何实时监控集群中每台机器运行时的状态
基于Agent的分布式集群管理分析
介绍

在传统的基于Agent的分布式集群管理体系中,在每台服务器上部署一个Agent,同这个Agent负责主动向指定的一个集群监控中心系统推送自己所在机器的状态。这在分布式集群管理中,是一个快速有效的解决方案。但是业务场景增多,集群规模越来越大,此解决方案的弊端也就随之显现出来了。

弊端
大规模升级困难

Agent是以客户端的形式存在,如果要升级,需要在把每台机器上的agent都要升级, 机器越多升级成本越高,效率越差。

统⼀的Agent⽆法满⾜多样的需求

对于机器的CPU使用率、负载(Load)、内存使用率、网络吞吐以及磁盘可用容量等物理状态,使用统一的Agent模式来进行监控或许都可以满足,但是如果深入应用,比如在一个分布式消息中间件中,希望对每个消费都消息消费状态的监控,或者在分布式任务调用系统中,对任务执行的状况进行监控。对这些紧耦合业务的监控需求,统一的agent就不适合提供了。

编程语⾔多样性

越来越多的编程语言出现,那么传统的Agent的模式,就需要提供多语言的客户端,监控中心在对异构系统的数据整合上也面临巨大挑战。

Zookeeper的两大特性
  1. watcher监听机制
  2. Zookeeper的临时节点
    利用这两大特性,可以实现集群机器存活监控系统,若监控系统在/clusterServers节点上注册一个Watcher监听,那么有动态添加机器的操作,就会在/clusterServers节点下创建一个临时节点:/clusterServers/[hostname],这样,监控系统就能够实时监测机器的变动情况。

5.4 Master选举

  在分布式系统中,Master往往用来协调集群中其他系统单元,具有对分布式系统状态变更的决定权。
利用Zookeeper的强一致性,能够很好的保证在分布式高并发情况下节点的创建一定能够保证全局唯一性,即Zookeeper将会保证无法重复创建一个已经存在的数据节点。利用这个特性,就能很容易地在分布式环境中进行Master选举了。
例如
  在Zookeeper上创建了一个这样的日期节点/master_election/2020-11-11。
集群中每个实例每天都会定时往Zookeeper上创建一个临时节点,/master_election/2020-11-11/binding
  在这个过程中,只有一个客户端能够创建这个节点,那么这个创建这个节点的实例所在的机器就是master了,其它没有创建节点成功的实例,则在/master_election/2020-11-11节点上注册一个节点变更的watcher,用于监控当前master机器是否存活,一旦发现当前master挂了,其余实例会重新创建临时节点,即同理相应的节点就是master了。

5.5 分布式锁

5.6 分布式队列

六、Zookeeper深入进阶

6.1 ZAB协议

6.2 服务器角色

6.3 服务器启动

6.4 leader选举

七、Zookeeper源码分析

7.1 源码环境搭建

7.1.1 下载zk源码并解压

zookeeper-release-3.5.5版本为例

7.1.2 使用git push到服务器上

请先把.gitignore移除,否则会忽略掉一些文件比如zookeeper-jute中的rcc.jj,而导致在其它电脑上pull下来后,mvn clean install 会失败。git push到服务器后,再将.gitignore复位。

7.1.3 install Zookeeper

cmd下进入到zookeeper-jute目录执行mvn clean install -DskipTests
再回到zookeeper-release-3.5.5目录下继续执行mvn clean install -DskipTests

7.1.4 导入到idea中
7.1.5 对于zookeeper-server目录下的pom.xml的修改
  • scope标签注释掉
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-server</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-servlet</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
  <groupId>commons-cli</groupId>
  <artifactId>commons-cli</artifactId>
<!--<scope>provided</scope>-->
</dependency>
7.1.6 运行服务端

org.apache.zookeeper.server.quorum.QuorumPeerMain

VM options: -Dlog4j.configuration=file:D:\code\clone-my\study-zookeeper\zookeeper-release-3.5.5\conf\log4j.properties
Program arguments: D:\code\clone-my\study-zookeeper\zookeeper-release-3.5.5\conf\zoo.cfg
7.1.7 运行客户端

org.apache.zookeeper.ZooKeeperMain

VM options: -Dlog4j.configuration=file:D:\code\clone-my\study-zookeeper\zookeeper-release-3.5.5\conf\log4j.properties
Program arguments: -server 127.0.0.1:2181

注意:
如果遇到程序包org.apache.zookeeper.data不存在则install一下zookeeper-jute项目就可以
运行客户端后如果输入zk命令不能有效交互,那么在VM options加上 -Djline.terminal=jline.UnsupportedTerminal就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值