当前位置: 首页 > news >正文

常见的锁和zookeeper

zookeeper

本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com

前言

只有光头才能变强。
文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/ZhongFuCheng3y/3y

上次写了一篇 什么是消息队列?以后,本来想入门一下 Kafka 的 (装一下环境、看看 Kafka 一些概念啥的)。后来发现 Kafka 用到了 ZooKeeper,而我又对 ZooKeeper 不了解,所以想先来学学什么是 ZooKeeper,再去看看什么是 Kafka。

ZooKeeper 相信大家已经听过这个词了,不知道大家对他了解多少呢?我第一次听到 ZooKeeper 的时候是在学 Eureka 的时候(外行人都能看懂的 SpringCloud,错过了血亏!),同样 ZooKeeper 也可以作为注册中心

后面听到 ZooKeeper 的时候,是因为 ZooKeeper 可以作为分布式锁的一种实现。

直至在了解 Kafka 的时候,发现 Kafka 也需要依赖 ZooKeeper。Kafka 使用 ZooKeeper 管理自己的元数据配置

这篇文章来写写我学习 ZooKeeper 的笔记,如果有错的地方希望大家可以在评论区指出。

一、什么是 ZooKeeper

从上面我们也可以发现,好像哪都有 ZooKeeper 的身影,那什么是 ZooKeeper 呢?我们先去官网看看介绍:

官网还有另一段话:

ZooKeeper: A Distributed Coordination Service for Distributed Applications

相比于官网的介绍,我其实更喜欢 Wiki 中对 ZooKeeper 的介绍:

(留下不懂英语的泪水)

我简单概括一下:

  • ZooKeeper 主要服务于分布式系统,可以用 ZooKeeper 来做:统一配置管理、统一命名服务、分布式锁、集群管理。

  • 使用分布式系统就无法避免对节点管理的问题 (需要实时感知节点的状态、对节点进行统一管理等等),而由于这些问题处理起来可能相对麻烦和提高了系统的复杂性,ZooKeeper 作为一个能够通用解决这些问题的中间件就应运而生了。

二、为什么 ZooKeeper 能干这么多?

从上面我们可以知道,可以用 ZooKeeper 来做:统一配置管理、统一命名服务、分布式锁、集群管理。

  • 这里我们不管统一配置管理、统一命名服务、分布式锁、集群管理每个具体的含义 (后面会讲)

那为什么 ZooKeeper 可以干那么多事?来看看 ZooKeeper 究竟是何方神物,在 Wiki 中其实也有提到:

ZooKeeper nodes store their data in a hierarchical name space, much like a file system or a tree data structure

ZooKeeper 的数据结构,跟 Unix 文件系统非常类似,可以看做是一颗,每个节点叫做 ZNode。每一个节点可以通过路径来标识,结构图如下:

那 ZooKeeper 这颗 “树” 有什么特点呢??ZooKeeper 的节点我们称之为 Znode,Znode 分为两种类型:

  • 短暂 / 临时 (Ephemeral):当客户端和服务端断开连接后,所创建的 Znode(节点) 会自动删除
  • 持久 (Persistent):当客户端和服务端断开连接后,所创建的 Znode(节点) 不会删除

ZooKeeper 和 Redis 一样,也是 C/S 结构 (分成客户端和服务端)

2.1 监听器

在上面我们已经简单知道了 ZooKeeper 的数据结构了,ZooKeeper 还配合了监听器才能够做那么多事的。

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

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

没错,通过监听 + Znode 节点 (持久 / 短暂 [临时]),ZooKeeper 就可以玩出这么多花样了。

三、ZooKeeper 是怎么做到的?

下面我们来看看用 ZooKeeper 怎么来做:统一配置管理、统一命名服务、分布式锁、集群管理。

3.1 统一配置管理

比如我们现在有三个系统 A、B、C,他们有三份配置,分别是ASystem.yml、BSystem.yml、CSystem.yml,然后,这三份配置又非常类似,很多的配置项几乎都一样。

  • 此时,如果我们要改变其中一份配置项的信息,很可能其他两份都要改。并且,改变了配置项的信息很可能就要重启系统

于是,我们希望把ASystem.yml、BSystem.yml、CSystem.yml相同的配置项抽取出来成一份公用的配置common.yml,并且即便common.yml改了,也不需要系统 A、B、C 重启。

做法:我们可以将common.yml这份配置放在 ZooKeeper 的 Znode 节点中,系统 A、B、C 监听着这个 Znode 节点有无变更,如果变更了,及时响应。

参考资料:

  • 基于 zookeeper 实现统一配置管理

  • https://blog.csdn.net/u011320740/article/details/78742625

3.2 统一命名服务

统一命名服务的理解其实跟域名一样,是我们为这某一部分的资源给它取一个名字,别人通过这个名字就可以拿到对应的资源。

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

  • 192.168.1.1
  • 192.168.1.2
  • 192.168.1.3
  • 192.168.1.4

别人访问www.java3y.com即可访问到我的机器,而不是通过 IP 去访问。

3.3 分布式锁

锁的概念在这我就不说了,如果对锁概念还不太了解的同学,可参考下面的文章

  • Java 锁?分布式锁?乐观锁?行锁?

我们可以使用 ZooKeeper 来实现分布式锁,那是怎么做的呢??下面来看看:

系统 A、B、C 都去访问/locks节点

访问的时候会创建带顺序号的临时 / 短暂 (EPHEMERAL_SEQUENTIAL) 节点,比如,系统 A 创建了id_000000节点,系统 B 创建了id_000002节点,系统 C 创建了id_000001节点。

接着,拿到/locks节点下的所有子节点 (id_000000,id_000001,id_000002),判断自己创建的是不是最小的那个节点

  • 如果是,则拿到锁。

  • 释放锁:执行完操作后,把创建的节点给删掉

  • 如果不是,则监听比自己要小 1 的节点变化

举个例子:

  • 系统 A 拿到/locks节点下的所有子节点,经过比较,发现自己 (id_000000),是所有子节点最小的。所以得到锁

  • 系统 B 拿到/locks节点下的所有子节点,经过比较,发现自己 (id_000002),不是所有子节点最小的。所以监听比自己小 1 的节点id_000001的状态

  • 系统 C 拿到/locks节点下的所有子节点,经过比较,发现自己 (id_000001),不是所有子节点最小的。所以监听比自己小 1 的节点id_000000的状态

  • ……

  • 等到系统 A 执行完操作以后,将自己创建的节点删除 (id_000000)。通过监听,系统 C 发现id_000000节点已经删除了,发现自己已经是最小的节点了,于是顺利拿到锁

  • …. 系统 B 如上

3.4 集群状态

经过上面几个例子,我相信大家也很容易想到 ZooKeeper 是怎么 " 感知 " 节点的动态新增或者删除的了。

还是以我们三个系统 A、B、C 为例,在 ZooKeeper 中创建临时节点即可:

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

除了能够感知节点的上下线变化,ZooKeeper 还可以实现动态选举 Master 的功能。(如果集群是主从架构模式下)

原理也很简单,如果想要实现动态选举 Master 的功能,Znode 节点的类型是带顺序号的临时节点 (EPHEMERAL_SEQUENTIAL) 就好了。

  • Zookeeper 会每次选举最小编号的作为 Master,如果 Master 挂了,自然对应的 Znode 节点就会删除。然后让新的最小编号作为 Master,这样就可以实现动态选举的功能了。

最后

这篇文章主要讲解了 ZooKeeper 的入门相关的知识,ZooKeeper 通过 Znode 的节点类型 + 监听机制就实现那么多好用的功能了!

当然了,ZooKeeper 要考虑的事没那么简单的,后面有机会深入的话,我还会继续分享,希望这篇文章对大家有所帮助~

参考资料:

  • 分布式服务框架 Zookeeper

  • https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html

  • ZooKeeper 初识整理 (老酒装新瓶)

  • https://lxkaka.wang/2017/12/21/zookeeper/

  • ZooKeeper

  • https://www.cnblogs.com/sunshine-long/p/9057191.html

  • ZooKeeper 的应用场景

  • https://zhuanlan.zhihu.com/p/59669985

Redis分布式锁

乐观锁和悲观锁

相关文章:

常见的锁和zookeeper

zookeeper 本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com 前言 只有光头才能变强。 文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/ZhongFuCheng3y/3y 上次写了一篇 什么是消息队列?以后,本来…...

经验总结:(Redis NoSQL数据库快速入门)

一、Nosql概述 为什么使用Nosql 1、单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据库就放不下了数据的索引(B Tree),一个机…...

form表单与模板引擎

文章目录 一、form表单的基本使用1、什么是表单2、表单的组成部分3、 <form>标签的属性4、表单的同步提交及缺点&#xff08;1&#xff09; 什么是表单的同步提交&#xff08;2&#xff09; 表单同步提交的缺点&#xff08;3&#xff09; 如何解决表单同步提交的缺点 二、…...

医院检验信息管理系统源码(云LIS系统源码)JQuery、EasyUI

云LIS系统是一种医疗实验室信息管理系统&#xff0c;提供全面的实验室信息管理解决方案。它的主要功能包括样本管理、检测流程管理、报告管理、质量控制、数据分析和仪器管理等。 云LIS源码技术说明&#xff1a; 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等…...

React 组件

文章目录 React 组件复合组件 React 组件 本节将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 “Hello World&#xff01;” 的组件&#xff0c;组件名为 HelloMessage&#xff1a; React 实例 <!DOCTYPE html> <html> <head> &…...

硕士学位论文的几种常见节奏

摘要: 本文描述硕士学位论文的几种目录结构, 特别针对机器学习方向. 1. 基础版 XX算法及其在YY中的应用 针对情况: 只有一篇小论文支撑. 第 1 章: 引言 ( > 5页) 1.1 背景及意义 (应用背景、研究意义, 2 页) 1.2 研究进展及趋势 (算法方面, 2 页) 1.3 论文结构 (1 页) 第 …...

找兄弟单词

描述 定义一个单词的“兄弟单词”为&#xff1a;交换该单词字母顺序&#xff08;注&#xff1a;可以交换任意次&#xff09;&#xff0c;而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如&#xff1a; ab 和 ba 是兄弟单词。 ab 和 ab 则不…...

python字典翻转教学

目录 第1关 创建大学英语四级单词字典 第2关 合并大学英语四六级词汇字典 第3关 查单词输出中文释义 第4关 删除字典中特定字母开头的单词 第5关 单词英汉记忆训练 第1关 创建大学英语四级单词字典 本关任务&#xff1a;编写一个能创建大学英语四级单词字典的小程序。 测…...

sentinel 随笔 3-降级处理

0. 像喝点东西&#xff0c;但不知道喝什么 先来段源码&#xff0c;看一下 我们在dashboard 录入的降级规则&#xff0c;都映射到哪些字段上 package com.alibaba.csp.sentinel.slots.block.degrade;public class DegradeRule extends AbstractRule {public DegradeRule(String…...

如何解决IP能ping通但无法上网的问题?

当我们在网络环境中遇到无法上网的问题时&#xff0c;可能会尝试使用ping命令来测试网络连接是否正常。如果ping测试成功&#xff0c;说明我们的IP地址能够和网络中其他设备进行通信&#xff0c;但是无法上网。这种情况下&#xff0c;我们需要采取一些措施来解决这个问题。本文…...

Autosar实践-CANTp

文章目录 前言一、CanTp是什么?二、Autosar配置三、诊断数据传输流程1.接收单帧失败,上层没有适当的buffer2.成功接收单帧3.成功发送单帧4.成功接收多帧5.成功发送多帧前言 CANTp模块作为提供数据拆包、组包、流控制传输的服务,在Autosar基础软件通信中起着至关重要的作用。…...

Redis简介

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的键值对&#xff08;key-value&#xff09;数据库&#xff0c;支持网络、可基于内存亦可持久化。 Redis的数据结构包括列表&#xff08;List&#xff09;、集合&#xff08;Set&#xff09;、有序集合&#…...

报错问题修改

Vue 项目报错&#xff1a;‘$‘ is not defined ( no-undef ) 错误原因是不认识 $ 符&#xff0c;他是 JQuery 中得符号&#xff0c;引入了 JQuery 文件里的函数报错onclick is not defined问题(作用域问题) window.onload function (){ onload function (){ 第二种方法…...

专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?

当前互联网流量红利已经逐渐消失&#xff0c;营销同质化愈发严重。在这样的背景下&#xff0c;催生了以为元宇宙 焦点的虚拟产业经济。元宇宙在各行各业中以不同形式快速萌生、成长&#xff0c;呈现出多元化的应用场景。尤其是众多品牌&#xff0c;将元宇宙视为品牌建设与营销新…...

加速开放计算产业化,OCTC五大原则瞄准需求痛点

回顾计算产业过去十余载的历程&#xff0c;开放计算始终是一个绕不开的核心焦点。 始于2011年Facebook发起的数据中心硬件开源项目--开放计算项目&#xff08;简称&#xff1a;OCP&#xff09;&#xff0c;开放计算犹如星星之火&#xff0c;不仅迅速形成燎原之势&#xff0c;更…...

【RabbitMQ】安装及六种模式

文章目录 安装rabbitmq镜像访问容器内部15672端口映射到外面的端口地址RabbitMQ六种模式Hello world模式Work queues模式Publish/Subscribe模式交换机fanout类型 Routing模式Topics模式RPC模式 rabbitmq&#xff1a;0->1的学习 学习文档&#xff1a;https://www.cnblogs.com…...

数据结构刷题(三十一):1049. 最后一块石头的重量 II、完全背包理论、518零钱兑换II

一、1049. 最后一块石头的重量 II 1.思路&#xff1a;01背包问题&#xff0c;其中dp[j]表示容量为j的背包&#xff0c;最多可以背最大重量为dp[j]。 2.注意&#xff1a;递推公式dp[j] max(dp[j], dp[j - stones[i]] stones[i]);本题中的重量就是价值&#xff0c;所以第二个…...

opencv_c++学习(四)

图像在opencv中的存储方式 在上图中可以看出&#xff0c;在opencv中采用的是像素值来代表每一个像素三通道颜色的深浅。 Mat对象 Mat对象是在OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题&#xff0c;是面向对象的数据结构。分了两个部分&#xff0…...

基于AT89C51单片机的篮球计时记分设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87771065 源码获取 主要内容: 基于51单片机设计篮球计时计分器,结合单片机串行接口原理,用AT89C51设计一个篮球比赛计分计时器,能够通过数码管显示分数和比赛时间(并设有…...

并发编程-Day2

并发编程 1.共享模型-内存 共享变量在多线程间的<可见性>问题与多条指令执行时的<有序性>问题 1.1Java内存模型 JMM它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存CPU指令优化等. JMM体现在&#xff1a; 原子性-保证指令不会受到线程上…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...