Apache Zookeeper

一、Zookeeper介绍

1.1 引言

1.注册中心

2.配置集中管理

3.集群管理

4.分布式锁, 分布式任务

5.队列的管理

1.2Zookeeper介绍

Zookpeeper本身Hadoop生态圈中的一个组件,Zookeeper强大的功能,在Java分布式架构中,也会频繁的使用Zookeeper。

Hbase 鲸鱼

Hive 蜜蜂

Hadoop 大象

Zookeeper 就是一个文件系统 + 监听通知机制

二、Zookeeper安装

Docker-compose.yml (Hub · DaoCloud)

version: "3.1"
services: 
   zk: 
     image: daocloud.io/daocloud/zookeeper:latest
     restart: always
     container_name: zk
     ports: 
       - 2181:2181

三、Zookeeper架构

3.1 Zookeeper的架构图

每一个节点都没有称为znode

每一个znode中都可以存储数据

节点名称是不允许重复的

3.2 znode类型

四种Znode

1.持久节点

永久的保存在你的Zookeeper

2.持久有序节点

永久的保存在你的zookeeper, 系统会给节点添加一个有序的序号。 /xx -> /xx00000001

3.临时节点

当存储的客户端和Zookeeper服务断开连接时,这个临时节点自动删除

4.临时有序节点

当存储的客户端和Zookeeper服务断开连接时,这个临时节点会自动删除,系统会给节点添加一个有序的序号。

3.3 Zookeeper的监听通知机制

客户端可以去监听Zookerper中的Znode节。

Znode改变时,会通知监听当前Znode的客户端

四、Zookeeper常用命令

1.查询

#查询当前节点下的全部子节点
ls 节点名称
#例子 ls /
#查询当前节点下的数据
get 节点名称
#例子 get /zookeeper

2.创建节点

create [-s] [-e] znode 名称 znode 数据
#-s: sequence, 有序节点
#-e: ephemeral, 临时节点

3.修改节点

set znode节点名称 新数据

4.删除节点数据

delete znode名称    #没有子节点名称
rmr znode名称       #删除当前节点和全部的了节点

五、Zookeeper集群

5.1 Zookeeper集群架构图

5.2 Zookeeper集群中节点的角色

1.Leader

Master 主节点

2.Follower

从节点,参于选举全新的Leader

3.Observer

从节点,不参于投票

4.Looking

正在找Leader节点

5.3 Zookeeper投票策略

1.每一个Zookeeper服务都会被分配一个全局唯一的myid,myid是一个数字。

2.Zookeeper在执行写数据时,每一个节点都有一个自己的FIFO队列。保证写每一个数据的时候,顺序是不会乱的,Zookeeper还会给每一个数据分配一个全局唯一的zxid,数据越新zxid就越大。

选举Leader:

1.选举出zxid最大的节点作为Leader

2.在zxid相同的节点中,选举出一个myid最大的节点,作为Leader。

5.4搭建Zookeeper集群

version: "3.1"
services: 
   zk1: 
      image: zookeeper
      restart: always
      container_name: zk1
      ports: 
        - 2181:2181
      environment: 
        ZOO_MY_ID: 1
        ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181  server.3=zk3:2888:3888;2181
   zk2: 
      image: zookeeper
      restart: always
      container_name: zk2
      ports: 
        - 2182:2181
      environment: 
        ZOO_MY_ID: 2
        ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181  server.3=zk3:2888:3888;2181
   zk3: 
      image: zookeeper
      restart: always
      container_name: zk3
      ports: 
        - 2183:2181
      environment: 
        ZOO_MY_ID: 3
        ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181  server.3=zk3:2888:3888;2181
        

六、Java操作Zookeeper( Zookeeper学习笔记(二)——Zookeeper的java客户端搭建_飞!!!!的博客-CSDN博客_persistent_with_ttl)

6.1 Java连接Zookeeper

1、创建Maven工程

2、导入依赖

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

3、编写连接Zookeeper集群的工具类

class ZkUtil {
    public static CuratorFramework cf(){
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 2);
        CuratorFramework cf= CuratorFrameworkFactory.builder().connectString("192.168.0.252:2181").retryPolicy(retryPolicy).sessionTimeoutMs(2000000).build();
        cf.start();
​
        return cf;
    }
}

4、测试类

6.2 Java操作Znode节点

1、查询

CuratorFramework cf = ZkUtil.cf();
​
@Test
public void selectZnode() throws Exception{
    List<String> strings = cf.getChildren().forPath("/");
​
    for(String string : strings){
        System.out.println(string);
    }
}
​
@Test
public void getData() throws Exception {
    byte[] bytes = cf.getData().forPath("/");
    System.out.println(new String(bytes, "UTF-8"));
}

2、添加

CuratorFramework cf = ZkUtil.cf();
@Test
public void create() throws Exception {
    //cf.create().withMode(CreateMode.PERSISTENT).forPath("/test/data", "study".getBytes());
​
    cf.create()
            //父节点不存在时会自动创建父节点
            .creatingParentsIfNeeded()
            //节点类型
            //PERSISTENT 、PERSISTENT_SEQUENTIAL 持久节点/持久有序节点
            //EPHEMERAL、EPHEMERAL_SEQUENTIAL    临时节点/临时有序节点
            //CONTAINER   容器节点
            //PERSISTENT_WITH_TTL、PERSISTENT_SEQUENTIAL_WITH_TTL    持久ttl节点,持久有序ttl节点
            .withMode(CreateMode.PERSISTENT)
            //节点路径
            .forPath("/curator/data","test".getBytes());
}

3、修改

 CuratorFramework cf = ZkUtil.cf();
 @Test
 public void update() throws Exception {
                           cf.setData().forPath("/curator/data","test222222222222222222222222222222222".getBytes());
    }

4、删除

 CuratorFramework cf = ZkUtil.cf();
 @Test
public void delete() throws Exception {
        cf.delete().deletingChildrenIfNeeded().forPath("/curator/data");
​
    }

5、查看znode的状态

   CuratorFramework cf = ZkUtil.cf();
   @Test
    public void stat() throws Exception {
        Stat stat = cf.checkExists().forPath("/test");
        System.out.println(stat);
​
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值