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

news2024/11/29 6:31:42

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
do
        case $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.coloradmin.cn/o/1603268.html

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

相关文章

UE5 C++ 射线检测

一.声明四个变量 FVector StartLocation;FVector ForwardVector;FVector EndLocation;FHitResult HitResult;二.起点从摄像机,重点为摄像机前9999m。射线检测 使用LineTraceSingleByChannel 射线直线通道检测,所以 void AMyCharacter::Tick(float Delt…

c++ qt6.5 打包sqlite组件无法使用,尽然 也需要dll支持!这和开发php 有什么区别!

运行 程序会默认使用当前所在文件夹中的 dll 文件,若文件不存在,会使用系统环境变量路径中的文件;又或者是需要在程序源代码中明确指定使用的 dll 的路径。由于我安装 Qt 时将相关 dll 文件路径都添加到了系统环境变量中,所以即使…

Hbase的shell命令(详细)

一、help 1.help 显示命名的分组情况 2.help 命令名称 查看命令的具体使用,包括命令的作用和用法。 举例:help list 二、general 组(普通命令组) 命令 描述 …

设计循环队列(队列oj)

1.设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题,包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

CentOS系统上部署Docker,mysql,nginx

CentOS7系统上部署Docker,mysql,nginx 未完,持续更新中 更新软件包索引: 首先,确保你的CentOS系统是最新的。你可以通过运行以下命令来更新你的系统: yum update安装Docker: CentOS的软件仓…

十大开源机器人 智能体

1- Poppy 网址 https://www.poppy-project.org/en/ 2- Nao 网址:https://www.aldebaran.com/en/nao 3- iCub 网址: https://icub.iit.it/

蓝桥杯2024年第十五届省赛真题-R 格式

找到规律后如下&#xff0c;只需要用高精度加法和四舍五入&#xff08;本质也是高精度加法就能做&#xff09;&#xff0c;如果没有找到规律&#xff0c;就得自己写高精度乘法和加法&#xff0c;不熟练很容易错。 //#include<bits/stdc.h> #include<iostream> #i…

【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;2&#xff09;查询&#xff09;基础上继续实现以表格形式显示查询到的数据的功能 效果 步骤 1. 在“WBP_Query”中将多行文本框替换未网格面板控件&#xff0c;该控件可以用表格形式布局…

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型&#xff08;LLMs&#xff09;已显示出在上下文中学习的能力 给定几个带注释的示例作为演示&#xff0c;LLMs 能够为新的测试输入生成输出然而&#xff0c;现行的上下文学习&#xff08;ICL&#xff09;范式仍存在以下明显…

1 回归:锂电池温度预测top2 代码部分(一) Tabnet

2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 TabNet&#xff1a; 模型也是我在这个比赛一个意外收获&#xff0c;这个模型在比赛之中可用。但是需要GPU资源&#xff0c;否则运行真的是太慢了。后面针对这个模型我会写出如何使用的方法策略。 比赛结束后有与其他两位选手聊天&am…

YOLOv9改进策略 | 损失函数篇 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv9的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Focus”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…

前端请求发送成功,后端收到null

1、dishId为64&#xff0c;有数据 2、但是后端调试接不到数据&#xff0c;为null 3、形参部分缺少RequestBody接收JSON数据&#xff0c;加上即可

C++修炼之路之STL_stack,queue和容器适配器

目录 前言 一&#xff1a;SLT中stack和queue的基本使用 1.在官网中对stack和queue的简单介绍 2.数据结构中栈和队列的基本知识和操作 3. STL中stack的接口函数及使用 4.STL中queue的接口函数及使用 二&#xff1a;容器适配器Container 三&#xff1a;使用容器适配器…

浏览器工作原理与实践--安全沙箱:页面和系统之间的隔离墙

前面三篇文章我们主要围绕同源策略介绍了Web页面安全的相关内容&#xff0c;那今天我们把视野向外延伸&#xff0c;来聊聊页面安全和操作系统安全之间的关系。 在《仅仅打开了1个页面&#xff0c;为什么有4个进程&#xff1f;》那篇文章中&#xff0c;我们分析了浏览器架构的发…

第一篇【传奇开心果系列】我和AI面对面聊编程:深度比较PyQt5和tkinter.ttk

传奇开心果系列博文 系列博文目录我和AI面对面聊编程系列 博文目录前言一、今天我们面对广大读者选择PyQt5和tkinter.ttk做比较这个话题目的是什么&#xff1f;二、举一个最简单的pyqt5信号和插槽的例子三、这和tkinter的点击事件有什么区别&#xff1f;四、如何选择&#xff1…

深澜计费管理系统 /demo/proxy存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 深澜计费管理系统是一款用于网络设备计费管理的软件…

React + 项目(从基础到实战) -- 第八期

ajax 请求的搭建 引入mockAP接口设计AJAX 通讯 前置知识 HTTP 协议 , 前后端通讯的桥梁API : XMLHttpRequest 和 fetch常用工具axios mock 引入 Mock.js (mockjs.com) 使用 mockJS 前端代码中引入 mockJs定义要模拟的路由 , 返回结果mockJs 劫持ajax请求(返回模拟的结果)…

SPI 和W25Q128(使用SPI通讯读写W25Q128模块)

SPI 是什么&#xff1f; SPI 是串行外设接口&#xff08; Serial Peripheral Interface &#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上 只占用四根线 &#xff0c;节约了芯片的管脚&#xff0c;同时…

SecureCRT (Mac/Windows)中文---远程连接与管理的安全新选择

SecureCRT是一款功能强大的终端仿真程序&#xff0c;专为连接和管理远程系统而设计。它支持SSH&#xff08;包括SSH1和SSH2&#xff09;协议&#xff0c;确保用户与目标设备之间的通信安全&#xff0c;有效防止网络攻击和窥探。此外&#xff0c;SecureCRT还支持Telnet、Rlogin等…