Zookeeper是什么

  • 是一个为用户的分布式应用程序提供协调的服务
  • 也是为别的分布式程序服务的
  • 本身也是一个分布式程序(只要半数以上节点存储,就能正常提供服务)

集群里解决的问题:

Zookeeper上面刚提到,它是为别的分布式程序服务的。所以在高可用的也是用来服务,当然还有别的作用。Zookeeper是普通集群转变为高可用的重要手段,解决了单点故障的问题。ZooKeeper Server是奇数个的,是因为zookeeper中的选举机制,必须选举出超过一半以上的结果,来决定谁是Mster,用来防止脑裂

zookeeper的数据结构

这里写图片描述
- 每个子项目如NameSrevice都被称为znode,zondervan是被它所在的路径唯一标识为NameService/Server1
- znode可以有子节点,并且每个中的可以存储数据
- znode是由版本的,每个znode中才能出的数据可以有多个版本也就是一个访问路径中可以存储多份数据
- znode可以是临时节点,一旦创建了znode的客户端与服务器失去链接,这个znode也会自动删除
- zookeeper可以关联所有的slaver,当一个改变时所有slaver都会变化

zookeeper用javaAPI创建节点,和shell创建

import org.apache.zookeeper.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class ZKchuangjian {
    private ZooKeeper zooKeeper;  
    private final int SESSION_TIMEOUT=30000;  //超时时间
    private final String path="/info-node";  //节点名称
    @Before
    //连接到ZK
    public void init() throws IOException {
        zooKeeper=new ZooKeeper("hadoop-node3", SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
       //判断是否有这个节点如果有则删除
                if(watchedEvent.getType()== Event.EventType.NodeDeleted){
                    System.out.println("节点被删除了");
                    try {
                        createNode();
                    } catch (KeeperException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
    public void createNode() throws KeeperException, InterruptedException {
        Stat stat = zooKeeper.exists(path,true);
        //if判断没有则创建
        if(stat == null){
            System.out.println("开始创建节点");
            zooKeeper.create(path,"test".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
            //PERSISTENT表示永久,EPHEMERAL_SEQUENTIAL表示临时
            System.out.println("节点创建成功");
            zooKeeper.exists(path,true);
            Thread.sleep(1000);
        }else {

            System.out.println("节点存在");
        }
    }
    //断开连接
    @After
    public void close() throws InterruptedException {
        zooKeeper.close();
    }
    //run方法
    @Test
    public void run() throws KeeperException, InterruptedException, IOException {
        createNode();
        System.in.read();
    }
}

这里写图片描述

① 创建顺序节点

  使用 create -s /zk-…… 命令创建zk-test顺序节点
  
② 创建临时节点

  使用 create -e /zk-…… 命令创建zk-temp临时节点

③ 创建永久节点

  使用 create /zk-……命令创建zk-permanent永久节点

删除节点delete /zk-…….

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐