【手撸RPC框架】zookeeper入门(安装+常用命令)

news2024/9/28 11:22:55

在这里插入图片描述

🐼作者简介:一名大三在校生🎋
空有想法,没有实践,难成大事

专栏前言:探索RPC框架的奥秘

在这里插入图片描述

简介在现代软件开发中,随着微服务架构的普及,远程过程调用(RPC)框架成为了连接服务之间通信的桥梁。我有决定开发了一款高性能的RPC框架,它不仅实现了服务之间的高效调用,还集成了关键的服务治理功能,如负载均衡、熔断机制和限流策略,以确保系统的稳定性和可靠性。

核心技术本项目采用Netty作为其强大的底层通信组件,确保了网络通信的高效与稳定。同时,通过与ZooKeeper的结合,实现了服务的注册与发现,为服务治理提供了坚实的基础。

下面我将提供一个全面的视角,来理解RPC框架的内部工作原理及其在实际开发中的应用。欢迎大家持续关注订阅专栏!!!

文章目录

    • 专栏前言:探索RPC框架的奥秘
  • 【手撸RPC框架】zookeeper入门
    • 一、概述
    • 二、数据模型
    • 三、watcher机制
    • 四、Zookeeper安装
      • 下载Zookeeper
      • Zookeeper
      • 启动Zookeeper
      • 常用命令
      • 配置多节点(集群)模式
    • 五、Zookeeper基本操作命令
    • 欢迎添加微信,加入我的核心小队,请备注来意

【手撸RPC框架】zookeeper入门

一、概述

  • 概念:解释ZooKeeper是一个开源的分布式协调服务组件,用于构建可靠的分布式系统。它提供了一个高性能的、有序的、可靠的分布式数据存储和协调服务,简单的理解为一个内存数据库,特殊的数据结构和一些特性,他可以实现一些特殊的功能。
  • 应用场景:在分布式系统中我们经常使用ZooKeeper实现服务注册发现、分布式锁、配置管理、命名服务和分布式协调等功能。
  • 数据模型:ZooKeeper的数据模型是一个类似于文件系统的层次结构。每个节点称为ZNode,它可以存储数据和子节点。zookeeper中的ZNode可以分为持久节点和临时节点。
  • Watcher机制:ZooKeeper允许开发人员在节点上设置监视点,以便在节点发生更改时接收通知。

二、数据模型

ZooKeeper的数据模型是一个类似于文件系统的层次结构,被组织成一个树形结构,每个节点称为ZNode。ZNode是ZooKeeper中的基本数据单元,它可以存储数据和子节点

在这里插入图片描述

以下是ZooKeeper数据模型的详细说明:

  1. 树形结构:ZooKeeper的数据模型是一个树形结构,类似于文件系统的目录结构。整个树由根节点(称为"/")开始,每个节点可以有多个子节点。每个节点都有一个路径来唯一标识它,路径是由斜杠(/)分隔的一系列名称组成。
  2. ZNode:ZNode是ZooKeeper的基本数据单元,类似于文件系统中的文件或目录。每个ZNode可以存储一个字节数组作为其数据,可以是任意类型的数据,例如配置信息、状态信息等。每个ZNode还可以有多个子节点,形成层次结构
  3. 持久节点(Persistent Node):持久节点在创建后一直存在,直到主动删除。持久节点的数据和子节点都是持久的,即它们在节点创建后仍然存在,直到被显式删除。
  4. 临时节点(Ephemeral Node):临时节点的生命周期与客户端会话绑定,当会话结束(例如客户端关闭或与ZooKeeper集合的连接断开)时,临时节点将自动被删除。临时节点的数据和子节点也将随之被删除。
  5. 顺序节点(Sequential Node):顺序节点在创建时会自动分配一个全局唯一且递增的编号。顺序节点的编号由ZooKeeper集合维护,可以用于实现有序性或生成全局唯一的标识符。

三、watcher机制

Watcher机制是ZooKeeper中非常重要的概念,它允许客户端在ZooKeeper上设置监视点,以便在节点发生变化时接收通知。Watcher机制使得开发人员可以及时获取关于数据变化的通知,以便采取相应的操作。
以下是Watcher机制的详细说明:

  1. 注册Watcher:客户端可以通过在对节点进行操作时注册Watcher来设置监视点。例如,在创建、更新或删除节点时都可以注册Watcher。客户端在注册Watcher时需要指定监视的路径和Watcher对象。当指定路径的节点发生变化时,ZooKeeper会将通知发送给客户端。
  2. Watcher通知:当一个节点发生变化时,ZooKeeper会将通知发送给注册了Watcher的客户端。Watcher通知是一次性的,也就是说,当客户端接收到Watcher通知后,该Watcher将被移除,需要客户端重新注册Watcher才能再次接收通知。
  3. Watcher的类型:数据变更触发的Watcher(Data Watcher):当节点的数据发生变化时触发,例如节点的值被修改。子节点变更触发的Watcher(Child Watcher):当节点的子节点发生变化时触发,例如新增或删除子节点。连接状态变更触发的Watcher(Existence Watcher):当客户端与ZooKeeper集合的连接状态发生变化时触发,例如连接断开或重新连接。
  4. Watcher的触发流程:当一个节点发生变化时,ZooKeeper首先会**将通知发送给与该节点相关的Watcher。**客户端接收到Watcher通知后,需要处理通知并根据需要采取相应的操作,例如重新读取数据或重新注册Watcher。
  5. Watcher的注意事项:Watcher通知是异步的,客户端需要保证处理Watcher通知的代码是线程安全的。Watcher通知是最终一致性的,即ZooKeeper不能保证Watcher通知的实时性,只能保证最终一致性。Watcher通知是有序的,当多个Watcher同时触发时,ZooKeeper会按照注册顺序依次发送通知

通过理解Watcher机制,开发人员可以更好地利用ZooKeeper来实现分布式系统中的实时数据变更和协调操作。Watcher机制提供了一种高效且可靠的方式,使得分布式系统能够实时响应节点变化,保持数据的一致性。

安装Zookeeper可以通过以下步骤完成。我们将分为下载、配置和启动三个部分详细说明。

四、Zookeeper安装

下载Zookeeper

  1. 下载Zookeeper压缩包
    访问Zookeeper官网下载最新版本的Zookeeper。以zookeeper-3.7.0为例:

    wget https://downloads.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
    
  2. 解压压缩包

    tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
    
  3. 移动到适当的目录

    sudo mv apache-zookeeper-3.7.0-bin /usr/local/zookeeper
    

Zookeeper

  1. 进入配置目录

    cd /usr/local/zookeeper/conf
    
  2. 复制模板配置文件

    cp zoo_sample.cfg zoo.cfg
    
  3. 编辑zoo.cfg文件
    使用你喜欢的编辑器(如vimnano)打开zoo.cfg文件进行编辑:

    vim zoo.cfg
    

    以下是一些关键配置项,你可以根据需要进行调整:

    # Zookeeper数据存储的目录
    dataDir=/usr/local/zookeeper/data
    
    # 客户端连接的端口
    clientPort=2181
    
    # 配置最小会话超时时间(以毫秒为单位)
    tickTime=2000
    
    # 初始和后续同步跟随者与领导者之间的初始化连接超时时间
    initLimit=10
    syncLimit=5
    
  4. 创建数据目录
    确保配置文件中的数据目录存在:

    mkdir -p /usr/local/zookeeper/data
    

启动Zookeeper

  1. 进入Zookeeper根目录

    cd /usr/local/zookeeper
    
  2. 启动Zookeeper服务

    bin/zkServer.sh start
    
  3. 验证Zookeeper是否启动成功
    查看Zookeeper服务状态:

    bin/zkServer.sh status
    

    你应该会看到类似以下的输出,表示Zookeeper正在运行:

    Mode: standalone
    

常用命令

  • 停止Zookeeper服务

    bin/zkServer.sh stop
    
  • 重启Zookeeper服务

    bin/zkServer.sh restart
    
  • 连接到Zookeeper客户端

    bin/zkCli.sh -server 127.0.0.1:2181
    

配置多节点(集群)模式

如果你需要配置Zookeeper集群,可以在zoo.cfg文件中添加以下内容:

server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888

每个server.X代表一个Zookeeper节点,2888是节点之间通讯的端口,3888是选举端口。

每个节点的dataDir目录下需要有一个myid文件,文件内容为对应的server.X的X值,例如:

echo "1" > /usr/local/zookeeper/data/myid  # 对应server.1
echo "2" > /usr/local/zookeeper/data/myid  # 对应server.2
echo "3" > /usr/local/zookeeper/data/myid  # 对应server.3

这样,你就可以搭建一个简单的Zookeeper集群了。

五、Zookeeper基本操作命令

ZooKeeper提供了一组命令行工具(CLI)来与ZooKeeper集群进行交互。以下是一些常见的ZooKeeper命令:

  1. connect:
    • 连接到ZooKeeper集群。
    • 语法:connect host:port
  2. ls:
    • 列出指定路径下的子节点。
    • 语法:ls
  3. create:
    • 创建一个节点。
    • 语法:create
  4. get:
    • 获取指定节点的数据。
    • 语法:get
  5. set:
    • 设置指定节点的数据。
    • 语法:set
  6. delete:
    • 删除指定节点。
    • 语法:delete
  7. stat:
    • 获取指定节点的详细信息,包括数据版本、ACL权限等。
    • 语法:stat
  8. getAcl:
    • 获取指定节点的ACL(访问控制列表)权限信息。
    • 语法:getAcl
  9. setAcl:
    • 设置指定节点的ACL权限信息。
    • 语法:setAcl
  10. quit/exit:
  • 退出ZooKeeper命令行工具。
  • 语法:quit 或 exit

这些命令可以通过在ZooKeeper命令行工具中输入相应的命令来执行。使用这些命令,可以查看和操作ZooKeeper集群中的节点和数据,管理ACL权限,以及执行其他与ZooKeeper相关的操作。


在这里插入图片描述

欢迎添加微信,加入我的核心小队,请备注来意

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

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

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

相关文章

Mybatis左连接的实现方式

在使用 MyBatis Plus 进行数据库操作时,我们有时需要从多个表中获取数据。这篇文章将介绍如何在 MyBatis Plus 中实现左连接查询。我们将以两个表格为例,一个是部门领导表 (system_dept_leader),另一个是用户表 (system_user),并演…

tk 对文本设置下划线

import tkinter as tkdef underline_text():# 获取当前选中的文本范围selected_text text_widget.tag_ranges(tk.SEL)if selected_text:# 如果有文本被选中tag_name "underline"# 检查选中文本是否已经有下划线if text_widget.tag_names(selected_text[0]):if &quo…

Qt | 绘制直线与 QLineF 类

点击上方"蓝字"关注我们 01、绘制直线 02、Qline和QLineF 【1】QLine 是整型版本,成员函数较少,QLineF 是精度更高的浮点型版本,本文以 QLineF 类 进行讲解。 QLineF 类提供了一个二维向量,使用 QLineF 类绘制直线可以利用该类中的成员函数方便 的对线条的属…

【EIScopus稳检索-高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024)

大会官网:www.icbdss.org 大会时间:2024年8月16-18日 大会地点:中国-上海 接受/拒稿通知:投稿后1-2周内 收录检索:EI,Scopus *所有参会者现场均可获取参会证明,会议通知(邀请函)&…

vscode里最好用的A股量化神器

shares vscode 插件A 股量化交易系统后台开发语言 Go/Python gmsec算法使用:pytorchK 线标注中意榜黄金上穿全链路量化,行业板块分析,直接贴图。欢迎体验 源码地址: GitHub - xxjwxc/shares: A-share quantitative system. A股量…

Python学习笔记35:进阶篇(二十四)pygame的使用之音频文件播放

前言 基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。 我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前&#xff…

对接高德开放平台API

高德开放平台API: https://lbs.amap.com/ 一、天气查询 天气查询: https://lbs.amap.com/api/webservice/guide/api/weatherinfo adcode城市码表下载: https://lbs.amap.com/api/webservice/download Component public class WeatherUtil {Resourceprivate GdCon…

异步任务中传递用户信息的一种优雅写法

目录 前言基础写法测试示例 升级写法测试示例 前言 在异步任务中,我们通常会遇到子任务获取当前用户的场景。我们可能会采取ThreadLocal来存储主线程传递的用户信息。然后在业务开始时set,业务结束时remove,来保证不会出现OOM的场景。 基础…

vue使用 “xlsx-style“: “^0.8.13“ 报错

关于jszip not a constructor报错配置config.js文件后可能还报错的问题: 在node_modules处找到node_modules\xlsx-style\xlsx.js 文件。 将 if(typeof jszip undefined) jszip require(./jszip).JSZip;(应该在xlsx.js文件1339行左右) 替换成 if(typeof jszip und…

聚类分析方法(三)

目录 五、聚类的质量评价(一)簇的数目估计(二)外部质量评价(三)内部质量评价 六、离群点挖掘(一)相关问题概述(二)基于距离的方法(三)…

外贸达人的秘密武器:提升效率的插件神器

每一位外贸从业者都在寻找能够提升工作效率、优化业务流程的利器。今天,我要向大家介绍几款外贸工作中的实用的浏览器插件工具,它们将是你业务成功的得力助手。 语言翻译类: Acronyms:外贸交流中,缩写的快速识别至关重…

高级语言与机器级代码之间的对应

目录 一. 汇编语言的基础知识二. 常用的X86汇编指令三. AT&T格式和Intel格式四. 选择语句的机器级表示五. 循环语句机器级表示 \quad 一. 汇编语言的基础知识 \quad X86就是能被能够被以86结尾的CPU(如8086,80286,80386)支持的…

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

使用 Plotly.js 在 Vue 中创建交互式散点图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Plotly.js 在 Vue 中创建交互式散点图 应用场景介绍 Plotly.js 是一个功能强大的 JavaScript 库,用于创建交互式数据可视化。它支持各种图表类型,包括散点图、折线图和直方图。在…

分享:2024好的ai文章生成器下载资源 tzqsbic

在当今数字化的时代,ai技术的发展日新月异,为我们的生活和工作带来了诸多便利。其中,ai文章生成器作为一项创新的工具,给当代人们带来了很多好处,尤其是对于很多创作者,不仅能解决创作困难,而且…

【Python实战因果推断】30_双重差分1

目录 Panel Data 在讨论了干预效果异质性之后,是时候转换一下思路,回到平均干预效果上来了。在接下来的几章中,您将学习如何利用面板数据进行因果推断。 面板数据是一种跨时间重复观测的数据结构。在多个时间段观察同一单位,可以…

VMware虚拟机使用标准分区后对分区进行扩容

前言: 使用虚拟机创建系统后,/ 盘 想要扩容需要几步才能实现,下面将介绍具体流程 确定根分区磁盘以及分区号,和起始扇区和结束扇区 # 查看磁盘名称和分区 # 如下可看出根分区为 /dev/sda2 ,磁盘为sda [root192 ~]# ls…

【C++】继承(二)

目录 5、继承与友元 6、继承与静态成员 7、复杂的菱形继承和菱形虚拟继承 8、继承的总结与反思 5、继承与友元 友元关系不能继承,也就是说父类的友元不能访问子类的私有或保护的成员 class Student; class Person { public:friend void Display(const Person&a…

Struts 2.0.0 至 2.1.8.1 远程命令执行漏洞(CVE-2010-1870)

前言 CVE-2010-1870 是一个存在于 Apache Struts 2 中的漏洞,特别是在 Struts 2 动作框架中。这个安全缺陷允许远程攻击者通过操纵动态方法调用(DMI)功能在服务器上执行任意代码。当 DMI 功能启用时,框架可以接受和处理来自用户输…

交叉熵损失函数的使用目的(很肤浅的理解)

第一种使用方法 import torch from torch import nn # Example of target with class indices loss nn.CrossEntropyLoss() input torch.randn(3, 5, requires_gradTrue) target torch.empty(3, dtypetorch.long).random_(5) output loss(input, target) output.backward(…