草庐IT

Zookeeper详解(从安装—入门—使用)

〖雪月清〗 2023-04-15 原文

Zookeeper详解(从安装—入门—简单使用)

🍋1.zookeeper概念

Zookeeper是 Apache Hadoop项目下的一个子项目,是一个树形目录服务。

Zookeeper翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、

Pig(小猪)的管理员,简称zk

Zookeeper是一个分布式的、开源的应用程序的协调服务。

zookeeper提供的主要功能包括:

  • 配置管理

在多个应用程序(或服务器)中,假如存在一些相同的配置信息,在对该配置信息进行修改时,我们需要一个一个进行修改,这样会大大增加维护的成本,不方便管理。这时如果使用一个专门放配置中心的组件,将相同的配置信息放在配置中心,需要的时候直接拉取,这样可以大大节约维护的成本, 而zookeeper即可实现配置中心的功能。

  • 分布式锁:

在多个用户访问同一台主机上的应用程序数据时,我们可以通过加锁解决并发操作的问题,但是如果有多台主机相同的应用程序要访问同一数据时,这个时候我们在一台主机上加锁是不能解决另一台主机的并发问题的,换句话说自己的锁只对自己有效并不影响别的 ,这个时候就需要分布式锁解决这类问题,我个人理解分布式锁像是从所有主机中抽取出来的一把锁,或者是有一把总锁对所有主机都有效。zookeeper可以实现分布式锁的功能

  • 集群管理:

zookeeper作为注册中心,管理服务提供方的ip地址端口号url信息,并在服务消费方请求需要时发送给服务消费方

🍋2.zookeeper的安装

🍊2.1环境准备:

zookeeper服务器是用Java创建的,运行在JVM之上。需要安装JDK7以上版本(最好JDK8或以上)

🍊2.2下载

官网下载地址:

Apache ZooKeeper

🍊2.3上传并安装

下载在本地之后可以把安装包上传到服务器或者虚拟机中,我使用的是服务器并远程shell连接

1.使用xshell 远程连接服务器,在opt目录下新建一个zookeeper目录

2.使用xftp将刚才下载的安装包上传到zookeeper目录下

3.进入zookeeper目录下解压

tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz 

4. 安装成功!

🍊2.4配置

进入conf配置目录

zoo_sample.cfg就是配置文件,但是此文件不能生效,需要名称为zoo.cfg的文件才能生效

改名复制一份配置文件

编辑配置文件zoo.cfg /tmp/zookeeper这个目录是zookeeper用于存储持久化的数据到本地的,但是服务器默认是没有的

进入opt/zookeeper目录下,新建一个目录zkdata(目录名随意取)用于存放zookeeper的持久化数据

复制此目录/opt/zookeeper/zkdata,将zoo.cfg配置文件中的dataDir修改为/opt/zookeeper/zkdata

保存退出!

🍊2.5启动zookeeper


启动成功!

🍋3.zookeeper内存模型

🍊3.1模型

🍊3.2模型的特点:

  • 每个子目录如/node1都被称作一个znode(节点)。这个znode是被它所在的路径唯一标识
  • znode可以有子节点目录,并且每个znode可以存储数据
  • znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份
    数据
  • znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通
    知设置监控的客户端

🍊3.3节点的分类:

1.持久节点(默认) 2.持久顺序节点 3.临时节点 4.临时顺序节点

1.create 节点path data

创建一个节点。并给节点绑定数据(默认是持久性节点)

2.create -s 节点path data

创建持久性顺序节点

3.create -e 节点path data

创建临时性节点

4.create -e -s 节点path data

创建临时顺序节点

(注意:临时节点不能含有任何子节点)

🍋4.zookeeper配置文件详解

🍋5.zookeeper客户端常用命令

连接ZooKeeper服务端
./zkCli.sh -server ip:port 如果是本机连接可以不写 ip:port

断开连接 quit

CRUD

1.设置(修改)节点值

set 节点path value

2.查看命令帮助
help

3.删除单个节点

delete 节点path

4.显示指定目录下节点

ls 目录名

5.删除带有子节点的节点

deleteall 节点path

6.创建节点

create 节点path value

7.获取节点值

get 节点path

8.查看路径下节点信息及子节点
ls s 节点路径

9.查看节点状态
stat 节点path


节点监听机制watch

客户端可以监测znode节点的变化。Zonode节点的变化触发相应的事件,然后清除对该节点的监

测。当监测一个znode节点时候,Zookeeper会发送通知给监测节点。在shell终端一个Watch事件是一个一次性

的触发器,当被设置了Watch的数据或者目录发生了改变的时候,则服务器将这个改变发送给设置了

Watch的客户端以便通知它们。

1.ls -w 节点path 监听节点目录的变化

🌰新建一个会话连接 对/app1的目录进行修改,增加一个子节点

然后监听就失效了,因为是一次性的

2.get -w 节点path 监听节点数据的变化

🌰修改节点信息

触发监听,并且之后监听就失效了

🍋6.Java客户端操作

导入zookeeper的依赖包和junit的测试包

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

🍊6.1连接zk server服务端

@Before
public void before() {
    //参数1  --> zk server 服务ip地址:端口号
    //参数2 -->  会话超时时间
    //参数3  --> 连接超时时间
    //参数4  --> 序列化方式
     zkClient = new ZkClient("ip:端口号", 60000 * 30, 60000, new SerializableSerializer());
 }

    private ZkClient zkClient;
   
@Test
    public void  test01(){
        System.out.println(zkClient);
    }

 @After
 public void after() {

     zkClient.close();
 }

打印出结果,成功连接!

🍊6.2创建节点

 @Test
public void test() {
     //创建持久节点
     zkClient.create("/app2", "xue", CreateMode.PERSISTENT);
   //创建持久顺序节点
     zkClient.create("/app3","yue", CreateMode.PERSISTENT_SEQUENTIAL);
     //创建临时节点
     zkClient.create("/app4","qing", CreateMode.EPHEMERAL);
     //创建临时顺序节点
     zkClient.create("/app5","haha",CreateMode.EPHEMERAL_SEQUENTIAL);

 }

🍊6.3查看某个节点信息

@Test
public void test2(){
    //查看某个节点数据,需要保证创建和获取的数据序列化方式相同,如果是在linux上创建的节点那么在Java上获取就会出现序列化不匹配的异常
    Object o = zkClient.readData("/app2");
    System.out.println(o);
    //查看节点状态
   Stat stat = new Stat();
      
         System.out.println(o);
    //查看节点创建时间
        System.out.println(stat.getCtime());
    //查看版本
        System.out.println(stat.getCversion());
    //查看id
        System.out.println(stat.getCzxid());

}

🍊6.4修改节点信息

zkClient.writeData("/app2","xueyueqing");

🍊6.5查看当前节点所有子节点

@Test
public  void test4(){

    List<String> children = zkClient.getChildren("/");
    for(String c : children ){
        System.out.println(c);
    }

}

🍊6.6监听

@Test
public  void test5() throws IOException {

  zkClient.subscribeDataChanges("/app1", new IZkDataListener() {
      //当前节点数据变化时触发
      @Override
      public void handleDataChange(String dataPath, Object o) throws Exception {
          System.out.println("当前节点路径"+dataPath);
          System.out.println("当前节点信息"+o);
      }
      //当前节点删除时触发
      @Override
      public void handleDataDeleted(String dataPath) throws Exception {
          System.out.println("当前节点路径"+dataPath);
      }
  });
     //阻塞当前监听
  System.in.read();
}

注意:在shell终端修改,Java是监听不了的,必须使用Java代码修改

🌰通过Java代码进行修改

监听成功!并发现Java代码进行监听是永久的,不是一次性的

   @Test
   public  void test6() throws IOException {
//监听节点目录变化
       zkClient.subscribeChildChanges("/app1", new IZkChildListener() {
           @Override
           public void handleChildChange(String s, List<String> list) throws Exception {
               System.out.println("父节点名称:"+s);
               System.out.println("发生变化后孩子节点名称:");
           for(String child : list){
               System.out.println(child);
           }
           }
       });
       //阻塞当前监听
       System.in.read();
   }

在/app1目录下创建节点name

监听成功!

有关Zookeeper详解(从安装—入门—使用)的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐