问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Zookeeper详细安装、使用及注意事项

创作时间:
作者:
@小白创作中心

Zookeeper详细安装、使用及注意事项

引用
CSDN
1.
https://blog.csdn.net/m0_61361390/article/details/146371259

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

修改配置文件

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

示例配置:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/data
clientPort=2181
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选举端口。

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

创建数据目录

根据配置文件中的dataDir参数,创建相应的数据存储目录,如:

mkdir -p /opt/zookeeper/data

如果是集群模式的话,每个服务器都需要执行该命令。

3. 启动 Zookeeper

启动服务

在Zookeeper的bin目录下,执行以下命令启动服务:

./zkServer.sh start

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

查看服务状态

可以使用以下命令查看服务的运行状态,确认是否启动成功:

./zkServer.sh status

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

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

连接客户端

在Zookeeper的bin目录下,使用命令连接到Zookeeper服务器,进入命令行界面:

./zkCli.sh -server 127.0.0.1:2181

基本操作

  • 创建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<String> 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对网络分区的处理需要特别注意,避免出现脑裂等问题。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号