搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供了高效且可靠的分布式协调服务,并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建,是Google Chubby的开源实现。

分布式应用可以基于ZooKeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁、分布式队列等功能。在越来越多的分布式系统(Hadoop、HBase、Storm、Kafka)中,Zookeeper都作为核心组件使用。

一、准备工作

  • 虚拟机相关:
    VMware workstation 16:虚拟机 > vmware_177981.zip
    CentOS Stream 9:虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso

    如果操作系统是win11或者win10家庭版,推荐使用VMware workstation 17版本,网盘地址为:虚拟机 > vmware_17。

  • JDK
    jdk1.8:JDK > jdk-8u261-linux-x64.tar.gz

  • Zookeeper

    Zookeeper > apache-zookeeper-3.8.4-bin.tar.gz

  • 辅助工具
    MobaXterm:MobaXterm_Portable_v24.0.zip

本文相关资源可以在文末提供的百度网盘资源中下载,除了vmware(你懂的…),以上资源均来源于官网,MobaXterm是便捷式软件,无需安装。

CentOS的安装、虚拟机克隆、集群网络环境配置可参考 搭建Hadoop3.x完全分布式集群(CentOS 9)安装准备部分。

二、搭建完全分布式集群

Zookeeper的部署方式分为:

  • 独立模式(单机模式)
  • 集群模式
    • 伪分布式模式
    • 完全分布模式

本文介绍实际应用场景中的使用的完全分布模式的部署,生产环境一般采用奇数台(大于1)机器组成集群。

ZK节点为什么设置为奇数?

zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。

也就是说如果有2个zookeeper,那么只要有1个服务停止,zookeeper就不能对外提供服务,所以2个zookeeper的死亡容忍度为0;

同理,要是有3个zookeeper, 1个服务停止,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;

同理:2 -> 0; 3 -> 1; 4 - >1; 5 -> 2; 6 -> 2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,会选择奇数台组成集群。

在进行下面步骤之前,确保已经安装好虚拟机hadoop1、hadoop2、hadoop3,并且已经完成集群的网络环境配置和JDK的安装。

1. 安装Zookeeper

将zookeeper安装包上传至hadoop1虚拟机/software目录,运行下面命令解压安装:

tar -xvf /software/apache-zookeeper-3.8.4-bin.tar.gz -C /opt
cd /opt
mv apache-zookeeper-3.8.4-bin/ zookeeper-3.8.4

修改配置文件 vi /etc/profile ,添加如下内容:

export ZK_HOME=/opt/zookeeper-3.8.4
export PATH=$PATH:$ZK_HOME/bin

运行source /etc/profile更新环境变量

2. 修改配置文件

进入虚拟机Hadoop1中ZooKeeper安装目录的conf目录,通过复制ZooKeeper模板文件zoo_sample.cfg创建文件zoo.cfg,再编辑文件zoo.cfg:

cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

修改相应的配置项

#设置数据持久化目录
dataDir=/opt/data/zookeeper/zkdata
#设置客户端连接当前ZooKeeper服务使用的端口号
clientPort=2181
#设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888

参数说明:

参数默认值说明
tickTime2000Client-Server通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
initLimit10Leader-Follower初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
syncLimit5Leader-Follower同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
dataDir/tmp/zookeeper数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
clientPort2181客户端连接端口
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
maxClientCnxns60最多支持的客户端连接数
server.id=host:port:port集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B, 其中N用来表示服务器在集群中的一个序号,我们需要在dataDir目录下创建一个文件myid, 文件内容为对应的编号N
A为端口号,集群内机器通讯使用(只有Leader监听此端口
B为端口号,用于选举Leader使用(每个Zookeeper都监听此端口)

关于参数的更多信息可参考:https://zookeeper.apache.org/doc/r3.7.0/zookeeperAdmin.html#sc_configuration

3. 创建数据持久化目录

根据文件zoo.cfg中参数dataDir指定的值,在虚拟机Hadoop1下执行以下命令,创建数据持久化目录。

mkdir -p /opt/data/zookeeper/zkdata
ssh hadoop2 "mkdir -p /opt/data/zookeeper/zkdata"
ssh hadoop3 "mkdir -p /opt/data/zookeeper/zkdata"

4. 创建myid文件

在虚拟机Hadoop1主机执行以下命令,在数据持久化目录/opt/data/zookeeper/zkdata创建myid文件并分别写入值1、2、3。

echo 1 > /opt/data/zookeeper/zkdata/myid
ssh hadoop2 "echo 2 > /opt/data/zookeeper/zkdata/myid"
ssh hadoop3 "echo 3 > /opt/data/zookeeper/zkdata/myid"

myid文件标识了该服务器在集群中的唯一ID号,该文件内容就是对应的ID号。

ID大小介于1至255,如果开启了扩展特征,比如TTL节点,ID需要介于1至254

5. 分发Zookeeper和环境变量

scp -r  /opt/zookeeper-3.8.4   hadoop2:/opt/
scp -r  /opt/zookeeper-3.8.4   hadoop3:/opt/
scp -r /etc/profile hadoop2:/etc
scp -r /etc/profile hadoop3:/etc

6. 启动zookeeper集群

在虚拟机Hadoop1上执行以下命令启动ZooKeeper服务。

zkServer.sh start
ssh hadoop2 "source /etc/profile && zkServer.sh start"
ssh hadoop3 "source /etc/profile && zkServer.sh start"

7. 查看启动状态

在虚拟机Hadoop1上执行以下命令查看ZooKeeper集群运行状态。

zkServer.sh status
ssh hadoop2 "source /etc/profile && zkServer.sh status"
ssh hadoop3 "source /etc/profile && zkServer.sh status"

在这里插入图片描述

8. 集群服务管理脚本

在虚拟机hadoop1上执行下面的命令,编写zookeeper集群服务管理脚本

cd /opt/zookeeper-3.8.4/bin
touch xzkServer.sh
chmod +x xzkServer.sh
vi xzkServer.sh

编辑如下脚本内容

#!/bin/bash
for host in hadoop1 hadoop2 hadoop3
docase $1 in"start"){echo "                                               "echo "--------------- 启 动 zookeeper ---------------"echo "------------ $host zookeeper -----------"ssh $host "source /etc/profile && zkServer.sh start"};;"stop"){echo "                                               "echo "--------------- 关 闭 zookeeper ---------------"echo "------------ $host zookeeper -----------"ssh $host "source /etc/profile && zkServer.sh stop"};;"status"){echo "                                               "echo "-------------- 查看zookeeper状态 --------------"echo "------------ $host zookeeper -----------"ssh $host "source /etc/profile && zkServer.sh status"};;esac
done

三、常见问题及解决办法

1. 端口被占用

错误提示:Address already in use

解决办法:

  • 一方面,可以选择停止掉现在占用端口的进程,使用命令netstat -nltp 并结合命令grep进行查询

  • 另一方面,可以修改zoo.cfg,改变端口号

2. 磁盘空间不够

错误提示:No space left on device

解决办法:清磁盘或者磁盘

3. 无法找到myid文件

错误提示:myid file is missing

解决办法:在dataDir对应的目录中创建myid文件,并设置正确的内容(服务器对应的id)

4. 集群中其他机器Leader选举端口未开

错误提示:Cannot open channel to 2 at election address /xxx.xxx.xxx.xxx:3888

解决办法:

  • 检查各服务器防火墙是否关闭,使用命令sudo ufw status

  • 检查各服务器/etc/hosts中的内容是否一致,是否配置了所有节点的ip

  • 检查各服务器的时间是一致

  • 修改各服务器的zoo.cfg,将各自服务器中对应于自己的集群信息中的host修改成0.0.0.0

    比如对示例中的服务器node1,将其zoo.cfg的集群信息修改成

    server.1=0.0.0.0:2888:3888
    server.2=hadoop2:2888:3888
    server.3=hadoop3:2888:3888
    

5. 最直接最高效的解决办法是分析日志文件

附、网盘资源

链接:https://pan.baidu.com/s/1MSUdwbPArIAglQTDRhOjrg?pwd=jiau
提取码:jiau

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

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

相关文章

Vue的生命周期的详解

Vue的生命周期是每个使用Vue框架的前端人员都需要掌握的知识,以此作为记录。 Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

树莓派4B+Debian(Raspbian)+开机自启动Python文件

非系统全面的教程&#xff0c;只是记录操作过程中的问题和解决方案。 说明1&#xff1a;树莓派的不同版本&#xff0c;要查看CPU的位数、内存大小&#xff1b;从而确定安装的raspbian的对应版本 若是对应64位的OS&#xff0c;安装成了32位的OS&#xff0c;可能会对系统中安装…

5、JVM-G1详解

G1收集器 -XX:UseG1GC G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;&#xff0c;JVM目标…

代码学习记录25---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

书生·浦语大模型全链路开源体系-第4课

书生浦语大模型全链路开源体系-第4课 书生浦语大模型全链路开源体系-第4课相关资源XTuner 微调 LLMXTuner 微调小助手认知环境安装前期准备启动微调模型格式转换模型合并微调结果验证 将认知助手上传至OpenXLab将认知助手应用部署到OpenXLab使用XTuner微调多模态LLM前期准备启动…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…

命令模式

命令模式&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 命令模式的好处&#xff1a; 1、它能较容易地设计一个命令队列&#xff1b; 2、在需要的情况下&a…

gpt-6有望成为通用工具

OpenAI CEO山姆奥特曼&#xff08;Sam Altman&#xff09;在最新的博客访谈中&#xff0c;提到gpt-6有望成为通用工具。 奥特曼还认为&#xff0c;目前的模型不够聪明&#xff0c;“使用GPT-2进行科学研究曾被认为是不切实际的想法。而如今&#xff0c;虽然人们使用GPT-4进行科…

获取公募基金净值【数据分析系列博文】

摘要 从指定网址获取公募基金净值数据&#xff0c;快速解析并存储数据。 &#xff08;该博文针对自由学习者获取数据&#xff1b;而在投顾、基金、证券等公司&#xff0c;通常有Wind、聚源、通联等厂商采购的数据&#xff09; 导入所需的库&#xff1a;代码导入了一些常用的库…

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段&#xff1a; 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;并通过argparse设置了输入图像和面部标记预测器的参数。…

ns3.36以后的版本中_ns3命令的原理_CMAKE的使用以及一些例子

本文主要来自于ns3的官方文档&#xff1a;4.3. Working with CMake — Manual&#xff0c;不过只包含以下部分&#xff1a; 4.3. 使用CMake 4.3.1. 配置项目 4.3.1.1. 使用ns3配置项目 4.3.1.2. 使用CMake配置项目 4.3.2. 手动刷新CMake缓存 4.3.3. 建设项目 4.3.3.1. 使用ns3…

生活中的洪特规则

不知道你还记不记得高中物理所学的一个奇特的物理规则&#xff1a;洪特规则。 洪特规则是德国人弗里德里希洪特&#xff08;F.Hund&#xff09;根据大量光谱实验数据总结出的一个规律&#xff0c;它指出电子分布到能量简并的原子轨道时&#xff0c;优先以自旋相同的方式分别占…

企业网站制作如何被百度收录

1、网站在百度中的整体评分 说俗点就是网站的权重&#xff0c;在优化过程中我们会见到很多网站出现秒收的情况&#xff0c;发布的文章几分钟就可以收录&#xff0c;这个通过SITE语法都可以去查询&#xff0c;那么这跟自己的网站权重以及内容更新习惯是有非常重要的关联。 我们…

【函数式接口使用✈️✈️】通过具体的例子实现函数结合策略模式的使用

目录 前言 一、核心函数式接口 1. Consumer 2. Supplier 3. Function,> 二、场景模拟 1.面向对象设计 2. 策略接口实现&#xff08;以 Function 接口作为策略&#xff09; 三、对比 前言 在 Java 8 中引入了Stream API 新特性&#xff0c;这使得函数式编程风格进…

【IoTDB 线上小课 02】开源增益的大厂研发岗面经

还有友友不知道我们的【IoTDB 视频小课】系列吗&#xff1f; 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源...给我们 5 分钟&#xff0c;持续学习&#xff0c;干货满满~ 5分钟学会 大厂研发岗面试 之前的第一期小课&#xff0c;我们听了 I…

1.总结串口的发送和接收功能使用到的函数2.总结DMA的作用,和DMA+空闲中断的使用方式3.使用PWM+ADC光敏电阻完成光控灯的实验

1.总结串口的发送和接收功能使用到的函数 串口发送函数&#xff1a;HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) UART_HandleTypeDef *huart&#xff1a;指定要使用的串口 const uint8_t *pData&…

爬虫入门——Request请求

目录 前言 一、Requests是什么&#xff1f; 二、使用步骤 1.引入库 2.请求 3.响应 三.总结 前言 上一篇爬虫我们已经提及到了urllib库的使用&#xff0c;为了方便大家的使用过程&#xff0c;这里为大家介绍新的库来实现请求获取响应的库。 一、Requests是什么&#xff1…

如何确保美国站群服务器的安全性?

选择服务器安全性很重要&#xff0c;那么如何确保美国站群服务器的安全性&#xff0c;rak部落小编为您整理发布如何确保美国站群服务器的安全性。 确保美国站群服务器的安全性&#xff0c;您可以采取以下措施&#xff1a; - **定期更新和升级**&#xff1a;保持服务器操作系统和…

基于Python大数据的微博舆情分析,微博评论情感分析可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…