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

前面一篇文章阳仔给大家结束了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 对网络分区的处理需要特别注意,避免出现脑裂等问题。

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

相关推荐
运维栈记7 小时前
如何排错运行在Kubernetes集群中的服务?
云原生·容器·kubernetes
阿里云云原生9 小时前
直播回顾丨详解阿里云函数计算 AgentRun,手把手带你走进 Agentic AI 生产时代
云原生
ChaITSimpleLove10 小时前
基于 .NET Garnet 1.0.91 实现高性能分布式锁(使用 Lua 脚本)
分布式·.net·lua
yumgpkpm10 小时前
Iceberg在Cloudera CDP集群详细操作步骤
大数据·人工智能·hive·zookeeper·spark·开源·cloudera
原神启动112 小时前
Kafka详解
分布式·kafka
yumgpkpm12 小时前
Iceberg在Hadoop集群使用步骤(适配AI大模型)
大数据·hadoop·分布式·华为·zookeeper·开源·cloudera
元气满满-樱13 小时前
分布式LNMP部署
分布式
Wang's Blog15 小时前
RabbitMQ: 声明式配置简化管理
分布式·rabbitmq
叫致寒吧15 小时前
zookeeper与kafka
分布式·zookeeper·云原生
赵得C15 小时前
2025下半年软件设计师考前几页纸
java·开发语言·分布式·设计模式·性能优化·软考·软件设计师