论文阅读-Zookeeper: Wait-free coordination for Internet-scale system

- 1 分钟前

Zookeeper: 无需等待的互联网规模协调系统

Zookeeper 是什么?动物园管理者?一图胜千言。Zookeeper 是由雅虎研发的顶层软件项目,为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

image-20221107173955674

目前,分布式应用往往是由多个独立的程序运行在多个机器上的,开发人员必须要处理协调逻辑和应用程序本身的逻辑。

image-20221108153726865

image-20221108153758367

image-20221108153824934

具体来说,需要为每个特定任务都开发一个协调逻辑:

总的来说:提供一个API来实现上述多个服务

ZooKeeper:提供了公共的API,以便于开发人员可以实现自己的原语。

专业术语定义

ZooKeeper 的数据模型

Znode

ZooKeeper API

方法 入参 返回值 说明
create path, data, flags String 创建znode
delete path, version void 删除znode
exists path, watch Stat  
getData path, watch (data, Stat) 获取znode数据和状态
setData path, data, version Stat 如果当前版本和入参

ZooKeeper 不提供句柄来访问 znodes;

所有的方法都有同步和异步两种实现方式。

ZooKeeper 原则

Zookeeper 线性写入:所有更新 Zookeeper 状态的请求都可序列化并服从优先级。

FIFO 客户端顺序:来自给定客户端的所有请求都按照客户端发送的顺序执行。

原语的例子

当选取一个新的主节点时,我们不希望其他进程使用的配置做出改变。如果新的主节点在配置文件更新的过程中挂了,我们不希望进程使用的是配置的一部分内容

因此,删除 ready 态的 znode,随后,znodes 更新各种配置文件,再创建ready 态的 znode。

1. 配置(Configuration)

  1. 新请求如何查询配置文件?
    • 假设配置文件存储在 /app1/config 路径下, ` getData(/app/config, true)`
  2. 管理员如何在运行时改变配置文件?
    • setData(/app1/config/config_data, -1)
  3. 其他程序如何读取新配置文件?
    • getData(/app1/config, true)

2. 组成员(Group Membership)

image-20221108175433393

3. 简单的锁(Simple Locks)

一个应用程序中的对象如何通过锁公用一个数据源?

image-20221108175225762

4. 没有羊群效应的简单锁(Simple Locks without Herd Effect)

Herd Effect 注:在计算机科学中,当事件发生时,大量等待事件的进程或线程被唤醒,但只有一个进程能够处理该事件时,就会出现从众问题。 当进程唤醒时,它们将各自尝试处理该事件,但只有一个会获胜。

image-20221108193034660

5. 读/写锁

image-20221108193220354

image-20221108200009555

吞吐量:设置250个客户端,每个客户端至少又 100 个未完成的请求(对1k数据的读或写)。

image-20221108200319692

总结

无需等待、事件排序、Watch 机制


Inger Notes © 2022
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora qq quora wechat