自学内容网 自学内容网

Zookeeper(3)Zookeeper的工作原理是什么?

Zookeeper 是一个分布式协调服务,主要用于分布式系统中的协调工作。它通过简单的原语(如节点、会话、观察者等)实现了分布式锁、配置管理、命名服务、分布式队列等功能。理解 Zookeeper 的工作原理是掌握其使用的关键。以下是 Zookeeper 工作原理的详细解释,并结合代码示例进行说明。

Zookeeper 的架构

Zookeeper 采用了主从(Leader-Follower)架构,集群中的节点有三种角色:Leader、Follower 和 Observer。

  • Leader:负责处理所有写请求,并将数据变更同步到 Follower。
  • Follower:处理读请求,并参与 Leader 选举。
  • Observer:仅用于扩展读能力,不参与写操作和选举。

Zookeeper 的一致性协议:ZAB 协议

Zookeeper 使用 ZAB(Zookeeper Atomic Broadcast)协议来保证数据的一致性和可靠性。ZAB 协议包括两种基本模式:

  1. 崩溃恢复模式:当 Leader 崩溃或网络分区发生时,Zookeeper 进入崩溃恢复模式,选举新的 Leader 并同步数据。
  2. 消息广播模式:在 Leader 稳定的情况下,Zookeeper 通过消息广播向所有 Follower 传播数据变更。

Zookeeper 的数据模型

Zookeeper 的数据模型类似于文件系统,由一棵层次化的树组成,树的每个节点称为 ZNode。ZNode 可以存储数据,并且可以有子节点。

Zookeeper 的 Watcher 机制

Watcher 是 Zookeeper 提供的一种通知机制,客户端可以在 ZNode 上设置 Watcher,当 ZNode 的数据或子节点发生变化时,Zookeeper 会通知客户端。

代码示例

以下代码示例展示了如何使用 Zookeeper 实现基本的节点操作,并通过 Watcher 机制监控节点的变化。

1. 添加 Maven 依赖

pom.xml 中添加 Zookeeper 客户端的依赖:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.3</version>
</dependency>
2. 创建 Zookeeper 客户端
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

public class ZookeeperClient {
    private static final String ZK_ADDRESS = "localhost:2181";
    private static final int SESSION_TIMEOUT = 3000;

    private ZooKeeper zooKeeper;

    public void connect() throws Exception {
        zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("Event received: " + event);
            }
        });
    }

    public void close() throws InterruptedException {
        if (zooKeeper != null) {
            zooKeeper.close();
        }
    }

    public ZooKeeper getZooKeeper() {
        return zooKeeper;
    }
}
3. 创建和读取节点
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;

public class ZookeeperExample {
    private static final String PATH = "/example";

    public static void main(String[] args) throws Exception {
        ZookeeperClient client = new ZookeeperClient();
        client.connect();

        ZooKeeper zooKeeper = client.getZooKeeper();

        // 创建持久节点
        if (zooKeeper.exists(PATH, false) == null) {
            String createdPath = zooKeeper.create(PATH, "initial_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println("Created node path: " + createdPath);
        }

        // 读取节点数据
        byte[] data = zooKeeper.getData(PATH, false, null);
        System.out.println("Data of node " + PATH + ": " + new String(data));

        // 更新节点数据
        Stat stat = zooKeeper.setData(PATH, "updated_data".getBytes(), -1);
        System.out.println("Updated node " + PATH + " with version: " + stat.getVersion());

        // 读取更新后的数据
        data = zooKeeper.getData(PATH, false, null);
        System.out.println("Data of node " + PATH + " after update: " + new String(data));

        // 删除节点
        zooKeeper.delete(PATH, -1);
        System.out.println("Deleted node " + PATH);

        client.close();
    }
}
4. 使用 Watcher 机制
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class ZookeeperWatcherExample {
    private static final String PATH = "/watcher_example";

    public static void main(String[] args) throws Exception {
        ZookeeperClient client = new ZookeeperClient();
        client.connect();

        ZooKeeper zooKeeper = client.getZooKeeper();

        // 创建节点
        if (zooKeeper.exists(PATH, false) == null) {
            zooKeeper.create(PATH, "initial_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }

        // 设置 Watcher
        zooKeeper.getData(PATH, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("Watcher event: " + event);
            }
        }, null);

        // 更新节点数据,触发 Watcher
        zooKeeper.setData(PATH, "updated_data".getBytes(), -1);

        client.close();
    }
}

Zookeeper 工作原理总结

  1. 架构:Zookeeper 采用主从架构,包括 Leader、Follower 和 Observer。Leader 处理写请求并同步数据,Follower 处理读请求并参与选举,Observer 扩展读能力。
  2. 一致性协议:Zookeeper 使用 ZAB 协议保证数据一致性,通过崩溃恢复模式和消息广播模式实现。
  3. 数据模型:Zookeeper 使用层次化的树结构,每个节点称为 ZNode,可以存储数据和子节点。
  4. Watcher 机制:Zookeeper 提供 Watcher 机制,允许客户端监控节点的变化,当节点数据或子节点发生变化时,会通知客户端。

通过上述代码示例,可以看到如何使用 Zookeeper 实现基本的节点操作和 Watcher 机制,进一步理解 Zookeeper 的工作原理。


原文地址:https://blog.csdn.net/qq_43012298/article/details/139387887

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!