zookeeper的一些知识

1、zookeeper下载安装命令

$ wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
$ tar -zxvf zookeeper-3.4.14.tar.gz
$ cd zookeeper-3.4.14
$ cd conf/
$ cp zoo_sample.cfg zoo.cfg
$ cd ..
$ cd bin/
$ sh zkServer.sh start

2、基本介绍

ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

ZooKeeper 的架构通过冗余服务实现高可用性。

Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

3、zookeeper集群搭建(3台虚拟机)

(1) 分别在三台虚拟机解压安装包,并且创建zoo.cfg

cd /installment/zookeeper-3.4.14/conf
cp zoo_sample.cfg zoo.cfg

(2) 创建myid文件,在zoo.cfg文件末尾添加以下信息

//文件内容写1,2,3之类这些编号,myid对应下面在cfg文件里面添加的id
vim /tmp/zookeeper/myid

端口的作用:

2181 : 对 client 端提供服务
2888 : 集群内机器通信使用
3888 : 选举 leader 使用
/**
server.id=ip:port:port
其中ip通过ifconfig获得
*/
server.1=192.168.3.33:2888:3888
server.2=192.168.3.35:2888:3888
server.3=192.168.3.37:2888:3888

(3) 关闭机器防火墙

systemctl stop firewalld

(4) 逐台机器启动zookeeper服务端

cd /installment/zookeeper-3.4.14/bin
sh zkServer.sh start
//查看启动状态
sh zkServer.sh status

启动成功并且加入集群(leader/follower)

(5) 启动客户端

sh zkCli.sh

(6) 关闭zookeeper

sh zkServer.sh stop

4、java客户端

(1) 客户端的 zookeeper 原生 API

public class ZookeeperClient {
    public static void main(String[] args) {
        try {
            final CountDownLatch countDownLatch = new CountDownLatch(1);
            ZooKeeper zooKeeper=
                    new ZooKeeper("192.168.142.130:2181,192.168.142.131:2181,192.168.142.132:2181",
                            4000, new Watcher() {
//                        @Override
                        public void process(WatchedEvent event) {
                            if(Event.KeeperState.SyncConnected==event.getState()){
                                //如果收到了服务端的响应事件,连接成功
                                countDownLatch.countDown();
                            }
                        }
                    });
            countDownLatch.await();
            //CONNECTED
            System.out.println(zooKeeper.getState());
            //添加节点
            zooKeeper.create("/runoob","0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//            zooKeeper.setData("/runoob","1".getBytes(),0);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }
    }

(2) 使用curator框架连接

Curator 是 Netflix 公司开源的一套 zookeeper 客户端框架,解决了很多 Zookeeper 客户端非常底层的细节开发工作,包括连接重连、反复注册 Watcher 和 NodeExistsException 异常等。

Curator 包含了几个包:

  • curator-framework:对 zookeeper 的底层 api 的一些封装。
  • curator-client:提供一些客户端的操作,例如重试策略等。
  • curator-recipes:封装了一些高级特性,如:Cache 事件监听、选举、分布式锁、分布式计数器、分布式 Barrier 等。
public class CuratorClient {
    public static void main(String[] args) throws Exception {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString("192.168.142.130:2181,192.168.142.131:2181,192.168.142.132:2181").sessionTimeoutMs(4000).retryPolicy(new ExponentialBackoffRetry(1000,3)).namespace("").build();
        curatorFramework.start();
        Stat  stat = new Stat();
        byte[] bytes = curatorFramework.getData().storingStatIn(stat).forPath("/runoob");
        System.out.println(new String(bytes));
        curatorFramework.close();
    }
}

5、znode

在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。

整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。

进入 zookeeper 安装的 bin 目录,通过sh zkCli.sh打开命令行终端,执行 "ls /" 命令显示:

ls /runoob

6、命令

//ls 命令用于查看某个路径下目录列表
ls path

//用于查看某个路径下目录列表,它比 ls 命令列出更多的详细信息
ls2 path

//用于获取节点数据和状态信息,path:代表路径,[watch]:对节点进行事件监听
get path [watch]

//用于查看节点状态信息,path:代表路径,[watch]:对节点进行事件监听
stat path [watch]

/**用于创建节点并赋值
[-s] [-e]:-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点,
path:指定要创建节点的路径,比如 /runoob,
data:要在此节点存储的数据
acl:访问权限相关,默认是 world,相当于全世界都能访问
*/
create [-s] [-e] path data acl

//用于修改节点存储的数据,path:节点路径,data:需要存储的数据,[version]:可选项,版本号(可用作乐观锁)
set path data [version]

//用于删除某节点,path:节点路径,[version]:可选项,版本号(同 set 命令)
delete path [version]

7、四字命令

使用nc(netcat)或者telnet向zookeeper提交命令

命令格式

echo [command] | nc [ip] [port]

四字命令

功能描述

conf

3.3.0版本引入的。打印出服务相关配置的详细信息。

cons

3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。

crst

3.3.0版本引入的。重置所有连接的连接和会话统计信息。

dump

列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。

envi

打印出服务环境的详细信息。

reqs

列出未经处理的请求

ruok

测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。

stat

输出关于性能和连接的客户端的列表。

srst

重置服务器的统计。

srvr

3.3.0版本引入的。列出连接服务器的详细信息

wchs

3.3.0版本引入的。列出服务器watch的详细信息。

wchc

3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。

wchp

3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。

mntr

3.4.0版本引入的。输出可用于检测集群健康状态的变量列表

8、节点特性

(1) 同一级节点 key 名称是唯一的

(2) 创建节点时,必须要带上全路径

(3) session 关闭,临时节点清除

(4) 自动创建顺序节点

(5) watch 机制,监听节点变化

(6) delete 命令只能一层一层删除 

9、权限控制ACL

10、实现分布式锁

可以使用curator框架的相关类

  • 1、InterProcessMutex:分布式可重入排它锁
  • 2、InterProcessSemaphoreMutex:分布式排它锁
  • 3、InterProcessReadWriteLock:分布式读写锁

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值