百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

(十六) 60s搞懂 : Zookeeper 的详细安装,使用及注意事项

itomcoil 2025-04-01 19:01 37 浏览

前面一篇文章阳仔给大家结束了Zookeeper的一些基本概念,那么这一篇文章,阳仔将给大家介绍一下Zookeeper 的详细安装和使用步骤以及注意事项;

什么是 Zookeeper?

一个开源的分布式协调服务,用于管理分布式应用程序中的配置信息、命名、提供分布式同步以及组服务等功能。它为分布式应用提供了一种简单、高效且可靠的协调机制,能够帮助解决分布式系统中的一些常见问题,如数据一致性、服务注册与发现等。

使用 Zookeeper 的详细步骤

1. 安装 Zookeeper

下载

下载安装包 :可以从 Apache 官方网站下载 Zookeeper 的稳定版本,

例如使用命令`wget
https://dlcdn.apache.org/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz`下载指定版本。

解压安装包 :使用`tar -zxvf
apache-zookeeper-3.9.2-bin.tar.gz`命令解压安装包。

移动安装目录 :将解压后的目录移动到指定目录,如`/usr/local/`,使用命令`mv apache-zookeeper-3.9.2 /usr/local/`。

2. 配置 Zookeeper

配置

2.1.修改配置文件: Zookeeper 在启动时会找zoo.cfg这个文件作为默认配置文件。

进入 Zookeeper 的`conf`目录,通常会有一个示例配置文件`zoo_sample.cfg`,可以将其复制并重命名为`zoo.cfg`,然后根据实际需求进行修改。

以下是一些常见的配置参数 :

  • tickTime:Zookeeper 使用的基本时间单位(毫秒),用于执行心跳检测等,例如设置为`2000`。
  • dataDir:存储内存中数据快照的路径,如`/tmp/zookeeper/data`。
  • clientPort:监听客户端连接的端口,可根据需要设置,如`9009`。
  • initLimit:Leader 允许 Follower 连接并进行初始同步的时间,以`tickTime`为单位,例如设置为`10`。
  • syncLimit:Leader 允许 Follower 在同步过程中滞后的时间,以`tickTime`为单位,例如设置为`5`。
  • clientPort: 客户端端口号, 根据服务设置,例如 : 设置为2181.
tickTime=2000
initLimit=10
syncLimit=5
# 数据保存地址
dataDir=/tmp/zookeeper/data

# 客户端访问端口(zookeeper-1.novalocal、zookeeper-2.novalocal、zookeeper-3.novalocal修改为实际zookeeper主机的ip或域名)
server.1=zookeeper-1.novalocal:2888:3881
server.2=zookeeper-2.novalocal:2888:3882
server.3=zookeeper-3.novalocal:2888:3883

在集群模式下,还需要配置`server.id=host:port:port`,其中`id`是服务器的编号,`host`是服务器的 IP 地址,第一个`port`是集群内部通信端口,第二个`port`是 Leader 选举端口,例如`server.1=192.168.1.1:2888:3888`。

注意:集群模式下,如果三个zookeeper服务都在同一台服务器上,这里要保证地址的唯一性,注意IP地址和端口号不要互相冲突,IP相同,端口一定不能相同,以免影响程序的正确执行。

2.2 创建数据目录:根据配置文件中的`dataDir`参数,创建相应的数据存储目录,如`mkdir -p /opt/zookeeper/data`。 如果是集群模式的话,每个服务器都需要执行该命令

3. 启动 Zookeeper

查看状态

3.1启动服务:在 Zookeeper 的`bin`目录下,执行`./zkServer.sh start`命令启动服务。

集群模式,需要每个节点都需要执行;

查看服务状态 :可以使用`./zkServer.sh status`命令查看服务的运行状态,确认是否启动成功。

# 启动服务
bash /var/lib/zookeeper-3.4.6/bin/zkServer.sh  start

# 查看服务状态
bash /var/lib/zookeeper-3.4.6/bin/zkServer.sh  status

# 测试客户端连接
bash /var/lib/zookeeper-3.4.6/bin/zkCli.sh

出现Mode:follower或Mode:leader则zookeeper集群部署成功,服务启动正常。

4. 使用 Zookeeper 客户端进行操作

使用流程

连接客户端 :在 Zookeeper 的`bin`目录下,使用命令`./zkCli.sh -server 127.0.0.1:2181`连接到 Zookeeper 服务器,进入命令行界面。

基本操作 :

  • 创建 ZNode :使用`create /my_node "my_data"`命令创建一个名为`/my_node`的节点,并写入数据`my_data`。
  • 读取 ZNode:使用`get /my_node`命令读取`/my_node`节点的数据。
  • 修改 ZNode :使用`set /my_node "new_data"`命令将`/my_node`节点的数据修改为`new_data`。
  • 删除 ZNode:使用`delete /my_node`命令删除`/my_node`节点。

监控节点变化:Zookeeper 提供了 Watcher 机制,允许客户端对某个 ZNode 设置 Watcher,当节点发生变化时客户端会收到通知。例如,使用`get /my_node true`命令设置对`/my_node`节点的监控,当节点数据变化或被删除时,客户端将收到事件通知。

5. 实现分布式锁

创建顺序节点 :每个客户端尝试创建一个顺序节点,Zookeeper 会为每个客户端分配一个唯一的顺序号。

获取锁 :拥有最小序号的客户端获得锁。

释放锁 :当客户端释放锁时,删除该节点,其他客户端监控到变化,尝试获取锁。以下是一个简单的 Java 示例代码:

import org.apache.zookeeper.*;
import java.util.Collections;
import java.util.List;

public class DistributedLock {
    private ZooKeeper zk;
    private String lockBasePath = "/locks";
    private String lockName;
    private String currentLock;

    public DistributedLock(ZooKeeper zk, String lockName) {
        this.zk = zk;
        this.lockName = lockName;
    }

    public void acquireLock() throws Exception {
        String lockPath = lockBasePath + "/" + lockName;
        // 创建顺序节点
        currentLock = zk.create(lockPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        // 获取所有子节点并排序
        List lockNodes = zk.getChildren(lockBasePath, false);
        Collections.sort(lockNodes);
        if (currentLock.endswith(lockNodes.get(0))) {
            // 获取锁
            System.out.println("Acquired lock: " + currentLock);
        } else {
            // 等待锁释放
            String previousLock = lockNodes.get(lockNodes.indexOf(currentLock) - 1);
            zk.exists(lockBasePath + "/" + previousLock, watchedEvent -> {
                if (watchedEvent.getType() == Watcher.Event.EventType.NodeDeleted) {
                    try {
                        acquireLock();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

    public void releaseLock() throws Exception {
        // 释放锁
        zk.delete(currentLock, -1);
        System.out.println("Released lock: " + currentLock);
    }
}

注意:

数据量限制 :Zookeeper 设计为轻量级协调服务,ZNode 不能存储过大的数据,通常不超过 1MB。

高可用配置 :为了提高服务的高可用性,建议 Zookeeper 部署奇数个节点,且至少 3 个节点,以保证出现故障时系统仍能正常运行。

网络隔离处理:在分布式系统中,Zookeeper 对网络分区的处理需要特别注意,避免出现脑裂等问题。

我是阳仔,喜欢的朋友,欢迎点赞,收藏,转发和评论,感谢各位朋友的支持!!!

相关推荐

最强聚类模型,层次聚类 !!_层次聚类的优缺点

哈喽,我是小白~咱们今天聊聊层次聚类,这种聚类方法在后面的使用,也是非常频繁的~首先,聚类很好理解,聚类(Clustering)就是把一堆“东西”自动分组。这些“东西”可以是人、...

python决策树用于分类和回归问题实际应用案例

决策树(DecisionTrees)通过树状结构进行决策,在每个节点上根据特征进行分支。用于分类和回归问题。实际应用案例:预测一个顾客是否会流失。决策树是一种基于树状结构的机器学习算法,用于解决分类...

Python教程(四十五):推荐系统-个性化推荐算法

今日目标o理解推荐系统的基本概念和类型o掌握协同过滤算法(用户和物品)o学会基于内容的推荐方法o了解矩阵分解和深度学习推荐o掌握推荐系统评估和优化技术推荐系统概述推荐系统是信息过滤系统,用于...

简单学Python——NumPy库7——排序和去重

NumPy数组排序主要用sort方法,sort方法只能将数值按升充排列(可以用[::-1]的切片方式实现降序排序),并且不改变原数组。例如:importnumpyasnpa=np.array(...

PyTorch实战:TorchVision目标检测模型微调完

PyTorch实战:TorchVision目标检测模型微调完整教程一、什么是微调(Finetuning)?微调(Finetuning)是指在已经预训练好的模型基础上,使用自己的数据对模型进行进一步训练...

C4.5算法解释_简述c4.5算法的基本思想

C4.5算法是ID3算法的改进版,它在特征选择上采用了信息增益比来解决ID3算法对取值较多的特征有偏好的问题。C4.5算法也是一种用于决策树构建的算法,它同样基于信息熵的概念。C4.5算法的步骤如下:...

Python中的数据聚类及可视化分析实践

探索如何通过聚类分析揭露糖尿病预测数据集的特征!我们将运用Python的强力工具,深入挖掘数据,以直观的可视化揭示不同特征间的关系。一同探索聚类分析在糖尿病预测中的实践!所有这些可视化都可以通过数据操...

用Python来统计大乐透号码的概率分布

用Python来统计大乐透号码的概率分布,可以按照以下步骤进行:导入所需的库:使用Python中的numpy库生成数字序列,使用matplotlib库生成概率分布图。读取大乐透历史数据:从网络上找到大...

python:支持向量机监督学习算法用于二分类和多分类问题示例

监督学习-支持向量机(SVM)支持向量机(SupportVectorMachine,简称SVM)是一种常用的监督学习算法,用于解决分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的...

25个例子学会Pandas Groupby 操作

groupby是Pandas在数据分析中最常用的函数之一。它用于根据给定列中的不同值对数据点(即行)进行分组,分组后的数据可以计算生成组的聚合值。如果我们有一个包含汽车品牌和价格信息的数据集,那么可以...

数据挖掘流程_数据挖掘流程主要有哪些步骤

数据挖掘流程1.了解需求,确认目标说一下几点思考方法:做什么?目的是什么?目标是什么?为什么要做?有什么价值和意义?如何去做?完整解决方案是什么?2.获取数据pandas读取数据pd.read.c...

使用Python寻找图像最常见的颜色_python 以图找图

如果我们知道图像或对象最常见的是哪种颜色,那么可以解决图像处理中的几个用例,例如在农业领域,我们可能需要确定水果的成熟度。我们可以简单地检查一下水果的颜色是否在预定的范围内,看看它是成熟的,腐烂的,还...

财务预算分析全网最佳实践:从每月分析到每天分析

原文链接如下:「链接」掌握本文的方法,你就掌握了企业预算精细化分析的能力,全网首发。数据模拟稍微有点问题,不要在意数据细节,先看下最终效果。在编制财务预算或业务预算的过程中,通常预算的所有数据都是按月...

常用数据工具去重方法_数据去重公式

在数据处理中,去除重复数据是确保数据质量和分析准确性的关键步骤。特别是在处理多列数据时,保留唯一值组合能够有效清理数据集,避免冗余信息对分析结果的干扰。不同的工具和编程语言提供了多种方法来实现多列去重...

Python教程(四十):PyTorch深度学习-动态计算图

今日目标o理解PyTorch的基本概念和动态计算图o掌握PyTorch张量操作和自动求导o学会构建神经网络模型o了解PyTorch的高级特性o掌握模型训练和部署PyTorch概述PyTorc...