编写不易,转载请注明(http://shihlei.iteye.com/blog/2075801)!
一概述
Zookeeper是针对大型分布式系统的可靠协调系统。
核心服务总结如下:
-
可靠的协调系统:用于存储客户端集群相互协作的信息。(Zookeeper核心机制会保证数据在所有的Zookeeper数据结点的一致性,客户并发修改任何Zookeeper结点的数据效果都是一致的)。
-
数据变更通知推送:当客户端修改某个数据时,例如:变更,增加,删除(对于瞬时ZNode,客户端失联自动删除ZNode),Zookeeper主动通知监听该数据变化的客户端。
二 数据存储
1)Zookeeper 中存储数据的结点为ZNode 有唯一路径,并有类似于树形的结构
2)ZNode有如下4种类型:
- PERSISTENT:持久性ZNode,不会随着client session的close/expire而消失。
- PERSISTENT_SEQUENTIAL:有顺序的持久性ZNode。
- EPHEMERAL:暂时行ZNode,生命周期依赖于client session,对应session close/expire后其znode也会消失。
- EPHEMERAL_SEQUENTIAL:有顺序的暂时行ZNode。
3)ZNode能注册监听,当发生变化时回通知监听的客户端。集群管理,分布式锁都依赖于此。
操作ZNode样例:
public void run(ZooKeeper zk) throws KeeperException, InterruptedException {
String nodePath = "/TestNode";
byte[] nodeDate = "TestNodeData".getBytes();
// 1 创建znode ,CreateMode.EPHEMERAL 为临时的,客户端断开则无法看到znode信息
// 创建一个znode(必须有父节点)
String result = zk.create(nodePath, nodeDate, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Create znode at : " + result);
// 2 测试一个znode是否存在,并且查询它的元数据,null表示不存在
Stat stat = zk.exists(nodePath, false);
System.out.println("Create Exist znode : " + stat);
// 3 获取一个znode的ACL,每个znode被创建时都会带有一个ACL列表,用于决定谁可以对它执行何种操作。
System.out.println("ACL List ===============");
List<ACL> aclList = zk.getACL(nodePath, stat);
for (ACL a : aclList) {
System.out.println(a);
}
// 4 获取一个znode的子节点列表
List<String> childs = zk.getChildren(nodePath, false);
for (String c : childs) {
System.out.println(c);
}
// 5.1 设置一个znode所保存的数据
nodeDate = zk.getData(nodePath, false, stat);
System.out.println("NodeDate : " + new String(nodeDate));
// 5.2 设置一个znode所保存的数据
byte[] newNodeDate = "TestNodeData_NewData".getBytes();
// 注:Zookeeper中的更新操作是有条件的。在使用delete或者setData操作时必须提供被更新znode的版本号,如果版本号不匹配,则更新操作失败。
zk.setData(nodePath, newNodeDate, stat.getVersion());
}
三 应用场景
-
感知集群变化:Client启动在统一目录下时注册EPHEMERAL ZNode,当一台Client当机,其他znode可以收到通知,添加机器同。
-
Master选举:对等机之间选取Master,Master失效后自动重选。实现:Client 创建EPHEMERAL_SEQUENTIAL ZNode,启动时,Sequental 号最小的当选为Master。
-
集群同步锁:Client 集群间实现同步操作。实现:Client 执行同步操作前创建 EPHEMERAL_SEQUENTIAL ZNode,如果ZNode Sequental 号最小则获得锁执行,否则等待其他Client释放锁。
同步锁实现:
package x.bd.zookeeper.lock;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
/**
* 共享锁:原理,当客户端要进行某种操作时,在Zookeeper上注册Znode,如果当前序号为自己,则进行处理,处理完成后释放,其他等待处理的线程监控
*
* 这里用不同的Thread 模拟不同的Server
*
* 注:这种锁的概念同样可以应用与Master操作,其他同步的Salver等待
*
* 存在问题:判断锁的时候需要获取最小的锁,排序获得
*
* @author shilei
*
*/
public class LockTest implements Watcher {
private ZooKeeper zk;
// Zookeeper 锁根
private static final String LOCK_ROOT = "/Lock";
// 当前客户端注册锁名
private String lockName;
// 线程锁,用于没有获得执行锁时阻塞
private Integer threadLock = -1;
public LockTest(String server) throws Exception {
zk = new ZooKeeper(server, 3000, this);
}
/**
* 注册锁
*
* @throws Exception
*/
public void lock() throws Exception {
// 注册锁根结点
Stat rootStat = zk.exists(LOCK_ROOT, false);
if (rootStat == null) {
String rootPath = zk.create(LOCK_ROOT, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Create root : " + rootPath);
}
// 在服务器注册自己的锁
lockName = zk.create(LOCK_ROOT + "/lock_", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("Create lock : " + lockName);
// 循环判断服务器当前锁是否为自己的锁
while (true) {
// 设置观察
List<String> lockList = zk.getChildren(LOCK_ROOT, true);
Collections.sort(lockList);
if (!lockName.endsWith(lockList.get(0))) {
// 当前锁非本服务器注册,等待
synchronized (threadLock) {
threadLock.wait();
}
} else {
// 获得锁成功
return;
}
}
}
/**
* 释放锁
*
* @throws Exception
*/
public void unLock() throws Exception {
Stat stat = zk.exists(lockName, false);
if (stat != null) {
zk.delete(lockName, stat.getVersion());
}
}
/**
* 竞争锁
*/
public void process(WatchedEvent event) {
// 事件发生在锁目录上
String path = event.getPath();
if (path != null && path.startsWith(LOCK_ROOT)) {
// 监控的是root node 需要判断node children changed 事件
if (event.getType() == Event.EventType.NodeChildrenChanged) {
// 事件类型为锁删除事件,激活锁判断
synchronized (threadLock) {
threadLock.notify();
}
}
}
}
public void shutdown() throws InterruptedException {
zk.close();
}
/**
* 期望结果:线程处理过程没有多个线程的嵌套流程
*/
public static void main(String[] args) throws Exception {
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
try {
String server = "8.8.8.13:2181";
LockTest lockTest = new LockTest(server);
// 注册锁
lockTest.lock();
// 执行获取锁后的任务
System.out.println("Thread : " + Thread.currentThread().getId() + " start ! ");
Thread.sleep(1000 + new Random().nextInt(5000));
System.out.println("Thread : " + Thread.currentThread().getId() + " finish ! ");
// 获取锁后的任务执行完毕,释放
lockTest.unLock();
lockTest.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
}
- 大小: 8.2 KB
分享到:
相关推荐
Zookeeper原理及应用 Zookeeper是一个分布式服务框架,由Apache Hadoop子项目组成,它提供了...Zookeeper是一种分布式服务框架,提供了可靠的协调系统,可以解决分布式环境中的数据管理问题,具有多种功能和应用场景。
ZooKeeper经典应用场景实战(一) 本节课重点介绍了 ZooKeeper 的经典应用场景,并通过 Java 客户端 API 连接和操作 ZooKeeper 集群。 ZooKeeper 官方提供的 Java 客户端 API 虽然提供了基本的操作,但是存在一些...
ZooKeeper被广泛应用于解决多种分布式问题,以下是一些典型的ZooKeeper应用场景: 1. 数据发布与订阅(配置中心): ZooKeeper作为一个配置中心,允许发布者将数据发布到特定节点,订阅者则可以通过注册Watcher...
在本文中,我们将深入探讨Zookeeper客户端的工作原理,如何通过代码进行操作,并探讨其在实际应用中的场景。 首先,让我们理解Zookeeper客户端的基本原理。Zookeeper客户端通过TCP连接与服务器建立会话。这个会话...
在本课程“第三课:Zookeeper典型使用场景实践1”中,主要讨论了Zookeeper在分布式系统中的四个关键应用场景:分布式集群管理、分布式注册中心、分布式JOB和分布式锁。下面是针对这些场景的详细说明: 1. **分布式...
### ZooKeeper 应用场景详解 #### 一、概述 ZooKeeper是一个分布式协调服务,它主要用于解决分布式环境...通过对这些应用场景的深入理解,我们可以更好地利用ZooKeeper的强大功能,构建更加高效、稳定的分布式系统。
三、Zookeeper应用场景示例 1. 服务注册与发现:在微服务架构中,Zookeeper可以作为服务注册中心,服务提供者将自己注册到Zookeeper,服务消费者通过查询Zookeeper获取服务提供者的地址。 2. 分布式锁:利用...
Zookeeper提供了分布式锁的功能,如图02_zookeeper的分布式锁场景所示,通过创建临时节点并监听其他节点的变化,实现公平且高效的锁机制。这包括读锁和写锁,读锁可以多个客户端同时获得,而写锁则是互斥的,确保了...
在深入探讨HDFS深入及Hadoop HA相关知识点之前,首先需要了解标题和描述中提及的几个关键点:课程回顾、基础课程价值信息、入门课程、分布式计算条件、HDFS深入、Hadoop HA架构、Zookeeper功能及应用场景、Hadoop ...
应用场景 - **配置中心**: 分布式系统中的配置可以集中存放在Zookeeper上,各服务节点通过Watcher监听配置变更,实时同步配置。 - **分布式锁**: 利用临时节点实现分布式锁,确保并发操作的互斥性。 - **命名服务*...
除了上述应用场景,ZooKeeper还有其他用途: 4. 分布式锁 在分布式环境中,多个节点可能同时尝试执行某项操作,导致数据不一致。ZooKeeper提供了分布式锁机制,通过创建临时节点和监控父节点来实现锁的获取与释放,...
【Zookeeper 进阶之——典型应用场景(二)】 Zookeeper 是一个分布式协调服务,它在分布式系统中扮演着至关重要的角色,提供了诸如命名服务、配置管理、组关系管理和分布式锁等高级功能。本文主要讨论如何利用...
Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...
### Zookeeper的应用场景 1. **配置中心**:Zookeeper可以作为分布式系统的配置中心,集中管理各组件的配置信息。 2. **集群管理**:通过Zookeeper可以实现对集群节点的动态管理和监控。 3. **分布式锁**:提供一种...
在本课程中,我们将重点探讨四个核心应用场景:分布式集群管理、分布式注册中心、分布式锁以及分布式JOB。 一、分布式集群管理 1. 主动查看线上服务节点:通过Zookeeper,可以实时获取集群中各个服务节点的信息,...
本归档文件主要涵盖了Zookeeper在实际应用中的典型使用场景,通过文档资料深入剖析了Zookeeper的核心功能和实际操作。 1. 分布式锁:在分布式系统中,多个节点可能同时对同一资源进行操作,导致数据不一致。...
在大型分布式系统中,Zookeeper被广泛用于配置管理、命名服务、分布式锁、集群管理等多种场景。接下来,我们将详细讨论Zookeeper的安装包以及在Linux系统上的安装步骤。 ## 一、Zookeeper的功能与特性 1. **配置...
本文将探讨 Zookeeper 的几个典型应用场景,并通过代码示例进行解析。 **统一命名服务 (Name Service)** 在分布式环境中,Zookeeper 提供了一种层次化的命名空间,类似于文件系统的目录结构。开发者可以通过调用 ...
使用场景及目标:适用于希望深入理解和掌握 ZooKeeper 工作原理和高级功能的企业和个人开发者,特别是需要构建可靠的分布式应用程序(如配置中心、注册中心、服务协调等)的团队。通过对本文的学习,能够提高在实际...
Apache ZooKeeper 使用方法实例详解 ... ZooKeeper 的使用方法实例详解可以帮助开发人员更好地理解 ZooKeeper 的基本原理和应用场景,并且能够更好地应用 ZooKeeper 来实现分布式系统的各项功能。