Zookeeper整理之入门篇

Posted Mr.zhou_Zxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper整理之入门篇相关的知识,希望对你有一定的参考价值。

Zookeeper

1 Zookeeper定义

Apache Zookeeper是一个开发和维护开源服务器得框架,它可以实现高度可靠的分布式协调。

2 Zookeeper的特点

  1. 半数以上存活即存活
  2. 搭建奇数台节点
  3. 生产中没有使用单台Zookeeper的情况,也就是至少3台
  4. 集群中只有一个leader,多个follower
  5. 全局数据保持一致,每个server保存一份相同的数据副本,client无论连接到哪一个server,数据都保持一致
  6. 分布式读写,更新请求转发,由leader实施(主从复制,读写分离)
  7. 更新请求顺序进行,来自同一个client的更新请求按照其发送的请求顺序执行(这个特点决定ZK不适合做海量数据的保存)
  8. 数据更新原子性,一次数据更新操作,要么全部成功,要么全部失败
  9. 实时性,在一定时间范围内,client能读到最新数据

3 Zookeeper安装

##1.解压缩
tar -zxvf zookeeper-3.4.5.tar.gz -C /opt/apps/
##2.配置环境变量
vim /etc/profile

export ZK_HOME=/opt/apps/zookeeper-3.4.5
export PATH=$PATH:$ZK_HOME/bin

source /etc/profile
##3.创建zkdata/myid,每个节点myid不同
eg1:192.168.130.110
mkdir zkdata
vim zkdata/myid
1
eg2:192.168.130.111
mkdir zkdata
vim zkdata/myid
2
eg2:192.168.130.112
mkdir zkdata
vim zkdata/myid
3
##4.配置zoo.cfg
mv conf/zoo_sample.cfg conf/zoo.cfg
vim zoo.cfg

dataDir=/opt/apps/zookeeper-3.4.5/zkdata

server.1=192.168.130.110:2888:3888
server.2=192.168.130.111:2888:3888
server.3=192.168.130.112:2888:3888

##5.启动

##服务端
sh zkServer.sh start/stop/status
##客户端
sh zkCli.sh

4 Zookeeper操作

指令作用案例
ls列举指定目录的子目录ls /
ls2列举指定目录的子目录以及元数据ls2 /
create创建新节点
-s 顺序节点
-e 临时节点
-c 容器节点
-t 可以给节点添加过期时间,默认禁用,
可以通过系统参数启用
create /hdfs hdfs
create -e /yarn yarn
create -s /mapreduce mr
get获取指定节点中的数据以及元数据get /hdfs
stat获取节点的元数据stat /hdfs
delete删除指定节点-要求它没有子节点delete /hdfs
rmr递归删除znodermr /hdfs
set修改指定节点的数据set /hdfs hadoop

5 Java API

5.1 导入Pom依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
</dependency>

5.2 配置本地的hosts

C:\\Windows\\System32\\drivers\\etc目录下的hosts文件,映射对应的IP

192.168.130.110 ha1

192.168.130.111 ha2

192.168.130.112 ha3

5.3 代码

  • Operation.java
package com.zookeeper;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test;

public class Operation {
    private static ZooKeeper zooKeeper = null;
    @Test
    public void init(){
        String connection = "ha1,ha2,ha3";
        int TimeOut = 3000;

        try {
            //操作zookeeper的服务器客户端对象
            zooKeeper = new ZooKeeper(connection, TimeOut, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("zookeeper");
                }
            });

            CURD.setZooKeeper(zooKeeper);
            /**
             * JavaAPI模拟指令
             */
            CURD curd = new CURD();

            //关闭连接
            zooKeeper.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //释放资源

    }
}
  • CURD.java
package com.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;

import java.util.List;

public class CURD {
    private static ZooKeeper zooKeeper;

    public static ZooKeeper getZooKeeper() {
        return zooKeeper;
    }

    public static void setZooKeeper(ZooKeeper zooKeeper) {
        CURD.zooKeeper = zooKeeper;
    }
    //查看路径下所有子目录
    @Test
    public void lsAll(){
        try {
            List<String> children = zooKeeper.getChildren("/", true);
            for (String child:children){
                System.out.println(child);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //创建节点
    @Test
    public void create(){
        try {
            zooKeeper.create("/hdfs","hdfs".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //删除节点
    @Test
    public void delete(){
        try {
            zooKeeper.delete("/hadoop",1);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //递归删除节点
    @Test
    public void rmr(){
        rmrs("/hdfs");
    }
    @Test
    public void rmrs(String path){
        try {
            String origin = path;
            //先获取子节点,判断有没有子节点
            List<String> children = zooKeeper.getChildren(path, true);
            //没有节点就删除
            if (children.size() == 0){
                zooKeeper.delete(path,0);
                return;
            }
            //有节点就删除
            for (String child : children){
                path = path + "/" + child;
                rmrs(path);
            }
            //删除自己本身节点
            zooKeeper.delete(origin,0);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //获取指定节点中的数据以及元数据
    @Test
    public void get() {
        try {
            Stat stat = new Stat();//元数据
            byte[] data = zooKeeper.getData("hdfs", true, stat);
            System.out.println(new String(data));
            System.out.println(stat.getCtime());
            System.out.println(stat.getVersion());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

以上是关于Zookeeper整理之入门篇的主要内容,如果未能解决你的问题,请参考以下文章

UNITY3D 游戏开发之二高级组件(GUI:LABELSCROLLVIEWTEXTFIELD…等)入门篇

一文带你了解大数据技术之Zookeeper(入门级)

Java面试题超详细讲解系列之十九Zookeeper篇

zookeeper入门之介绍与安装

大数据之Zookeeper:Zookeeper入门

CVPR2020论文分方向整理之检测篇(代码/论文解读/136篇打包下载)