ZooKeeper能做什么?

这篇具有很好参考价值的文章主要介绍了ZooKeeper能做什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是 ZooKeeper

ZooKeeper 是一个高性能、集中化、分布式应用程序协调服务,是 Hadoop 和 Hbase 的重要组件,主要是用来解决分布式应用中用户经常遇到的一些数据管理问题,例如:统一命名服务、统一配置管理、统一集群管理、分布式锁等。

ZooKeeper 提供一种类似目录树结构的数据结构,跟 Unix 文件系统路径相似的节点,可以往这个节点存储或获取数据,而每个节点叫做 ZNode。每一个节点可以通过路径来标识。

结构图如下:

ZooKeeper能做什么?

Znode 分为两种类型:

  • 短暂/临时(Ephemeral):当客户端和服务端断开连接后,所创建的 Znode(节点)会自动删除
  • 持久(Persistent):当客户端和服务端断开连接后,所创建的 Znode(节点)不会删除
  • 前面我们知道了 ZooKeeper 的数据结构,ZooKeeper 还有一个十分重要的功能是注册监听器,ZooKeeper 配置监听器才能够做那么多事。

    监听器

    监听节点的数据变化事件包括:

    • 节点被创建
    • 节点上写入数据
    • 节点数据变化
    • 节点数据被删除
    • 节点本身被删除
    以上 5 种事件都会触发监听器

    监听器原理

    ZooKeeper能做什么?
    监听流程:

    1. 首先要有一个 main() 线程
    2. 在 main 线程中创建 Zookeeper 客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
    3. 通过 connect 线程将注册的监听事件发送给 Zookeeper
    4. 在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中
    5. Zookeeper 监听到有数据或路径变化,就会将这个消息发送给 listener 线程
    6. listener 线程内部调用了process()方法

    常见的监听场景有以下两项:

    • 监听Znode节点的数据变化
    • 监听子节点的增减变化

    ZooKeeper能做什么?
    通过监听 Znode 节点(持久/短暂[临时]),ZooKeeper 就可以玩出很多新花样了。

    这里需要注意的是:因为 ZNode 模型没有文件和文件夹的概念,每个节点既可以有子节点,也可以存储数据,而在 ZooKeeper 中,限制了每个节点只能存储小于 1 M 的数据,实际应用中,最好不要超过 1kb

    为什么要这么设计呢?原因有以下几点:

    • ZooKeeper 为了保证写入的强一致性,会严格按照写入的顺序串行执行,某个时刻只能执行一个事务。如果上一个事务执行耗时比较长,会阻塞后面的请求
    • 因为每个 ZooKeeper 的节点都存储了完整的数据,每个 ZNode 存储的数据越大,则消耗的物理内存也越大
    • 因为 ZooKeeper 中每个节点都存储了 ZooKeeper 的所有数据,每个节点的状态都要保持和 Leader 一致,同步过程至少要保证半数以上的节点同步成功,才算最终成功。如果数据越大,则写入的难度也越大

    接下来我们看一下 ZooKeeper 是怎么做到 统一配置管理、统一命名服务、分布式锁、集群管理的。

    统一配置管理

    程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难,一般要求一个集群中,所有节点的配置信息是一致的,比如 kafka 集群。对配置文件修改后,希望能够快速同步到各个节点上,在这种情况下,我们将程序的配置信息放在 ZooKeeper 的 ZNode 下,当有配置发生改变时,也就是 ZNode 发生变化时,可以通过改变 ZooKeeper 中某个目录节点的内容,利用 watcher 通知给各个客户端,从而更改配置。

    ZooKeeper能做什么?

    统一命名服务

    ZooKeeper 的命名服务功能主要是根据指定名字来获取资源或服务的地址,提供者等信息,利用 ZooKeeper 我们可以创建出唯一标识路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。这个路径就好比是一个仓库,这个仓库的地址是唯一的,这些仓库里面存了一些东西,当我们来到这个仓库,我们就能取到仓库里的东西。

    比如说,现在我有一个域名www.liancan.com,而这个域名下有多台机器:

    192.168.0.91

    192.168.0.93

    192.168.0.94

    192.168.0.95

    通过访问 www.liancan.com 就可以访问到我的机器,而不是通过 IP 去访问,如下图所示:

    ZooKeeper能做什么?
    通过访问 liancan 这个 Znode节点就可以拿到对应的 IP 地址。

    分布式锁

    ZooKeeper 实现分布式锁一般有两种方式。一种是保持独占,一种是控制时序。

    第一种方式:我们将 ZooKeeper 上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放出锁。

    第二种方式:/distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,编号最小的获得锁,没有获得锁的客户端监听编号比自己小的前一个节点,因为节点是顺序的,很容易找到自己的前一个节点,当监听到前一个节点删除节点释放锁,该客户端就会获得锁。这种方式避免了所有客户端需要监听一个节点和节点删除需要通知所有客户端的情况。

    注意:第一种方式不适用于客户端数量很大的情况,当一个客户端拥有第一把锁之后,所有的客户端都要去监听节点,节点的释放也会通知所有的客户端,这样会出现羊群效应。

    第二种实现方式:
    ZooKeeper能做什么?

    客户端 A 拿到 /distribute_lock 节点下的所有子节点,经过比较,发现自己(id_001),是所有子节点最小的。所以得到锁。

    客户端 B 拿到 /distribute_lock 节点下的所有子节点,经过比较,发现自己(id_002),不是所有子节点最小的。所以监听比自己小的节点 id_001 的状态。

    客户端 C 拿到 /distribute_lock 节点下的所有子节点,经过比较,发现自己(id_003),不是所有子节点最小的。所以监听比自己小的节点 id_002 的状态。

    等到客户端 A 执行完操作以后,将自己创建的节点 id_001 删除。通过监听,客户端 B 发现 id_001 节点已经删除了,发现自己已经是最小的节点了,于是顺利拿到锁。

    以此类推。。。。。。。

    集群管理

    在分布式环境中,掌握集群中每个节点的状态是有必要的,我们用zookeeper做集群管理可以实现检测是否有机器加入或者退出,还可以用来选举集群的master。

    要实现检测是否有机器退出,我们要在集群中的所有机器约定在父目录下创建临时目录节点,然后监听父目录节点的子节点变化情况。如果有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他的机器都将收到通知:这台机器离开了集群。检测是否有机器加入也是类似的过程。

    ZooKeeper能做什么?

    只要客户端 A 挂了,那/GroupMember/A这个节点就会删除,通过监听 GroupMember 下的子节点,客户端 B 和客户端 C 就能够感知到客户端 A 已经挂了(新增也是同理)

    总结

    这篇文章主要讲解了ZooKeeper 的入门相关的知识,解释 ZooKeeper 是什么,可以用来做什么,以及是怎么做到这些事情的,ZooKeeper 通过 Znode 的节点类型+监听机制就可以做到这么多事。文章来源地址https://www.toymoban.com/news/detail-515690.html

到了这里,关于ZooKeeper能做什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么样的服务器是高性能服务器?

    首先,高性能服务器应具备高处理能力。随着业务的不断扩展和数据量的爆炸性增长,高性能服务器需要具备强大的计算能力,能够快速处理各种复杂的业务和数据。这要求高性能服务器采用先进的处理器技术,如多核处理器、GPU加速等,以提高计算效率和响应速度。 其次,

    2024年02月20日
    浏览(52)
  • MyPerf4J一个高性能、无侵入的Java性能监控和统计工具,有点东西!

    背景 随着所在公司的发展,应用服务的规模不断扩大,原有的垂直应用架构已无法满足产品的发展,几十个工程师在一个项目里并行开发不同的功能,开发效率不断降低。 于是公司开始全面推进服务化进程,把团队内的大部分工程师主要精力全部都集中到服务化中。服务化

    2024年02月15日
    浏览(67)
  • 从零开始实现一个C++高性能服务器框架----Hook模块

    此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 项目介绍 :实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括

    2023年04月09日
    浏览(96)
  • 从零开始实现一个C++高性能服务器框架----Socket模块

    此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 项目介绍 :实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括

    2023年04月08日
    浏览(55)
  • 从零开始实现一个C++高性能服务器框架----环境变量模块

    此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 项目介绍 :实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括

    2024年02月02日
    浏览(52)
  • [AIGC] Nginx:一个高性能的 Web 服务器和反向代理

    Nginx(engine x)是一个高性能的 Web 服务器和反向代理,它由 Igor Sysoev 于 2002 年开发,并于 2004 年首次发布为开源软件。Nginx 是当今最受欢迎的 Web 服务器之一,它在互联网上被广泛使用,支持 millions 个网站和应用程序。 Nginx 是一个免费、开源、高性能的 Web 服务器和反向代理

    2024年02月20日
    浏览(60)
  • 实习选择:为什么高性能计算是你的最佳职业路径?

    在追求职业发展的道路上,实习是一个至关重要的里程碑。 然而,在众多的实习选择中,为什么高性能计算成为了你的最佳职业路径?让我们一起探索其中的原因。 高性能计算就业的好处是多方面的,以下是其中的一些主要好处: 薪资和福利优厚:高性能计算领域的就业通

    2024年02月06日
    浏览(88)
  • 基于 k8s+docker 环境构建一个高可用、高性能的 web 集群。

    目录 项目架构图 项目描述 项目环境 环境准备 IP地址规划 关闭selinux和firewall 配置静态ip地址 修改主机名 升级系统(可做可不做) 添加hosts解析 项目步骤 一.使用ProcessOn设计了整个集群的架构,规划好服务器的IP地址,使用kubeadm安装k8s单master的集群环境(1个master+2个node节点

    2024年02月07日
    浏览(67)
  • FastAPI + NGINX + Gunicorn:一步一步教你部署一个高性能的Python网页应用

    部署一个 FastAPI 应用到你的服务器是一项复杂的任务。如果你对 NGINX 、 Gunicorn 和 Uvicorn 这些技术不熟悉,可能会浪费大量的时间。如果你是刚接触 Python 语言不久或者希望利用 Python 构建自己的Web应用程序,本文的内容可能会让你第一次部署时更节省时间。 FastAPI 是用于开发

    2024年02月05日
    浏览(62)
  • 《高性能MySQL》——创建高性能的索引(笔记)

    索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。 在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时

    2024年02月07日
    浏览(112)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包