zookeeper的典型应用场景

发布 : 2018-10-17 分类 : 后端 浏览 :

一、数据发布/订阅

数据的发布、订阅即所谓的配置中心,将数据发布到zookeeper一个或一系列节点上,供订阅者订阅,达到动态获取数据的目的

发布、订阅有两种设计,分别是推模式和拉模式

推模式:服务端主动发送更新数据到订阅的客户端

拉模式:客户端主动发起请求来获取最新的数据,通常是定时轮询

zookeeper采用推拉结合的方式:客户端向服务端注册需要关注的节点,当节点数据变化时,服务端发送watcher事件,客户端收到消息后再主动获取最新的数据

全局配置信息的特性:

  • 数据量小
  • 数据运行时动态变化
  • 集群中各机器共享,配置一致

例子:数据配置

用一个节点存放数据库配置信息,每台机器启动时获取配置信息,并注册watcher,当数据变化时客户端再获取数据

二、负载均衡

定义:对计算机、网络连接、CPU、磁盘驱动或其他资源进行分配负载,以达到优化资源利用、最大化吞吐率、最小化响应时间和避免过载的目的

通常分为硬件和软件负载均衡两类

一种动态的DNS服务 DNS是域名系统的缩写(Domain Name System) 可以看做是超大规模的分布式映射表,用于将域名和IP进行一一映射,方便通过域名访问互联网站点

三、命名服务

通过使用命名服务,客户端应用能够根据指定的名字获取资源实体、服务地址和提供者信息等

JNDI就是一种典型的命名服务,JNDI是java命名与目录接口的缩写(java Naming and Directory Interface)

全局唯一id,最易想到uuid,uuid是通用唯一识别码的缩写(universally Unique Identifier),最典型的实现就是GUID(Globally Unique Identifier,全局唯一标识符)

一个标准的UUid包含32位字符和4个短线的字符串

uuid的缺点:

  • 长度过长,意味着需要更多空间存储
  • 含义不明,字面上看不出任何其表达的含义,影响调试效率
  • 利用zookeeper API接口可以创建顺序节点,并返回节点的完整名字的特性,可以生成全局唯一id

四、分布式协调/通知

通过注册watcher,监听节点数据变化实现

五、集群管理

集群管理包括集群监控和集群控制

分布式日志收集系统

在线云主机管理

六、Master选举

在分布式式系统中,master用来协调集群中的其它系统单元,具有对分布式系统状态变更的决定权

广告投放系统后台

七、分布式锁

以前可以依赖关系型数据库固有的排他性实现不同的进程互斥,如行锁、表锁

排他锁

又称为写锁和独占锁,在加锁期间,其它事务不能对这个数据对象进行任何其它类型的操作

定义锁,java中是synchronized机制和ReentrantLock,zookeeper使用节点代表一个锁

获取锁,调用create接口,创建临时节点,最终只有一个客户端创建成功,就认为该客户端获取了锁,没获取锁的客户端注册watcher监听

释放锁,获取到锁的客户端宕机或客户端主动删除临时节点都会释放锁

共享锁

又称为读锁,若给数据加了共享锁,当前事务只能对数据进行读操作,其它事务也只能对数据进行加共享锁,直到该数据的所有共享锁被释放

定义锁,同样创建临时节点代表锁,但应该是临时顺序的节点

获取锁,直接在锁下创建临时顺序节点,如果是读请求,加读的标志,写请求则加写标志

判断读写顺序

1. 创建完节点后,获取锁下的所有子节点,并对该节点注册子节点变更的watcher监听

2. 确定自己的节点序号在所有子节点中的顺序

3. 对于读请求:

    如果没有比自己序号小的节点,或是所有比自己序号小的子节点都是读请求,那么表明自己已经成功获取到共享锁,开始执行读逻辑

    对于写请求:如果自己不是最小的子节点,进入等待

4. 接收到watcher通知后,重复步骤1

释放锁,与排他锁一致

羊群效应

集群规模较大时,服务端会产生大量的watcher通知,改进后的分布式锁实现

1. 客户端create临时顺序节点

2. 客户端调用getChildren获取已创建的子节点列表,但不注册watcher

3. 如无法获取共享锁,那么调用exist对比自己小的那个节点注册watcher

    读请求:向比自己序号小的最后一个写请求节点注册watcher

    写请求:向比自己序号小的最后一个节点注册watcher

4. 等待watcher,继续进入步骤2

八、分布式队列

FIFO:先进先出

getChildren获取队列的所有节点

确定自己的节点序号在所有子节点的顺序

如果不是序号最小,进入等待,同时向比自己序号小的最后一个节点注册watcher

接收watcher通知,重复步骤1

Barrier:分布式屏障

应用于大规模并行计算:最终的合并计算需要基于多个并行计算的子结果来进行

本文作者 : tangyi
原文链接 : http://ehedgehog.com/2018/10/17/zookeeper的典型应用场景/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹