- 统一命名空间(Name Service)
- 配置推送 (Watch)
- 集群管理(Group membership)
统一命名空间
在zookeeper中实现了一个类似file system系统的数据结构,比如/zookeeper/status。 每个节点都对应于一个znode节点。
znode节点的数据结构模型:
znode的数据结构内容:
-
czxid
The zxid of the change that caused this znode to be created.
-
mzxid
The zxid of the change that last modified this znode.
-
ctime
The time in milliseconds from epoch when this znode was created.
-
mtime
The time in milliseconds from epoch when this znode was last modified.
-
version
The number of changes to the data of this znode.
-
cversion
The number of changes to the children of this znode.
-
aversion
The number of changes to the ACL of this znode.
-
ephemeralOwner
The session id of the owner of this znode if the znode is an ephemeral node. If it is not an ephemeral node, it will be zero.
-
dataLength
The length of the data field of this znode.
-
numChildren
The number of children of this znode.
说明: zxid (ZooKeeper Transaction Id,每次请求对应一个唯一的zxid,如果zxid a < zxid b ,则可以保证a一定发生在b之前)。
针对树状结构的处理,来看一下客户端使用的api :
- String create(String path, byte data[], List<ACL> acl, CreateMode createMode)
- void create(String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)
- void delete(String path, int version)
- void delete(String path, int version, VoidCallback cb, Object ctx)
- Stat setData(String path, byte data[], int version)
- void setData(String path, byte data[], int version, StatCallback cb, Object ctx)
- Stat setACL(String path, List<ACL> acl, int version)
- void setACL(String path, List<ACL> acl, int version, StatCallback cb, Object ctx)
- Stat exists(String path, Watcher watcher)
- Stat exists(String path, boolean watch)
- void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
- void exists(String path, boolean watch , StatCallback cb, Object ctx)
- byte[] getData(String path, Watcher watcher, Stat stat)
- byte[] getData(String path, boolean watch , Stat stat)
- void getData(String path, Watcher watcher, DataCallback cb, Object ctx)
- void getData(String path, boolean watch , DataCallback cb, Object ctx)
- List<String> getChildren(String path, Watcher watcher)
- List<String> getChildren(String path, boolean watch )
- void getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
- void getChildren(String path, boolean watch , ChildrenCallback cb, Object ctx)
- List<String> getChildren(String path, Watcher watcher, Stat stat)
- List<String> getChildren(String path, boolean watch , Stat stat)
- void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)
- void getChildren(String path, boolean watch , Children2Callback cb, Object ctx)
说明:每一种按同步还是异步,添加指定watcher还是默认watcher又分为4种。默认watcher可以在ZooKeeper zk = new ZooKeeper(serverList, sessionTimeout, watcher)中进行指定。如果包含boolean watch的读方法传入true则将默认watcher注册为所关注事件的watch。如果传入false则不注册任何watch
CreateMode主要有几种:
- PERSISTENT (持续的,相比于EPHEMERAL,不会随着client session的close/expire而消失)
- PERSISTENT_SEQUENTIAL
- EPHEMERAL (短暂的,生命周期依赖于client session,对应session close/expire后其znode也会消失)
- EPHEMERAL_SEQUENTIAL (SEQUENTIAL意为顺序的)
- StringCallback
- VoidCallback
- StatCallback
- DataCallback (getData请求)
- ChildrenCallback
- Children2Callback
配置推送(Watcher)
zookeeper为解决数据的一致性,使用了Watcher的异步回调接口,将服务端znode的变化以事件的形式通知给客户端,主要是一种反向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。
这里有篇文章介绍Watcher/Callback比较详细,可以参考下:
- http://luzengyi.blog.163.com/blog/static/529188201064113744373/
- http://luzengyi.blog.163.com/blog/static/529188201061155444869/
如果想更好的理解Watcher的使用场景,可以了解下使用Watcher机制实现分布式的Barrier , Queue , Lock同步。
Barrier例子:
- public class Barrier implements Watcher {
- private static final String addr = "10.20.156.49:2181";
- private ZooKeeper zk = null;
- private Integer mutex;
- private int size = 0;
- private String root;
- public Barrier(String root, int size){
- this.root = root;
- this.size = size;
- try {
- zk = new ZooKeeper(addr, 10 * 1000, this);
- mutex = new Integer(-1);
- Stat s = zk.exists(root, false);
- if (s == null) {
- zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public synchronized void process(WatchedEvent event) {
- synchronized (mutex) {
- mutex.notify();
- }
- }
- public boolean enter(String name) throws Exception {
- zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- while (true) {
- synchronized (mutex) {
- List<String> list = zk.getChildren(root, true);
- if (list.size() < size) {
- mutex.wait();
- } else {
- return true;
- }
- }
- }
- }
- public boolean leave(String name) throws KeeperException, InterruptedException {
- zk.delete(root + "/" + name, 0);
- while (true) {
- synchronized (mutex) {
- List<String> list = zk.getChildren(root, true);
- if (list.size() > 0) {
- mutex.wait();
- } else {
- return true;
- }
- }
- }
- }
- }
测试代码:
- public class BarrierTest {
- public static void main(String args[]) throws Exception {
- for (int i = 0; i < 3; i++) {
- Process p = new Process("Thread-" + i, new Barrier("/test/barrier", 3));
- p.start();
- }
- }
- }
- class Process extends Thread {
- private String name;
- private Barrier barrier;
- public Process(String name, Barrier barrier){
- this.name = name;
- this.barrier = barrier;
- }
- @Override
- public void run() {
- try {
- barrier.enter(name);
- System.out.println(name + " enter");
- Thread.sleep(1000 + new Random().nextInt(2000));
- barrier.leave(name);
- System.out.println(name + " leave");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
通过该Barrier,可以协调不同任务之间的同步处理,这里主要还是利用了Watcher机制的反向推送,避免客户端的循环polling动作,只要针对有事件的变化做一次响应。
集群管理
我不罗嗦,taobao有几篇文章已经介绍的很详细。
- http://rdc.taobao.com/blog/cs/?p=162 (paxos 实现)
- http://rdc.taobao.com/blog/cs/?p=261 (paxos算法介绍续)
- http://rdc.taobao.com/team/jm/archives/448 (zookeeper代码解析)
- Leader
- Follower
- Obserer
- server.1:localhost:2181:3181:observer
3. 可通过命令行,查看当前server所处的状态
- [ljh@ccbu-156-49 bin]$ echo stat | nc localhost 2181
- Zookeeper version: 3.3.3--1, built on 06/24/2011 13:12 GMT
- Clients:
- /10.16.4.30:34760[1](queued=0,recved=632,sent=632)
- /127.0.0.1:43626[0](queued=0,recved=1,sent=0)
- /10.16.4.30:34797[1](queued=0,recved=2917,sent=2917)
- Latency min/avg/max: 0/0/33
- Received: 3552
- Sent: 3551
- Outstanding: 0
- Zxid: 0x200000003
- Mode: follower ##当前模式
- Node count: 8
使用zookeeper,我们能干些什么?
官方文档中,有举了几个应用场景,就是使用zookeeper提供分布式锁机制,从而实现分布式的一致性处理。
典型的几个场景:
- Barrier
- Queue
- Lock
- 2PC
相关推荐
ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...
【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...
该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。
Zookeeper是一种重要的分布式协调服务,尤其在处理高可用性、高性能的应用场景中。它最初设计的核心功能是提供分布式锁服务,但随着社区的发展,Zookeeper的功能得到了扩展,现在还用于配置维护、组服务、分布式消息...
### ZooKeeper概述 ZooKeeper,如同其名字所暗示的那样,扮演着“动物园管理员”的角色,主要负责管理和协调各种分布式应用程序(如Hadoop、Hive、Pig等)。它是一个开源的分布式协调服务框架,旨在帮助开发者解决...
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
总的来说,尚硅谷2021年的ZooKeeper笔记提供了一套全面的学习资源,帮助开发者深入了解ZooKeeper的工作原理及其在分布式系统中的关键作用。通过深入学习和实践,可以提升在分布式协调领域的技术水平。
“zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...
Zookeeper是Apache Hadoop项目下的一个子项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。...通过深入学习和实践,可以更好地应对分布式环境中的各种挑战。
【Zookeeper概述】 Apache ZooKeeper 是一款开源的分布式协调服务,设计用于管理和简化分布式环境中的数据协调任务。它提供了一种简单、高可用且容错的机制,使得开发者可以专注于核心业务逻辑,而不是复杂的分布式...
### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。
本篇笔记主要围绕这两个技术进行深入探讨,结合尚硅谷的视频教程资源,旨在帮助读者全面理解并掌握这两者的核心知识。 一、Zookeeper:分布式协调服务 Zookeeper是由Apache开发的一款开源分布式协调服务,它提供了...
【Zookeeper概述】 Zookeeper是Apache Hadoop的一个子项目,主要设计用于解决分布式环境中的数据管理问题,如统一命名服务、状态同步、集群管理和配置管理等。作为一个分布式服务框架,Zookeeper采用Java编写,同时...
《Zookeeper一站式学习资料》是一份全面覆盖Zookeeper基础到高级知识的学习资源包,旨在帮助初学者快速入门并深入理解Zookeeper。这份资料包含了丰富的文本资料、视频教程以及相关的实践代码,是学习分布式协调服务...
而“尚硅谷大数据技术之Zookeeper.xmind”思维导图,则是将整个Zookeeper的知识体系以图形化的形式展现出来,帮助学习者梳理知识点,形成全面的认知框架。 总的来说,这个教程提供了从理论到实践的全面学习材料,...
【描述】"dubbo+zookeeper入门资源,可直接使用,适合新手练习使用"意味着这个压缩包包含了学习和实践这两个技术的基础材料。通过这个资源,初学者可以了解如何配置和使用Dubbo与Zookeeper来实现服务间的通信和管理...
Zookeeper作为分布式协调服务,其设计初衷就是为了帮助分布式系统维护数据的一致性。Zookeeper的实现基于一种被称为Paxos的算法,Paxos算法是解决分布式系统中一致性问题的一种经典算法。 Paxos算法的核心思想是...