当前位置: 首页 > news >正文

ZooKeeper 集群搭建

文章目录

  • ZooKeeper 概述
  • 选举机制
  • 搭建前准备
  • 分布式配置
  • 分布式安装
    • 解压缩并重命名
    • 配置环境
    • 配置服务器编号
    • 配置文件
  • 操作集群
  • 编写脚本
  • 运行脚本
  • 搭建过程中常见错误

ZooKeeper 概述

Zookeeper 是一个开源的分布式服务协调框架,由Apache软件基金会开发和维护。以下是对Zookeeper的主要概述:

  1. 设计目标

    • 提供分布式环境中的数据一致性。
    • 为分布式应用程序提供协调服务。
    • 简化复杂分布式系统的构建和管理。
  2. 功能特性

    • 数据模型:Zookeeper使用一个树形结构的数据模型(Znode),每个节点可以存储数据并具有版本号。
    • 一致性保证:Zookeeper保证在客户端看到的数据是一致的,提供顺序一致性、原子性和单一系统映像等特性。
    • 分布式锁:通过临时节点和 watches(监视器)机制,Zookeeper可以实现分布式锁,确保在分布式环境中对共享资源的互斥访问。
    • 集群管理:Zookeeper可以用于管理集群中的节点,如监控节点状态、动态加入或移除节点。
    • 配置管理:应用程序可以在Zookeeper中存储和获取配置信息,使得配置变更能够快速传播到所有相关节点。
    • 命名服务:Zookeeper可以作为命名服务,为分布式系统中的资源提供唯一的标识符。
  3. 工作原理

    • Zookeeper集群由一组相互协作的服务器组成,这些服务器共同维护一个具有相同数据副本的内存数据库。
    • 客户端与Zookeeper集群进行交互,读取数据、写入数据或者注册 watches以监听数据变化。
    • Zookeeper通过投票机制实现容错和领导选举,确保在部分服务器故障时仍能提供服务。
  4. 应用场景

    • 在Hadoop和HBase等大数据处理框架中,Zookeeper用于管理集群状态和协调任务。
    • 作为服务发现工具,帮助微服务架构中的服务注册和发现。
    • 在分布式消息队列系统中,如Kafka,用于Broker和Consumer的协调。

总的来说,Zookeeper在分布式系统中扮演着关键的角色,通过提供可靠的数据管理和协调服务,简化了分布式应用程序的开发和运维。

选举机制

1)集群中半数以上机器存活,集群可用。所以 Zookeeper 一般安装奇数台服务器,因为假设有 2N + 1 台机器只要 N + 1 台存活,集群就可用,再加一台也还是 N + 1 台,并不会提高集群可用性能,浪费资源。

2)服务器具有4种状态,分别是LOOKINGFOLLOWINGLEADINGOBSERVING

  • LOOKING:寻找Leader状态。当服务器处于该状态时,当前集群中没有Leader,因此需要进入Leader选举状态。
  • FOLLOWING:跟随者状态。表明当前服务器角色是Follower
  • LEADING:领导者状态。表明当前服务器角色是Leader
  • OBSERVING:观察者状态。表明当前服务器角色是ObserverObserver不参与投票和选举过程。

3)选举过程:假设有五台服务器组成的 Zookeeper 集群,它们的 id1 - 5。如果这些服务器依序启动**(第一次启动)**

  • 服务器 1 启动,发起选举
    • 服务器先投给自己一票,然后判断是否过半,显然不够,选举无法完成,服务器 1 状态保持为 LOOKING
  • 服务器 2 启动,发起选举
    • 服务器 2 先投给自己一票,然后与最开始启动的服务器 1 进行通信,互相交换自己的选举结果, id 值更大的服务器 2 胜出,服务器 1 将选票改投给 服务器 2,此时服务器 10 票,服务器 22 票,还不够半数,选举无法完成,服务器状态 1、2 保持为 LOOKING
  • 服务器 3 启动,发起选举
    • 服务器 3 先投给自己一票,根据上述方法同理服务器 1、2 都会改投服务器 3,此时服务器 10 票,服务器 20 票,服务器 33 票,(3/5) 超过半数,服务器 3 当选为 Leader。服务器状态 1、2 更改状态为 FOLLOWDING,服务器 3 更改状态为 LEADING
  • 服务器 4 启动,发起选举
    • 服务器先投给自己一票,此时已经存在 Leader 了,服务器 1、2、3 不会再改投了。所以投票结果为:服务器 33 票,服务器 41 票。服务器 4 服从多数,更改状态为 FOLLOWING
  • 服务器 5 启动,发起选举
    • 与服务器 4 同理,更改状态为 FOLLOWING

搭建前准备

下载地址:Index of /dist/zookeeper (apache.org)

文档地址:Apache ZooKeeper

这里选择 Zookeeper-3.5.7 版本进行搭建,自行配置 JDK7 或更高版本

分布式配置

分布式配置与伪分布式配置,主要有以下区别,其余配置均相同:

  • 伪分布式所使用的端口必须不同,分布式端口可以相同。
  • 伪分布式统一使用一个IP,分布式需要根据当前网络IP配置。

以下为分布式与伪分布式配置对比(以3个服务器节点为例):这里选择分布式配置

配置伪分布式分布式
clienPort2181;2182;21832181;2181;2181
server.1127.0.0.1:2888:3888hadoop102:2888:3888
server.2127.0.0.1:2889:3889hadoop103:2888:3888
server.3127.0.0.1:2890:3890hadoop104:2888:3888

分布式安装

先在 hadoop102 上操作最后分发文件,改个 myid 就行,也可以使用 MultiExec 功能一次向所有终端发送命令

解压缩并重命名

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/
mv /opt/apache-zookeeper-3.5.7-bin /opt/zookeeper-3.5.7

配置环境

vim /etc/profile.d/zookeeper.sh

添加下述内容:

export ZOOKEEPER_HOME=/opt/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin

更新环境变量

source /etc/profile

配置服务器编号

hadoop102myid 设置为 1hadoop1032hadoop1043

mkdir -p $ZOOKEEPER_HOME/tmp/data
echo 1 > $ZOOKEEPER_HOME/tmp/data/myid

配置文件

$ZOOKEEPER_HOME/conf 这个目录下的 zoo_sample.cfg 复制为 zoo.cfg

cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg

修改配置

vim $ZOOKEEPER_HOME/conf/zoo.cfg

修改数据存储路径

dataDir=/opt/zookeeper-3.5.7/tmp/data

添加下述配置

server.1=hadoop102:2888:3888
server.2=hadoop103:2888:3888
server.3=hadoop104:2888:3888

下述配置参数含义

server.A=B:C:D
  • A 数字,表示这个是第几号服务器;即集群模式下配置的 myid
  • B 服务器的 IP 地址;
  • C 服务器与集群中的 Leader 服务器交换信息的端口;
  • D 当集群中的 Leader 服务器挂了,需要重新选举出一个新的 Leader 时,在这个端口进行服务器相互通信;
  • 2181:对外提供服务端口;
  • 2888:内部数据同步端口;
  • 3888:Leader 挂了,重新选举端口。

集群分发 zookeeper 目录和配置文件

xsync $ZOOKEEPER_HOME
xsync /etc/profile.d/zookeeper.sh

最后不要忘记去 hadoop102,hadoop104 上将 myid 改为 2,3 ,其他集群如果使用 $ZOOKEEPER_HOME 需要先 source /etc/profile 更新一下环境变量

[user@hadoop103 ~]$ echo 2 > $ZOOKEEPER_HOME/tmp/data/myid
[user@hadoop104 ~]$ echo 3 > $ZOOKEEPER_HOME/tmp/data/myid

操作集群

在每个服务器上启动 Zookeeper

[user@hadoop102 zookeeper-3.5.7]$ zkServer.sh start
[user@hadoop103 zookeeper-3.5.7]$ zkServer.sh start
[user@hadoop104 zookeeper-3.5.7]$ zkServer.sh start

使用 jpsall 查看进程,QuorumPeerMain 就是 Zookeeper 集群的启动入口类,用来加载配置启动 QuorumPeer 线程的

[user@hadoop102 ~]$ ./jpsall
=============== hadoop102 ===============
11507 QuorumPeerMain
12988 Jps
=============== hadoop103 ===============
14498 Jps
12887 QuorumPeerMain
=============== hadoop104 ===============
12471 Jps
11086 QuorumPeerMain

查看集群状态,按照半数选举机制三个服务器中第二个启动的集群就是 Leader

[user@hadoop102 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower[user@hadoop103 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader[user@hadoop104 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

此时可以尝试将 hadoop103 断掉按照投票机制应当是 hadoop104 当选 Leader

编写脚本

vim zk.sh

给执行权限

chmod 777 zk.sh

添加如下内容:

#!/bin/bashif [ $# -lt 1 ]
thenecho "No Args Input..."exit ;
ficase $1 in
"start")echo "=========== 启动 zookeeper 集群 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh start"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh start"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh start"
;;
"stop")echo "=========== 关闭 zookeeper 集群 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"
;;
"status")echo "=========== 查看 zookeeper 状态 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh status"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh status"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh status"
;;
*)echo "Input Args Error..."
;;
esac

运行脚本

1)启动 zookeeper 集群

./zk.sh start=========== 启动 zookeeper 集群 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

2)查看集群各服务器状态

./zk.sh status=========== 查看 zookeeper 状态 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

3)关闭 zookeeper 集群

./zk.sh stop=========== 关闭 zookeeper 集群 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

搭建过程中常见错误

Zookeeper 集群搭建过程中常见错误-CSDN博客

相关文章:

ZooKeeper 集群搭建

文章目录 ZooKeeper 概述选举机制搭建前准备分布式配置分布式安装解压缩并重命名配置环境配置服务器编号配置文件 操作集群编写脚本运行脚本搭建过程中常见错误 ZooKeeper 概述 Zookeeper 是一个开源的分布式服务协调框架,由Apache软件基金会开发和维护。以下是对Z…...

Meson:现代的构建系统

Meson是一款现代化、高性能的开源构建系统,旨在提供简单、快速和可读性强的构建脚本。Meson被设计为跨平台的,支持多种编程语言,包括C、C、Fortran、Python等。其目标是替代传统的构建工具,如Autotools和CMake,提供更简…...

【大模型AIGC系列课程 5-2】视觉-语言大模型原理

重磅推荐专栏: 《大模型AIGC》;《课程大纲》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在…...

震惊!难怪别人家的孩子越来越聪明,原来竟是因为它

前段时间工作调动给孩子换了个新学校,刚开始担心她不能适应新学校的授课方式,但任课老师对她评价很高,夸她上课很专注。 为了训练孩子的专注力,作为家长可没少下功夫,画画,下五子棋等益智游戏的兴趣班没少…...

Linux操作系统(UMASK+SUID+SGID+STICK)

UMASK反掩码 如何查看反掩码:直接在终端窗口运行 umask root用户反掩码:0022 普通用户反掩码:0002 UMASK的作用:确定目录,文件的缺省权限值 以root身份创建目录,观察目录的9位权限值 以root身份创建普通文件…...

Java 中单例模式的常见实现方式

目录 一、什么是单例模式? 二、单例模式有什么作用? 三、常见的创建单例模式的方式 1、饿汉式创建 2、懒汉式创建 3、DCL(Double Checked Lock)双检锁方式创建 3.1、synchronized 同步锁的基本使用 3.2、使用 DCL 中存在的疑…...

【C语言】自定义类型之联合和枚举

目录 1. 前言2. 联合体2.1 联合体类型的声明2.2 联合体的特点2.3 相同成员的结构体和联合体对比2.4 联合体大小的计算2.4 判断当前机器的大小端 3. 枚举3.1 枚举类型的声明3.2 枚举类型的优点3.3 枚举类型的使用 1. 前言 在之前的博客中介绍了自定义类型中的结构体,…...

使用Mosquitto/python3进行MQTT连接

一、简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。 …...

JavaWeb笔记之前端开发HTML

一、引言 1.1HTML概念 网页,是网站中的一个页面,通常是网页是构成网站的基本元素,是承载各种网站应用的平台。通俗的说,网站就是由网页组成的。通常我们看到的网页都是以htm或html后缀结尾的文件,俗称 HTML文件。 …...

通过IP地址定位解决被薅羊毛问题

随着互联网的普及,线上交易和优惠活动日益增多,这也为一些不法分子提供了可乘之机。他们利用技术手段,通过大量注册账号或使用虚假IP地址进行异常操作,以获取更多的优惠或利益,这种行为被称为“薅羊毛”。对于企业和平…...

Leetcode 122 买卖股票的最佳时机 II

题意理解: 已知:一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格 如何哪个时间点买入,哪个时间点卖出,多次交易,能够收益最大化 目的:收益最大化 解题思路: 使用贪心…...

音频文件合成

音频文件合成 音频文件合成 http://ffmpeg.org/download.html https://blog.csdn.net/u013314786/article/details/89682800 http://www.360doc.com/content/19/0317/01/10519289_822112563.shtml https://chaijunkun.blog.csdn.net/article/details/116491526?spm1001.210…...

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞 2023/12/20 17:19 简略步骤:rootrootrootroot-X99-Turbo:~/3TB$ tar --use-compress-programpigz -xvpf rk3399-android-10.git-20210201.tgz rootrootro…...

vivo 容器平台资源运营实践

作者:vivo 互联网服务器团队 - Chen Han 容器平台针对业务资源申请值偏大的运营问题,通过静态超卖和动态超卖两种技术方案,使业务资源申请值趋于合理化,提高平台资源装箱率和资源利用率。 一、背景 在Kubernetes中,容…...

ASP.NET Core面试题之Redis高频问题

🎈🎈在.NET后端开发岗位中,如今也少不了、微服务、分布式、高并发高可用相关的面试题🎈🎈 👍👍本文分享一些整理的Redis高频面试题🎉 👍👍机会都是给有准备…...

【教程】Ubuntu基本软件安装

文章目录 一、搜狗输入法安装二、百度网盘安装三、划词翻译 一、搜狗输入法安装 全网最准确的Ubuntu 20.04 安装搜狗输入法的步骤 二、百度网盘安装 百度云盘for Linux安装教程和体验 三、划词翻译 ubuntu最好用的划词翻译词典:有道词典和GoldenDict...

Jenkins 构建环境指南

目录 Delete workspace before build starts(常用) Use secret text(s) or file(s) (常用) Add timestamps to the Console Output (常用) Inspect build log for published build scans Terminate a …...

基于Go语言的HTTP路由设计与实现

在Go语言的世界里,HTTP路由是一种将HTTP请求映射到相应处理函数的技术。通过路由,我们可以确定当用户发送一个HTTP请求时,应该调用哪个函数来处理该请求。在这个过程中,我们可以使用多种方法来实现路由设计,下面我将以…...

SpringMVC01

SpringMVC 1. 学习⽬标2. 什么叫MVC?3. SpringMVC 框架概念与特点4. SpringMVC 请求流程5. Spring MVC 环境搭建6. URL 地址映射配置7. 参数绑定8. JSON 数据开发JSON普通数组步骤1:pom.xml添加依赖步骤2: 修改配置⽂件步骤3. 注解使⽤ 1. 学习⽬标 2. 什…...

基于Redis限流(aop切面+redis实现“令牌桶算法”)

令牌桶算法属于流量控制算法,在一定时间内保证一个键(key)的访问量不超过某个阈值。这里的关键是设置一个令牌桶,在某个时间段内生成一定数量的令牌,然后每次访问时从桶中获取令牌,如果桶中没有令牌&#x…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

【C++进阶篇】智能指针

C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...