api 创建zookeeper客户端_一文了解 Zookeeper 基本原理与应用场景

Zookeeper 是一个高性能、高可靠的分布式协调系统,是 Google Chubby 的一个开源实现,目前在分布式系统、大数据领域中使用非常广泛。本文将介绍 Zookeeper 集群架构、数据模型、监听机制,以及Zookeeper典型的应用场景等。

1. Zookeeper 集群角色

首先介绍下 Zookeeper 集群,一个 Zookeeper 集群通常由一组机器组成,一般3~5台集群就可以组成一个 Zookeeper 集群。集群拓扑图基本如下:

5b29c68bbcab73a8f0eb4345a05bb45d.png

Zookeeper 集群中每一个节点都会在内存中维护当前的节点状态,并且彼此之间保持着通信。这里说明一点,只要集群中存在过半的节点正常工作,整个集群就能够对外提供服务。

如上图,在 Zookeeper 集群中,有 Leader、Follower 和 Observer 三种类型的角色。

Leader

Leader 节点整个 Zookeeper 集群工作机制中的核心,主要工作是处理客户端的读写请求,及集群内部各服务的调度。注意只有 leader 能够处理写请求。

Follower

处理客户端的读请求,将写请求转发给 leader。参与 leader 选举投票等。

Observer

这是自 Zookeeper 3.3.0 版本引入的一个新的角色,主要是为了解决大规模 Server 场景下因 leader 选举投票成本增加导致写性能下降的问题。Observer 的工作原理和 follower 基本一致。处理客户端的读请求,将写请求转发给leader。和 follower 唯一的区别在于,Observer不参与任何形式的选举,包括 leader 选举。一般而言,中小型规模的 Zookeeper 集群中只包含 leader 和 follower 两个角色,这容易让我们忽略 observer 角色的存在。配置一个节点为 observer 也很简单,只需如下两步:

# 在observer节点的配置文件中添加如下配置
peerType=observer# 在每个节点的配置文件中,给observer节点添加:observer标识
# 例如:
server.1:localhost:2181:3181:observer

至此,相信你对 Zookeeper 的集群架构与相关角色有了一定认识。

2. Zookeeper 数据模型

Zookeeper 的数据模型是一棵类似 Unix 文件系统的 ZNode Tree 即 ZNode 树,但是没有引入传统文件系统的目录或者文件等概念,而是使用了称为 “数据节点” 的概念,术语叫做 ZNode。ZNode 是 Zookeeper 存储数据的最小单元,每个 ZNode 可以保存数据,也可以挂载子节点,其中根节点是 /。示意图如下:

562f95d69a37acbbe40990263a866f5d.png

使用过 Zookeeper 的同学应该都知道,Zookeeper 主要提供了两个核心功能:

  • 管理(存储、读取)客户端提交的数据;
  • 为客户端提供数据节点的监听服务;

这里就涉及到 Zookeeper 的两个重要特性,就是它的 ZNode 模型与 Watcher 机制。

ZNode 模型

前面讲到 Zookeeper 是由数据节点 ZNode 构成的,Zookeeper 中的每个数据节点都是有生命周期的,其生命周期的长短取决于 ZNode 的节点类型。ZNode 根据其生命周期和特点可分为 4 类。

50c060caf6bd81fca56940255efc07cc.png

分别是:

  • 持久性节点(PERSISTENT):客户端与 Zookeeper 断开会话后,该节点依旧存在,直到执行删除操作才会清除节点。
  • 持久性顺序节点(PERSISTENT_SEQUENTIAL):另一种持久节点,Zookeeper 会给该节点名称加上一个数字后缀,进行顺序编号。
  • 临时节点(EPHEMERAL):节点的生命周期和客户端的会话绑定在一起,客户端与 Zookeeper 断开会话后,该节点就会被自动删除。各个场景中很多都是利用 Zookeeper 临时节点这个特性的。
  • 临时顺序节点(EPHEMERAL_SEQUENTIAL):概念和上面类似,Zookeeper 也会给该节点进行顺序编号。

前面提及了 ZNode 是存储数据的最小单元,除了存储用户数据外,ZNode 还有以下特点:

  • 包含 ZNode 修改/访问的时间、事务id(zxid),ACL 权限、版本等状态信息;
  • 所有的事务请求在 ZNode 端都是顺序和原子性的;
  • 数据主要存储在内存中,磁盘中保存事务日志、快照数据等;

Watcher 机制

Watcher 机制也称监听机制,它是 Zookeeper 的关键特性,是通过 ZooKeeper 实现分布式发布/订阅、分布式锁、集群管理等功能的基础。

d89c73561f8918caa7b96b662bee8099.png

如上图所示,Zookeeper 允许客户端向服务端注册一个 Watcher 监听器,当服务端的一些指定事件触发了该监听,比如节点创建、删除,节点数据变更等事件,Zookeeper 就会向注册了监听器的客户端发送相应的事件通知。

3. 代码演示 Zookeeper 监听器

接下来我们看一下通过 Zookeeper 原生的客户端 API,创建 ZNode 数据节点,然后演示下 Zookeeper 监听器的基本使用。

引入依赖

首先,当前有一个包含3个节点的 Zookeeper 集群,我们根据 Zookeeper 版本引入了相应依赖,如下

<

演示代码

  • 创建 ZNode
private 

(可左右滑动)

执行完这个单元测试后,我们通过命令行在服务端查看一下该数据节点:

[zk: localhost:2181(CONNECTED) 48] get /my_node
123
cZxid = 0xdb6439ef2
ctime = Fri Feb 27 21:08:09 CST 2020
mZxid = 0xdb6439ef2
mtime = Fri Feb 27 21:08:09 CST 2020
pZxid = 0xdb6439ef2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
  • 删除 ZNode 节点,并监听该节点的删除动作
@Test

(可左右滑动)

代码执行后,可以看到控制台打印出了我们的日志:

21:41:07.870 [main-EventThread] INFO xxx - 注意:ZNode '/my_node' is deleted !

服务端查看该节点也已经不存在了:

[zk: localhost:2181(CONNECTED) 50] get /my_node
Node does not exist: /my_node

这里我们简单演示了下 Zookeeper 原始 API、监听器的使用,希望通过这个简单的demo,我们能对 Zookeeper 监听器有一个比较直观的认识。

4. Zookeeper 应用场景

Zookeeper 在分布式系统、大数据领域里应用广泛,这里总结了 8 个典型的应用场景:

数据发布/订阅

即所谓的配置管理或配置中心,拓扑图如下:

c4c273965723fcd69cb03e63b34d78f6.png

通常在分布式系统或集群中,所以节点的配置应该一致,比如Hadoop集群,要求对配置的修改,能够快速同步到各个节点中,可以通过 Zookeeper 实现:

  • 将配置信息写入 ZooKeeper 的一个 ZNode 中;
  • 各个节点在启动阶段从 Zookeeper 中获取配置,并注册一个数据变更的 Watcher 监听器;
  • 当 ZNode 中的数据被修改,ZooKeeper 将通知各个客户端节点,节点收到通知后进行配置更新;

负载均衡

负载均衡通常是一种动态的服务配置,拓扑图:

d753c5fa977f336cc333d5bcd252d51a.png

通常包含两部分:

  • 服务注册,服务提供者启动时会在某一个根 ZNode 节点下创建属于自己的子节点,并写入一些服务信息 比如IP:Port信息;
  • 服务解析,服务使用者在请求服务时会先获取根 ZNode 节点的子节点列表,即服务列表,然后通过一定的负载均衡算法 比如hash选取一个服务访问;

命名服务

又称 nameservice,这是比较常见的场景,Zookeeper 的命令服务主要有两个方向的应用:

87f24c4f7316ded9b97cc6845ef6d649.png
  • 提供类似 JNDI 的功能:就是把各种服务的名称,地址及其他信息放到 Zookeeper 中,使用时去读取,实现资源的定位和使用;
  • 利用 Zookeeper 顺序节点的特性,生成分布式的全局唯一 ID;

分布式协调/通知

主要是利用了 Zookeeper Watcher 的注册与异步通知机制,通常的做法是不同客户端都对 Zookeeper 的一个数据节点进行 Watcher 注册,监听数据的变化,当数据节点发生变化时,所有订阅的客户端都能接到通知并做相应处理。常见场景比如:

  • Master 节点定期检测 Slave 节点的状态,类似于心跳检测机制;
  • 信息推送,相当于一个发布订阅系统,和第一个场景类似;

集群管理

ec0ced4f93f73f0bbfd4e99d5fefc85d.png

主要包括两部分功能

  • 记录当前集群中有多少个节点在工作,以及节点的运行状态;
  • 对集群中的节点进行上下线方面的操作;

Master 选举

Master 选举是一个分布式系统中非常常见的场景,这里是利用 Zookeeper 的强一致性,保证只有一个客户端能够创建节点成功。

45d1d926a1d62532968984bb12b9bd8d.png

分布式锁

不同节点上的服务,可能需要同时访问一个资源,这事可能需要一把分布式锁。使用 Zookeeper 实现分布式锁主要基于以下特性:

  • ZooKeeper 的强一致性,保证只有一个客户端能够创建锁成功。
  • 锁的独占性,创建 ZNode 成功的客户端才能得到锁,其他客户端只能等待,当客户端用完释放锁时,其他客户端再次尝试创建 ZNode,获取分布式锁。

分布式队列

利用 Zookeeper 主要能够实现两种分布式队列:

  • 当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。 比如一个 job 由多个 task 组成,只有所有 task 完成后,job 才运行完成,可为 job 创建一个 /job 目录,然后在该目录下,为每个完成的 task 创建一个临时的 ZNode,一旦临时节点数目达到 task 总数,则表明 job 运行完成。
  • 利用 Zookeeper 的临时顺序节点特性,实现 FIFO 即先进先出的队列。

5. 总结

本文介绍了 Zookeeper 的集群架构,ZNode 数据模型,Watcher 监听机制,以及 Zookeeper 的典型应用场景。Zookeeper 在分布式系统应用非常广泛,主流的大数据组件比如HDFS、HBase、Kafka等也依靠 Zookeeper 做协调服务。通过本文的介绍,相信我们对 Zookeeper 有了进一步的掌握。

往期文章精选:

1、如何快速全面掌握Kafka?5000字吐血整理

2、一文读懂 HBase 核心原理与应用场景

3、京东JDHBase异地多活实践

4、美团点评基于 Flink 的实时数仓平台实践

085acb12f3ea561ced8460587f0f4614.png

如果您喜欢这篇文章,点【在看】与转发都是一种鼓励,期待得到您的认可 ❥(^_-)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android多个水波球,android球形水波百分比控件代码

本文主要介绍的是一个球形水波的百分比控件&#xff0c;市面上有各种形形色色的百分比控件&#xff0c;我一直觉得水波是最炫的&#xff0c;UI给了我这个机会&#xff0c;然而网上搜了一大堆&#xff0c;不是太复杂&#xff0c;代码太多(反正我是调不出效果来)&#xff0c;就是…

c++ 二维数组_【技术篇】C指针与二维数组深度辨析

一、源代码/*第01行*/ CLion 2019.3.4 x64中编写的源代码截图二、深度辨析CLion 2019.3.4 x64中编译的结果截图zippo[4][2]是一个四行二列的int型二维数组①不论一维数组还是二维数组&#xff0c;数组名就是指向数组首个元素的指针&#xff0c;也即数组名就是数组首个元素的…

shiro启动之后页面访问不了_java:shiro入门——4

【7】测试【7.1】启动点击apply然后点击OK【7.2】登录过滤访问http://localhost:8080/platform/home的时候&#xff0c;会被【7.3】角色过滤使用“admin”用户登录&#xff0c;密码&#xff1a;123根据SecurityServiceImpl我们可以知道使用admin账号登录成功之后&#xff1a;此…

oreo另一个意思_记一次有意思的统计(部分大宗商品价格指数相关性统计)

最近闲来无事&#xff0c;对部分大宗商品近十年的价格涨幅做了个统计&#xff0c;发现有些有意思的现象&#xff1a;大多资产价格走势如果放到一个足够长得时间维度里&#xff0c;那其实整体走势是比较一致的&#xff1b;有些资产价格走势高度相关&#xff0c;但是在某个时间段…

android左右耳机声音大小不一样,AirPods左右两边声音大小不同怎么办 单侧无声和两侧音量不同解决方法...

AirPods连接 iPhone 后如果出现了左右两边声音大小不一样&#xff0c;或者单侧无声的问题&#xff0c;可能是软件导致的暂时性故障&#xff0c;也有可能是硬件问题。当耳机音量出现异常时&#xff0c;可以通过以下几种方式尝试恢复。单侧无声和两侧音量不同解决方法&#xff1a…

laravel 任务队列_Laravel5.5之事件监听、任务调度、队列

流程&#xff1a;1.1 创建eventphp artisan make:event UserLoginLoginController.php/*** The user has been authenticated.** param IlluminateHttpRequest $request* param mixed $user* return mixed*/protected function authenticated(Request $request, $user){eve…

pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路

选自Medium作者&#xff1a;Victor Sanh机器之心编译参与&#xff1a;魔王过去一段时间&#xff0c;大模型层出不穷。在大家纷纷感叹「大力出奇迹」的时候&#xff0c;作为调用预训练语言模型最流行的库&#xff0c;HuggingFace 尝试用更少的参数量、更少的训练资源实现同等的性…

if test 多条件_秒懂Python编程中的if __name__ == #39;main#39; 作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ main:1 这段代码的功能一个python的文件有两种使用的方法&#xff1a;第一是直接作为脚本执行&#xff0c;第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ main: 的作用就是控制这两种情…

python背景颜色怎么随机_Python中的随机颜色

我同意TigerhawkT3&#xff08;1&#xff09;你教授对pick_color()的实现是垃圾。但我不认为random.choice()&#xff0c;或者你教授滥用random.shuffle()的方式是最好的选择。两者的问题是&#xff0c;在连续调用时可以获得相同的颜色&#xff0c;这是在正方形内绘制正方形时不…

python 解决手机拍的书籍图片发灰的问题

老师给发的作业经常是手机拍的&#xff0c;而不是扫描&#xff0c;背景发灰&#xff0c;如果二次打印就没有看了&#xff0c;象这样&#xff1a; 如果使用photoshop 处理&#xff0c;有些地方还是扣不干净&#xff0c;不如python 做的好&#xff0c;处理后如下&#xff1a; 具体…

2016年cypher资源_2021-2027年中国鱿鱼行业市场供需规模及未来前景分析报告

报告类型&#xff1a;产业研究报告格式&#xff1a;电子版、纸介版、电子纸介出品单位&#xff1a;智研咨询官网链接&#xff1a;中国产业信息网 - 产业前景投资趋势门户-智研旗下产业信息咨询平台​www.chyxx.com报告链接&#xff1a;2021-2027年中国鱿鱼行业市场供需规模及未…

地面控制点的定义与作用_什么是地面塌陷

地面塌陷2020年1月13日&#xff0c;青海西宁市城中区一公交车站附近地面突然塌陷&#xff0c;一辆搭载乘客的公交车掉入坑中&#xff0c;致使9人遇难。2019年12月12日&#xff0c;厦门吕厝路口地铁1号线和2号线外的配套物业开发项目施工现场发生约500平方米地面塌陷&#xff0c…

animate动画案例_animate动画案例——小小购物狂

如今各平台小动画层出不穷&#xff0c;大部分这种二维动画都是animate或者flash做的&#xff0c;例如下面这种效果animate既可以将各种内容做成动画。既可以设计适合游戏、电视节目和 Web 的交互式动画。让卡通和横幅广告栩栩如生。也可以用来创作动画涂鸦和头像。并向电子学习…

男孩子不上学了学计算机要学历吗,十三岁男孩不上学,能学什么手艺?

十三岁男孩不上学,能学什么手艺?十三岁时的孩子,有些学校要求我们先上过义务教育再去学习,有些学校是允许十三岁就直接接受教育的,有些学校是对十三岁还在上半学的学生进行补习一下的。那么,十三岁男孩不上学,可以学什么手艺?其实,有很多孩子对自己在学校学习时未能掌握的知识…

numpy 拼接_数据分析-numpy的拼接与交换

1.数组的拼接import numpy as npt1np.arange(24).reshape((4,6))t2np.arange(100,124).reshape((4,6))print(t1)print("*"*50)print(t2)print("*"*50)#竖直拼接t3np.vstack((t1,t2))print(t3)print("*"*50)#水平拼接t4np.hstack((t1,t2))print(t…

iptables 指定网卡_LINUX系统下的IPTABLES防火墙系统讲解(二)实战操作

iptables数据流方向iptables操作命令:#iptables --helpUsage: iptables -[AD] chain rule-specification [options]iptables -[RI] chain rulenum rule-specification [options]iptables -D chain rulenum [options]iptables -[LFZ] [chain] [options]iptables -[NX] chainipta…

java接口文档生成工具_接口文档生成

一、为什么要写接口文档&#xff1f;1.正规的团队合作或者是项目对接&#xff0c;接口文档是非常重要的&#xff0c;一般接口文档都是通过开发人员写的。一个工整的文档显得是非重要。2.项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发&#xff0c;项目维护中或者…

联想计算机如何设置用户名和密码忘了,联想(Lenovo)路由器无线wifi密码忘记了怎么办啊?...

联想(Lenovo)路由器无线wifi密码忘记了怎么办&#xff1f;忘记wifi密码这个问题&#xff0c;很多用户都会遇到。因为手机、笔记本、平板电脑在首次连接wifi信号后&#xff0c;会自动保存该wifi信号密码&#xff0c;以后会自动进行连接&#xff0c;无需用户手动输入wifi密码&…

mysql binlog查看_MySQL--17 配置binlog-server 及中间件

配置binlog-server修改mha配置文件[rootmysql-db03 ~]# vim /etc/mha/app1.cnf[binlog1]no_master1hostname10.0.0.53master_binlog_dir/data/mysql/binlog/备份binlog#创建备份binlog目录[rootmysql-db03 ~]# mkdir -p /data/mysql/binlog/#进入该目录[rootmysql-db03 ~]# cd …

桥梁在线计算机监测系统,桥梁在线监测系统

原标题&#xff1a;桥梁在线监测系统监测背景我国是个桥梁大国&#xff0c;据最新数据统计&#xff0c;我国超过100万座公路桥梁(不含市政桥梁)。影响桥梁的因素居多&#xff0c;人为因素、车辆长期超载、材料自身退化等&#xff0c;缺乏及时到位的管理养护导致结构各部分在远没…