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

news/2024/5/18 2:12:59

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.mrgr.cn/p/56325848

相关文章

Python 数据结构和算法实用指南(一)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0前言 数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识,以及编程实现经验。它专为初学者和中级水平的研究 Py…

4-01. 升级到 URP 并创建灯光数据结构

安装 URP 安装 URP创建 Settings修改 Project Settings让素材支持通用渲染管线如果 Convert 的时候出现报错,继续点击 Convert 即可 注意,如果报错说场景没有加载,需要把场景加载好之后再转换 实现全局光照 新建 Lights然后创建 Global Light 2D白天的灯光效果晚上的灯光效果…

Python 数据结构和算法实用指南(二)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0第四章:列表和指针结构 我们已经在 Python 中讨论了列表,它们方便而强大。通常情况下,我们使用 Python 内置的列表实现来存储任何数据。然而,在本章中,我们将了解列表的…

IDEA如何同时运行两个Modules

首先File->Project Structure里面添加module点击run旁边的Run/Debug设置,新增一个Application,填写jdk、module名、主类、工作目录按住Shift点击Run 即可在下方的Service里面看到同时运行两个modules注意:相同类型的module可能会端口号冲突,需要提前修改成不同的端口,比…

一位OIer的胡言乱语

今天,也就是2024年3月3号,结束完省选的我怀着不甘的心和破碎的梦坐上车回到自己生活的小城市,望着窗外的迷雾仿佛这一切都是虚假的,都只是活生生的一场梦罢了,可这并没能说服我自己,这一切只是我,一个loser妄想说服自己回到那个夏天的谎言罢了,回想起第一次学习算法时,…

Python 入门指南(四)

原文:zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92 译者:飞龙 协议:CC BY-NC-SA 4.0 第十章:哈希和符号表 我们之前看过列表,其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效。它们是整…

ggplot 中绘图设置 轴标签和标题与绘图区域的间距

001、 基础绘图library(ggplot2) p <- ggplot(faithful, aes(x = eruptions, y = waiting)) + geom_point() p 002、调整标签刻度到绘图区域的间距p + theme(axis.text.x = element_text(vjust = -8)) ## 调整x标签刻度到绘图区域的间距 003、调整绘图区域到周边的距…

SQL Server安装以及使用Navicat连接遇到的问题的解决方式

SQL Server1、SQL Server安装,参考连接:SQL Server 2019安装详细教程(图文详解,非常靠谱) 2、远程服务器:Navicat连接报错:TCP 提供程序: 由于目标计算机积极拒绝,无法连接. 该错误有2个方面的问题需要解决 (1)远程服务器是否能够telnet服务器的ip和端口, 解决方式:在…

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人&#xff0c;好在解决了。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS …

Qt实现无边框窗口(二)

本例使用纯Qt实现了无边框的窗口,包含了窗口外围的阴影和调整窗口大小的功能,以及最小化、最大化和关闭按钮的功能。本程序在VS2017、Qt5.9下测试通过。期间为了正确响应鼠标消息调试了1~2天,因为在推拽调整窗口大小的时候总是会出漏洞,不过最终还是解决了这些问题。运行效…

宝塔面板mysql无法启动问题如何解决

宝塔面板无法启动的问题和解决 如果你的宝塔里面的mysql无法启动了,请先看是不是以下的配置问题 1.是不是你的3306端口被占用了导致mysql无法启动 2.是不是磁盘空间不足导致的无法启动 如果都不是这些问题再继续向下看 常见问题: 1、Mysql安装好后或迁移文件后无法启动 2、My…

固定资产管理系统解决方案(Word原件)

固定资产管理系统解决方案 1系统概述 1.1需求描述 1.2需求分析 1.3重难点分析 1.4重难点解决措施 2系统架构设计 2.1系统架构图 2.2关键技术 3系统功能设计 3.1功能清单列表 3.2资产采购 3.3资产验收 3.4资产入库 3.5资产领用 3.6资产出库 3.7资产维修 3.8资产…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分&#xff1a;html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;WWW:World Wide Web &am…

Hive-Sql复杂面试题

参考链接&#xff1a;hive sql面试题及答案 - 知乎 有哪些好的题目都可以给我哦 我来汇总到一起 1、编写sql实现每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数 数据&#xff1a; userid,month,visits A,2015-01,5 A,2015-01,15 B,2015-01,5 A,2015-01,…

2024年前端技术发展趋势

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

vagrant 安装虚拟机,docker, k8s

第一步&#xff1a;安装虚拟机 1、安装 vagrant 本机是 mac, 但是这一步不影响&#xff0c;找对应操作系统的安装方式就行了。 vagrant 下载地址 brew install vagrant 2、下载 VirtualBox 虚拟机 VirtualBox 下载地址 找到对应系统下载&#xff0c;安装就可以。 尽量把…

Android 自定义SwitchPreference

1. 为SwitchPreference 添加背景&#xff1a;custom_preference_background.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:s…

【每日刷题】Day16

【每日刷题】Day16 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 160. 相交链表 - 力扣&…

ruoyi框架修改

修改主题色topleft布局改为自定义topleft布局涉及到的文件 src/settings.js,src/layout/index.vue ,src/components/TopNav ,src/layout/components/Navbar.vue 避免修改原文件,将src/components/TopNav ,src/layout/components/Navbar.vue 同级目录下复制一份 分别重命名…

服务器之HP服务器带外口登录

前言HP服务器的管理口需要通过dhcp为其分配一个IP,通过笔记本配置同网段的IP进行连接。一、下载TFPTD软件-DHCP服务器(为笔记本和服务器dhcp分配IP地址)二、笔记本登录管理口