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 协议包括两种基本模式:
- 崩溃恢复模式:当 Leader 崩溃或网络分区发生时,Zookeeper 进入崩溃恢复模式,选举新的 Leader 并同步数据。
- 消息广播模式:在 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 工作原理总结
- 架构:Zookeeper 采用主从架构,包括 Leader、Follower 和 Observer。Leader 处理写请求并同步数据,Follower 处理读请求并参与选举,Observer 扩展读能力。
- 一致性协议:Zookeeper 使用 ZAB 协议保证数据一致性,通过崩溃恢复模式和消息广播模式实现。
- 数据模型:Zookeeper 使用层次化的树结构,每个节点称为 ZNode,可以存储数据和子节点。
- Watcher 机制:Zookeeper 提供 Watcher 机制,允许客户端监控节点的变化,当节点数据或子节点发生变化时,会通知客户端。
通过上述代码示例,可以看到如何使用 Zookeeper 实现基本的节点操作和 Watcher 机制,进一步理解 Zookeeper 的工作原理。
原文地址:https://blog.csdn.net/qq_43012298/article/details/139387887
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!