ZooKeeper

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: ZooKeeper

ZooKeeper作为顶级分布式开源项目,应用非常广泛,Dubbo和Kafka这些知名的开源项目都在使用。之前只是听说过它,并没有仔细研究过。

10.png

今天带大家来学习下ZooKeeper,主要从ZooKeeper的安装、可视化工具、应用三方面来介绍,希望对大家有所帮助!


目录


简介

分布式协调

安装

Windows安装

设置心跳时间,单位毫秒

存储内存数据库快照的文件夹

监听客户端连接的端口

Linux安装

设置心跳时间,单位毫秒

存储内存数据库快照的文件夹

监听客户端连接的端口

命令行操作

可视化管理 PrettyZoo

节点类型

创建持久顺序节点

创建临时节点

创建临时顺序节点

作为注册中心使用

总结


简介

ZooKeeper是一款分布式协调框架,它可以为分布式系统提供一致性服务。ZooKeeper最初由Yahoo开发,后来捐献给了Apache基金会,现已成功Apache的顶级项目,目前在Github上有9.5k+Star。


分布式协调


要理解ZooKeeper我们首先需要了解下什么是分布式协调?这里拿Spring Cloud中注册中心的例子来说吧。


微服务(分布式)系统中有很多服务,相同的服务又有多个实例,我们在应用中可以通过服务名来负载均衡地调用服务,而这些服务有可能会挂掉,也有可能会有新的实例加入。此时我们就需要一个东西来做协调,保存好服务名称和可用实例调用IP的对应关系,此时注册中心就是一个分布式协调者的角色,而ZooKeeper就可以用来充当这个协调者。


安装

ZooKeeper的安装无论是Windows还是Linux都是很方便的,我们先来学习下它的安装。


Windows安装


首先下载ZooKeeper安装包,下载地址:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
解压到指定目录,解压完成后目录结构如下;
在conf目录下创建配置文件zoo.cfg,内容如下;


设置心跳时间,单位毫秒

tickTime=2000


存储内存数据库快照的文件夹

dataDir=I:/developer/env/apache-zookeeper-3.7.0-bin/data


监听客户端连接的端口

clientPort=2181


进入bin目录,启动ZooKeeper服务;
• 1

zkServer.cmd

服务启动成功后,控制台会输出如下信息。


Linux安装

使用Docker安装ZooKeeper无疑是最方便的,首先我们下载它的Docker镜像;


docker pull zookeeper:3.7.0

创建好ZooKeeper的配置文件目录,并切换到该目录创建配置文件zoo.cfg;


mkdir /mydata/zookeeper/conf/ -p

cd /mydata/zookeeper/conf/

touch zoo.cfg

配置文件zoo.cfg内容如下,直接使用VIM编辑即可;


设置心跳时间,单位毫秒

tickTime=2000

存储内存数据库快照的文件夹

dataDir=/tmp/zookeeper

监听客户端连接的端口

clientPort=2181


运行ZooKeeper容器。
• 1

docker run -p 2181:2181 --name zookeeper

-v /mydata/zookeeper/conf/zoo.cfg:/conf/zoo.cfg

-d zookeeper:3.7.0


命令行操作

接下来我们用命令行来操作下ZooKeeper,熟悉下ZooKeeper的使用。
首先使用zkCli命令行工具连接到ZooKeeper;

zkCli.cmd -server 127.0.0.1:2181

通过help可以命令查看ZooKeeper的常用命令;


[zk: 127.0.0.1:2181(CONNECTED) 0] help

ZooKeeper -server host:port -client-configuration properties-file cmd args

addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE

addauth scheme auth

close

config [-c] [-w] [-s]

connect host:port

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

delete [-v version] path

deleteall path [-b batch size]

delquota [-n|-b|-N|-B] path

get [-s] [-w] path

getAcl [-s] path

getAllChildrenNumber path

getEphemerals path

history

listquota path

ls [-s] [-w] [-R] path

printwatches on|off

quit

reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,…]]] | [-add serverId=host:port1:port2;port3[,…]] [-remove serverId[,…]*]

redo cmdno

removewatches path [-c|-d|-a] [-l]

set [-s] [-v version] path data

setAcl [-s] [-v version] [-R] path acl

setquota -n|-b|-N|-B val path

stat [-w] path

sync path

version

whoami

大家都知道Redis是通过key-value的形式存储数据的,而ZooKeeper是通过znode-value的形式存储数据的,znode有点像目录,而/目录就是ZooKeeper中的根目录,通过如下命令可以查看所有znode;


[zk: 127.0.0.1:2181(CONNECTED) 1] ls /

[zookeeper]

创建一个znode叫做/zk_test,存储字符串my_data,这用起来有点像Redis;


[zk: 127.0.0.1:2181(CONNECTED) 2] create /zk_test my_data

Created /zk_test

查看所有znode,可以看到zk_test这个znode;


[zk: 127.0.0.1:2181(CONNECTED) 3] ls /

[zk_test, zookeeper]

获取znode中存储的数据;


[zk: 127.0.0.1:2181(CONNECTED) 4] get /zk_test

my_data

修改znode中的数据;


[zk: 127.0.0.1:2181(CONNECTED) 5] set /zk_test test_data

[zk: 127.0.0.1:2181(CONNECTED) 6] get /zk_test

test_data

删除znode中的数据;


[zk: 127.0.0.1:2181(CONNECTED) 7] delete /zk_test

[zk: 127.0.0.1:2181(CONNECTED) 8] ls /

[zookeeper]


可视化管理 PrettyZoo


PrettyZoo是一款基于 Apache Curator 和 JavaFX 实现的 Zookeeper 图形化管理客户端。颜值很高,推荐使用。
首先下载PrettyZoo的安装包,下载地址:https://github.com/vran-dev/PrettyZoo/releases
我们需要创建一个连接,连接到ZooKeeper,可以发现PrettyZoo是支持通过SSH通道连接的;
双击连接,我们可以查看到ZooKeeper中存储的数据,很清楚的发现,ZooKeeper是按目录结构存储数据的;
右键目录,我们可以创建和删除znode,有了这个工具,基本上可以和命令行操作说再见了;
如果你还是觉得命令行比较炫酷的话,PrettyZoo也实现了命令行功能,打开命令行标签就可以愉快地敲命令了。


11.png

ZooKeeper中的节点(znode)是有生命周期的,这取决于节点的类型。类型有主要有下面四种:

持久节点(Persistent):默认节点类型,节点创建后,会一直存在。
持久顺序节点(Persistent Sequential):具有持久节点特性,节点名称后会增加自增数字后缀。
临时节点(Ephemeral):临时存在,当创建节点的会话关闭时,节点被删除。
临时顺序节点(Ephemeral Sequential):具有临时节点特性,节点名称后会增加自增数字后缀。

如果你用命令行创建节点的话,顺序特性对应-s选项,临时特性对应-e选项,比如如下命令:


创建持久顺序节点

create -s /test/seq segText

创建临时节点

create -e /test/tmp tmpText

创建临时顺序节点

create -s -e /test/seqTmp setTmpText


创建成功:微信图片_20220625132754.png

如果你用PrettyZoo来创建的话,只要勾选一个选项即可。


作为注册中心使用


CAP是分布式架构中的重要理论,其包括一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)。我们经常使用的Eureka支持AP,而ZooKeeper支持CP。接下来我们学习下ZooKeeper在Spring Cloud中作为注册中心的应用。


ZooKeeper作为注册中心使用,用法基本和Eureka和Consul相同,首先我们需要在pom.xml中添加ZooKeeper的服务发现组件;


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>

之后修改配置文件application.yml,添加ZooKeeper相关配置;


spring:

cloud:

zookeeper:

# zookeeper连接地址

connect-string: localhost:2181

discovery:

# 作为服务注册

register: true

# 注册时使用IP地址而不是hostname

prefer-ip-address: true


这里还是使用《Spring Cloud学习教程》中的例子,有两个服务zookeeper-ribbon-service和zookeeper-user-service,前者通过Ribbon远程调用后者;


分别启动两个服务,我们通过PrettyZoo可以发现,当ZooKeeper作为注册中心时,注册服务的名称、IP、端口都被存储到了里面;


我们调用zookeeper-ribbon-service中的接口测试下,发现可以正常访问,接口地址:http://localhost:8301/user/1


如果这时候我们把zookeeper-user-service服务关掉的话,我们可以发现ZooKeeper会自动删除存储的数据;


由此可以看出,ZooKeeper作为微服务的注册中心是通过临时节点来实现的,当服务上线时会向ZooKeeper中注册,当服务下线时会被ZooKeeper删除,保障了微服务的高可用。


总结


今天我们学习了下ZooKeeper的安装、可视化工具PrettyZoo的使用以及ZooKeeper在Spring Cloud中作为注册中心的应用。其实ZooKeeper在分布式系统中还有很多应用,比如说做分布式锁、实现选主功能、取代UUID来生成唯一ID,大家感兴趣的话可以深入研究下!

13.png


参考资料

官方文档:https://zookeeper.apache.org/doc/current/zookeeperStarted.html

项目源码地址

https://github.com/macrozheng/springcloud-learning


12.png


目录
相关文章
|
存储 容灾 算法
深入理解Zookeeper系列-1.初识Zoookeeper
深入理解Zookeeper系列-1.初识Zoookeeper
189 0
QGS
|
存储 NoSQL Java
手拉手Centos7安装配置Redis7
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
QGS
604 0
|
3月前
|
缓存 监控 Java
说一说 SpringCloud Gateway 堆外内存溢出排查
我是小假 期待与你的下一次相遇 ~
420 5
|
4月前
|
边缘计算 弹性计算 人工智能
魔搭社区大模型一键部署到阿里云边缘云(ENS)
随着大模型技术的快速发展,业界的关注点正逐步从模型训练往模型推理 转变。这一转变不仅反映了大模型在实际业务中的广泛应用需求,也体现了技术优化和工程化落地的趋势。
449 7
|
消息中间件 存储 负载均衡
一文总结 MetaQ/RocketMQ 原理
本文介绍的 MetaQ/RocketMQ 是侧重于维持消息一致性和高可靠性的消息队列中间件,帮助大家对队列设计的理解。
|
7月前
|
Linux 开发者 异构计算
英特尔显卡+魔搭社区,一行命令快速部署本地大模型
英特尔显卡+魔搭社区,一行命令快速部署本地大模型
515 9
|
算法 架构师 安全
需求分析和常见的需求问题解决
需求分析和常见的需求问题解决
111464 17
|
NoSQL API Redis
Redis
Redis 是一个开源的、支持网络、可基于内存亦可持久化的日志型、key-value 数据库,它支持多种数据类型,如字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)等。Redis 提供了多种语言的 API,通常被称为数据结构服务器。
624 1
|
Oracle Java 关系型数据库
Win11 系统Java17的安装教程:最新版JDK 17.07下载、安装、卸载详解
Win11 系统Java17的安装教程:最新版JDK 17.07下载、安装、卸载详解
2901 0
|
存储 分布式计算 NoSQL
Java中的高效数据分析与处理平台实现
Java中的高效数据分析与处理平台实现

热门文章

最新文章