Zookeeper 安装教程和使用指南

news2024/9/21 5:43:26

一、Zookeeper介绍

ZooKeeperApache 软件基金会的一个开源项目,主要基于 Java 语言实现。
Apache ZooKeeper 是一个开源的分布式应用程序协调服务,提供可靠的数据管理通知、数据同步、命名服务、分布式配置服务、分布式协调等服务。

关键特性

  • 分布式协调ZooKeeper提供了一个简单的架构,可以解决分布式应用中遇到的一些最复杂的问题,例如总线死锁、互斥锁、同步和组多播通信。
  • 高性能ZooKeeper旨在存储小数据量,可以完成大量的读取以及少量的写入。数据保存在内存中,因此 ZooKeeper 可以快速提供响应。
  • 高可用性ZooKeeper使用复制来提高可用性和存储数据的稳健性。它的所有写操作都会复制到配置的所有服务器。
  • 一致性:客户端将看到相同的服务端视图,因为更新都是有序并且一致的。即使在发生更改时,所有的写操作都会有全局有序。
  • 事务性:一旦更新成功,更改将持久化,直到新的更新覆盖它。

应用场景

  • 配置管理ZooKeeper可以为分布式应用提供统一的配置存储服务,当配置信息更新时,可以实时推送给所有相关的应用实例,这样就可以确保所有实例的配置信息都是一致的。
  • 集群管理ZooKeeper是分布式环境中的一种集群管理解决方案。它可以记录和监控节点信息,比如节点状态(在线、离线、空闲等),一旦某个节点发生异常,它可以进行及时通知。
  • 命名服务ZooKeeper提供了类似于文件系统的树状名称空间,可以实现分布式中的命名服务,每一次命名服务的改变都会被 ZooKeeper用事务的方式记录下来,从而保证命名服务的一致性。
  • 选举系统:在许多分布式算法中,如 PaxosRaft 等,都需要进行一种选举策略以确保在群体中能选出一个高效可靠的领导者,ZooKeeper提供了这样的机制。
  • 分布式队列ZooKeeper可以用于实现分布式队列,队列中的元素按照 FIFO(First-In-First-Out)的顺序进行出队。这在分布式环境中的任务分配上有很大的用处。
  • 分布式协调/同步(分布式锁):在分布式系统中,往往需要协调或同步各个节点的操作。ZooKeeper 的锁和条件变量可以使得分布式应用之间能够进行精细的同步控制。

开源项目

  • Hadoop : ZooKeeper 为 Namenode 提供高可用支持。
  • Kafka : ZooKeeper 主要为 Kafka 提供 Broker 和 Topic 的注册以及多个 Partition 的负载均衡等功能。
  • Hbase : ZooKeeper 为 Hbase 提供确保整个集群只有一个 Master 以及保存和提供 regionserver 状态信息(是否在线)等功能。

二、安装教程

下载说明

Zookeeper github:https://github.com/apache/zookeeper/tags
Zookeeper 官方地址:https://zookeeper.apache.org/releases.html

需要说明一下,打开官方地址后可以看到每个版本下面有两个下载链接,下载包分别对于bin和不带bin的版本:
在这里插入图片描述

从 github 的 readme 中,可以看到关于 apache-zookeeper-[version].tar.gzapache-zookeeper-[version]-bin.tar.gz 版本差别说明如下:

apache-zookeeper-[version].tar.gz

    Contains all the source files which can be built by running:
    mvn clean install

    To generate an aggregated apidocs for zookeeper-server and zookeeper-jute:
    mvn javadoc:aggregate
    (generated files will be at target/site/apidocs)

apache-zookeeper-[version]-bin.tar.gz

    Contains all the jar files required to run ZooKeeper
    Full documentation can also be found in the docs folder

可以看到:

  • apache-zookeeper-[version]-bin.tar.gz 包含所有的jar文件
  • apache-zookeeper-[version].tar.gz包含源码不包含jar文件,需要安装maven,然后再运行mvn clean install 和mvn javadoc:aggregate。

为了方便,下文均为基于 bin 安装包的说明
PS:编译安装参阅:使用C/C++ API接口操作 Zookeeper 数据

安装说明

# 下载和解压
[root@Ali ~]# wget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz
[root@Ali ~]# tar xzvf apache-zookeeper-3.9.2-bin.tar.gz
[root@Ali ~]# mv apache-zookeeper-3.9.2-bin /usr/local/zookeeper
[root@Ali ~]# cd /usr/local/zookeeper/
[root@Ali zookeeper]# ls
bin  conf  docs  lib  LICENSE.txt  logs  NOTICE.txt  README.md  README_packaging.md

# 配置用户环境变量
[root@Ali zookeeper]# vim ~/.bash_profile
PATH=$PATH:/usr/local/zookeeper/bin/
export PATH

配置说明

单机模式

单机模式 (Standalone Mode) 下,只有一个 ZooKeeper 服务器负责处理客户端的所有请求。但是,如果该 ZooKeeper 服务器失败了,那么整个 ZooKeeper 服务就不可用。因此,这种模式通常用于开发和测试环境。

使用 单机模式 需要一个 zoo.cfg 配置文件,可以直接在conf目录下拷贝和修改 zoo_sample.cfg

[root@Ali zookeeper]# cp conf/zoo_sample.cfg conf/zoo.cfg
[root@Ali zookeeper]# vim conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper/data
dataLogDir=/srv/zookeeper3/trans_logs
clientPort=2181

参数说明

tickTime: 基本时间单位(毫秒)。服务器之间维持心跳的时间间隔为1个 tickTime
dataDir: 存储内存中数据库快照的位置。
dataLogDir : 记录写事件的事务日志,默认写到 dataDir 目录下。
clientPort: 客户端连接端口号

集群模式

集群模式 (Quorum Mode) 下,ZooKeeper 运行在一个服务器集群中,集群中的任何一台机器都可以处理客户端的请求。如果某个服务器故障,其余的服务器仍然可以提供服务,这就实现了高可用。而且,这种模式也能保证强一致性。因为只有当过半的服务器同意进行某个操作,才能进行该操作。因此,这种模式主要用在生产环境。

集群模式 至少需要三台服务器,强烈建议您使用奇数台服务器。如果只有两台服务器,那么如果其中一台出现故障,则没有足够的机器来形成多数仲裁。两台服务器本质上不如一台服务器稳定,因为有两个单点故障。

伪集群模式 (Pseudo-distributed Mode) :指在一台机器上启动多个 ZooKeeper 服务(每个服务使用不同的配置和端口),模拟 ZooKeeper 的集群模式。
这种模式中,每个 ZooKeeper 实例都以为自己是在不同的机器上运行。通常,每个实例都会有自己的配置文件,指定自己的客户端通讯端口、服务器的通信端口、数据和日志的存储位置等等,这些都需要区别于其他实例。并且,每个实例的配置文件还需要列出所有的 ZooKeeper 服务实例,包括他自己,来模拟集群中服务器间的通讯。

如下以 伪集群模式 的部署3个实例

# 实例1
[root@Ali ~]# cd /usr/local/zookeeper/
[root@Ali zookeeper]# vim data/myid
1
[root@Ali zookeeper]# vim conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/trans_logs
clientPort=12181

server.1=127.0.0.1:12888:13888
server.2=127.0.0.1:22888:23888
server.3=127.0.0.1:32888:33888

# 实例2

[root@Ali ~]# cd /srv/zookeeper2/
[root@Ali zookeeper3]# vim data/myid
2
[root@Ali zookeeper3]# vim conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/srv/zookeeper2/data
dataLogDir=/srv/zookeeper2/trans_logs
clientPort=22181

server.1=127.0.0.1:12888:13888
server.2=127.0.0.1:22888:23888
server.3=127.0.0.1:32888:33888

# 实例3
[root@Ali ~]# cd /srv/zookeeper3/
[root@Ali zookeeper3]# vim data/myid
3
[root@Ali zookeeper3]# vim conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/srv/zookeeper3/data
dataLogDir=/srv/zookeeper3/trans_logs
clientPort=32181

server.1=127.0.0.1:12888:13888
server.2=127.0.0.1:22888:23888
server.3=127.0.0.1:32888:33888

参数说明

data/myid:服务唯一ID,必须是ASCII码的一个数值。
initLimit:这是用于限制 ZooKeeper 服务器与集群中 Leader 服务器初次建立连接时的尝试次数,如果在 tickTime * initLimit 时间内无法建立连接,则该服务器退出选举过程。这个参数的值通常大于 3。
syncLimit:这是用于限制 ZooKeeper 服务器与集群中 Leader 服务器同步数据时的尝试次数,如果在 tickTime * syncLimit 时间内无法完成数据同步,则该服务器将停止与 Leader 的同步连接。这个参数的值通常大于 2。
server.X=A:B:C:包含4个参数,参数含义分别为

  • X :每台 ZooKeeper 服务器的唯一编号必须和 myid 一致,这些服务器组成了 ZooKeeper 服务集群。
  • A :该服务器的主机名
  • BZooKeeper 服务器之间的数据通信端口号
  • CZooKeeper 服务器之间的选举 Leader 的端口号

三、使用指南

服务端使用说明

[root@Ali ~]# zkServer.sh version
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Apache ZooKeeper, version 3.9.2 2024-02-12 20:59 UTC

[root@Ali ~]# zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone

[root@Ali ~]# zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[root@Ali ~]# zkServer.sh stop
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

更多工具说明详见: Zookeeper管理员工具

客户端使用说明

# 连接服务端
[wengjianhong@Ali ~]$ zkCli.sh -server 127.0.0.1:12181

# 查看命令
[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
	

# 查看版本
[zk: 127.0.0.1:2181(CONNECTED) 2] version
ZooKeeper CLI version: 3.9.2-e454e8c7283100c7caec6dcae2bc82aaecb63023, built on 2024-02-12 20:59 UTC

# 创建节点
[zk: 127.0.0.1:2181(CONNECTED) 3] create /init_date "20240520"
Created /init_date

# 查看节点
[zk: 127.0.0.1:2181(CONNECTED) 4] get /init_date
20240520

# 删除节点
[zkshell: 2] delete /config/topics/test
[zkshell: 3] ls /config/topics/test
	Node does not exist: /config/topics/test

更多客户端命令,参阅: Zookeeper客户端

推荐阅读:

  • Zookeeper官方文档
  • Zookeeper中文文档
  • Zookeeper程序开发指南
  • 史上最全的Zookeeper原理详解(万字长文)

下一篇:使用C/C++ API 接口操作 Zookeeper数据

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《王者荣耀》4月狂揽2.34亿美元 单日流水1亿美元 全球销量第二

易采游戏网5月24日消息,在刚刚过去的四月,全球手游市场迎来了一场收益的盛宴,其中《王者荣耀》以其惊人的吸金能力,以2.34亿美元的月收入在全球手游排行榜上位列第二。4月5日,这款由腾讯游戏开发的多人在线战斗竞技游戏…

JS、Go、Rust 错误处理的不同 - JS 可以不用 Try/Catch 吗?

原文:Mateusz Piorowski - 2023.07.24 先来了解一下我的背景吧。我是一名软件开发人员,有大约十年的工作经验,最初使用 PHP,后来逐渐转向 JavaScript。 大约五年前,我开始使用 TypeScript,从那时起&#…

10、SpringBoot 源码分析 - 自动配置深度分析三

SpringBoot 源码分析 - 自动配置深度分析三 refresh和自动配置大致流程AutoConfigurationImportSelector的getAutoConfigurationEntry获取自动配置实体(重点)AutoConfigurationImportSelector的getCandidateConfigurations获取EnableAutoConfiguration类型的名字集合AutoConfig…

一个超级简单的Python UI库:NiceGUI

大家好,图形用户界面(GUI)的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言,提供了许多优秀的库来帮助开发者实现这一目标。今天,我们将介绍一个名为NiceGUI的库,它能帮助你轻松构建…

基于Tensorflow+Keras的卷积神经网络(CNN)人脸识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别是计算机视觉领域的一个重要研究方向,广泛应用于安全监控、身份验证、人机…

弘君资本股市资讯:深夜,利空突袭!美股大跳水!

昨夜,两大利空音讯突袭美股。 隔夜,最新披露的两则数据引发商场忧虑。其一是,美国5月Markit归纳PMI初值报54.4,创25个月新高,大幅高于预期的51.2,前值为51.3;其二是,在到5月18日的一…

05Django项目--前端公共文件和其他html文件的适配

对应视频链接点击直达 Django项目--前端公共文件和其他html文件的适配 对应视频链接点击直达前端页面准备Pubilc页面设置 OVER,不会有人不会吧不会的加Q1394006513结语 接着上一节 前端页面准备 为了方便大家更好的复制,我把整个项目及templates文件夹和…

docker如何拉取redis最新镜像并运行

要拉取Docker Hub上最新版本的Redis镜像,您可以使用以下命令: docker pull redis:latest 这里的latest标签会自动获取Redis镜像的最新版本。如果您希望指定一个确切的版本号,可以直接使用该版本号替换latest。例如,要拉取Redis版…

C++ (week5):Linux系统编程2:进程

文章目录 二、进程1.CPU的虚拟化2.进程命令(1)ps 3.进程的基本操作 (API)(1)获取进程的标识 (获得进程id):getpid、getppid(2)创建进程:fork()(3)终止进程:exit()、_exit()、abort()、wait()、waitpid()①正常终止:exit()、_exit(…

Redis 源码学习记录:散列 (dict)

散列 Redis 源码版本:Redis-6.0.9,本篇文章的代码均在 dict.h / dict.c 文件中。 散列类型可以存储一组无需的键值对,他特别适用于存储一个对象数据。 字典 Redis 通常使用字典结构体存储用户散列数据。字典是 Redis 的重要数据结构。除了散…

AGM AG32 (MCU + FPGA)在音频处理上的应用案例

AGM AG32 (MCU FPGA)在音频处理,比如语音识别、降噪、声音增强等方面上的应用很多,结合AG32的特点,这里做一个简单的分享。 AGM AG32的架构是FPGA MCU,并且AG32与STM32的关键兼容,这个低成本的AG32器件,在…

MongoDB基础入门到深入(八)MongoDB整合SpringBoot、Chang Streams

文章目录 系列文章索引十五、MongoDB整合SpringBoot1、环境准备2、集合操作3、文档操作(1)相关注解(2)创建实体(3)添加文档(4)查询文档(5)更新文档&#xff0…

paligemma、Grounding-DINO-1.5简单无需标注无需训练直接可以使用的VLM图像到文本模型

1、paligemma 参考:https://github.com/google-research/big_vision/blob/main/big_vision/configs/proj/paligemma/README.md 模型架构: 文本与图像特征一起送入大模型 在线体验网址: https://huggingface.co/spaces/big-vision/paligemma 通过文字prompt既可与图片对话…

工行音视频服务平台建设与应用经验

近些年来,伴随着技术能力的积累突破,音视频服务开始蓬勃生长走进千家万户,使用远程视频通话、观看各类视频直播逐渐成为人们的日常,而金融服务作为社会生活的重要组成部分,自然需要积极拥抱应用新技术。 如今&#xff…

目标检测——无人机垃圾数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

【C++入门】—— C++入门 (下)_内联函数

前言:在了解完前面的C基础内容后,马上我们就要真正不如C的学习了,但在之前让我们最后了解最后一点点C入门知识!来迟的520特别篇! 本篇主要内容: 内联函数 auto关键字 范围for 指针空值nullptr C入门 1. 内联…

Science| 单体耦合纤维实现无芯片纺织电子(纤维器件/智能织物/柔性可穿戴电子)

东华大学Hongzhi Wang,Chengyi Hou和Qinghong Zhang团队在《Science》上发布了一篇题为“Single body-coupled fiber enables chipless textile electronics”的论文。论文内容如下: 一、 摘要 智能纺织品为将技术融入日常生活中提供了理想的平台。然而,目前的纺织电子系统…

飞凌嵌入式亮相上海CPSE,展现智能充储技术新力量

5月22日~24日,第三届上海国际充电桩及换电站展览会(CPSE)在上海汽车会展中心举行,飞凌嵌入式以“聚焦充电桩主控智造赋能车桩智联”为主题参展,与来自全国的客户朋友及行业伙伴一同交流分享,展位号Z15。 作为国内较早从事嵌入式技…

HTTPS:安全网络通信的基石

在数字化时代,网络通信的安全变得至关重要。HTTPS(超文本传输安全协议)是一种用于保护网络通信的协议,它通过加密技术确保数据传输的安全性和完整性。下面我们就来了解一下HTTPS。 一、HTTPS是什么? HTTPS是HTTP&…

罗德与施瓦茨FPS7频谱分析仪怎么判断真实信号?

频谱分析仪是电子测量领域的重要仪器,可以帮助工程师、研究人员分析信号的频域特性,为设备调试、故障诊断等提供有价值的数据支持。作为业界领先的频谱分析仪制造商,罗德与施瓦茨的FPS7型号在精度、灵敏度和分辨率等指标上都有出色表现&#…