其他分享
首页 > 其他分享> > Zookeeper学习

Zookeeper学习

作者:互联网

入门
1.1概述
基于观察者模式设计的分布式服务管理框架,存储和管理数据,接受观察者的注册,一旦数据发生变化,负责通知已经注册在Zookeeper上注册的哪些观察者,做出想要的反应。

1.2特点:
1) 一个leader,多个follower组成的集群。
2)集群中只要有半数以上的节点存货,集群就能正常服务,通常安装奇数。
3)群居数据一致。
4)更新请求顺序执行。
5)数据更新原子性。
6)实时性,在一定时间范围内,client能读到最新的数据。

1.3数据结构
与Unix文件系统类似,每个节点乘坐一个ZNode,默认存储1MB数据,通过路径唯一表示ZNode节点。

1.3应用场景
统一命名服务:对yingyong/fuwu进行统一命名。
统一配置管理:分布式下节点配置信息一致,配置修改,快速同步;配置发生变化,即是通知客户端。
统一集群管理:监听节点的实时状态。

安装
下载安装包->解压安装->对zoo.cfg文件修改->启动服务器->客户端连接
2.1配置参数
-tickTime:心跳时间,单位毫秒;
-initLimit:LF初始通信时限
-synLimit:LF同步通信时限
-dataDir:保存ZK中存储数据的地址
-cilentPort:客户端连接端口

集群安装
在存储数据的地址文件目录内创建myid文件,文件中添加编号;在zoo.cfg中配置server.A=:B:C:D。
3.1集群选举机制
分为第一次启动和非第一次启动两种情况。
3.2客户端命令
3.2.1节点类型:持久节点/短暂节点
-创建节点create /sanguo "diaochan"
-获取节点get -s /sanguo
-创建到带序号的节点 create -s
-创建短暂节点 create -e
-改变节点树 set /sanguo "zhenji"
-删除节点 delete /sanguo
3.2.2监听器原理
-get -w /sanguo 监听节点数据变化 只能监听一次收到的结果
-ls -w /sanguo 监听节点路径变化 监听一次
3.3客户端API

private String connectString="hadoop101";
private int sessionTimeout=2000;
private ZooKeeper zkclient;

@Test
public void init() throws IOException {
    zkclient=new ZooKeeper(connectString, sessionTimeout, new Watcher() {
        @Override
        public void process(WatchedEvent watchedEvent) {
            List<String> children= null;
            try {
                children = zkclient.getChildren("/",true);
                for(String child: children){
                    System.out.println(child);
                }
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    });
}

@Test
public void create() throws KeeperException, InterruptedException {
    String nodeCreated=  zkclient.create("/baidu","ssm".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}

@Test
public void getChildren(){
    List<String> children=zkclient.getChildren("/",true);
    for(String child: children){
        System.out.println(child);
    }
}

@Test
public void exist(){
    Stat stat=zkclient.exists("/baidu",false);
    System.out.println(stat==null?"not exist":"exist");
}

3.4写数据原理
直接访问Leader:自己先写,然后传递给follower,有半数节点写完就返回ack
直接访问Follower:自己先写然后转给Leader,半数后让follower返回ack

使用场景
4.1服务器动态上下线
4.2分布式锁->curator框架

标签:void,Zookeeper,children,学习,sanguo,zkclient,create,节点
来源: https://www.cnblogs.com/yhxc/p/16332700.html