03 ZooKeeper 命令以及相关Java操作框架

1 常用命令

1.1 服务端常用命令

在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作

  • 启动ZK服务: sh bin/zkServer.sh start 
  • 查看ZK服务状态: sh bin/zkServer.sh status 
  • 停止ZK服务: sh bin/zkServer.sh stop 
  • 重启ZK服务: sh bin/zkServer.sh restart

1.2 客户端常用命令

使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 命令行工具的一些简单操作如下:

  • 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
  • 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
  • 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
  • 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
  • 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 
  • 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败
  • 递归删除:rmr /zk将刚才创建的 znode 删除,子节点同时删除
  • 退出客户端: quit 
  • 帮助命令: help

1.3 ACL命令常用命令

getAcl
获取指定节点的ACL信息
create /testDir/testAcl deer # 创建一个子节点
getAcl /testDir/testAcl # 获取该节点的acl权限信息
setAcl
设置指定节点的ACL信息
setAcl /testDir/testAcl world:anyone:crwa # 设置该节点的acl权限
getAcl /testDir/testAcl # 获取该节点的acl权限信息,成功后,该节点就少了d权限

create /testDir/testAcl/xyz xyz-data # 创建子节点
delete /testDir/testAcl/xyz # 由于没有d权限,所以提示无法删除
addauth
注册会话授权信息

  • 1 Auth

addauth digest user1:123456 # 需要先添加一个用户
setAcl /testDir/testAcl auth:user1:123456:crwa # 然后才可以拿着这个用户去设置权限

getAcl /testDir/testAcl # 密码是以密文的形式存储的

create /testDir/testAcl/testa aaa
delete /testDir/testAcl/testa # 由于没有d权限,所以提示无法删除

退出客户端后:
ls /testDir/testAcl #没有权限无法访问
create /testDir/testAcl/testb bbb #没有权限无法访问

addauth digest user1:123456 # 重新新增权限后可以访问了

  • 2 Digest

auth与digest的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录

create /testDir/testDigest data
addauth digest user1:123456
setAcl /testDir/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa # 使用digest来设置权限

注意:这里如果使用明文,会导致该znode不可访问

通过明文获得密文
shell>
java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider deer:123456

deer:123456->deer:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=

  • 3 acl命令行ip

create /testDir/testIp data
setAcl /testDir/testIp ip:192.168.30.10:cdrwa

getAcl /testDir/testIp

1.4 常用四字命令

ZooKeeper 支持某些特定的四字命令字母与其的交互。用来获取 ZooKeeper 服务的当前状态及相关信息。可通过 telnet 或 nc 向 ZooKeeper 提交相应的命令 :

当然,前提是安装好了nc

echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader 
使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。 
echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。 
echo kill | nc 127.0.0.1 2181 ,关掉server 
echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。 
echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息 
echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。 
echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。 
echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。 
echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。 
echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

1.5 ZooKeeper 日志可视化

前面以及讲了两个非常重要的配置一个是dataDir,存放的快照数据,一个是dataLogDir,存放的是事务日志文件

java -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar:/soft/zookeeper-3.4.12/lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter log.1

1.6 ZooKeeper 快照可视化

java -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar:/soft/zookeeper-3.4.12/lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter log.1

2 zk原生API

2.1 zookeeper官方提供的java客户端API;

  • 创建会话
    public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
    long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)
  • 创建节点
    public String / void create(final String path, byte data[], List<ACL> acl,
    CreateMode createMode, StringCallback cb, Object ctx)
  • 读取数据
    public List<String> / void getChildren(final String path, Watcher watcher,
    Stat stat, Children2Callback cb, Object ctx)
    public List<String> / void getData(final String path, Watcher watcher,
    Stat stat, DataCallback cb, Object ctx)
  • 更新数据
    public Stat / void setData(final String path, byte data[], int version,
    StatCallback cb, Object ctx)
  • 检测节点是否存在
    public Stat / void exists(final String path, Watcher watcher,
    StatCallback cb, Object ctx)
  • 权限控制
    public void addAuthInfo(String scheme, byte auth[])
    watch
    org.apache.zookeeper.Watcher(KeeperState、EventType)
    (1)没有专门的API去注册watcher,依附于增删改查API;
    (2) watch是一次性产品
    (3) watch的process方法中,可对不同事件进行处理;

2.2 Zookeeper原生客户端在开发支持上的弊端

  • 会话的连接是异步的;
  • Watch需要重复注册 ;
  • Session重连机制;
  • 开发复杂性较高;

3 ZkClient

开源的zk客户端,在原生API基础上封装,是一个更易于使用的zookeeper客户端;

3.1 ZkClient的maven依赖

<!-- zkclient依赖 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

3.2 ZkClient的API

  • 创建会话(同步,重试)
    public ZkClient(final String zkServers, final int sessionTimeout,
    final int connectionTimeout, final ZkSerializer zkSerializer,
    final long operationRetryTimeout)
  • 创建节点(同步,递归创建)
    public String create(String path,Object data,final List<ACL> acl,CreateMode mode)
    public void createPersistent(String path,boolean createParents,List<ACL> acl)
    public void createPersistent(String path, Object data, List<ACL> acl)
    public String createPersistentSequential(String path,Object data,List<ACL> acl)
    public void createEphemeral(String path, Object data, List<ACL> acl)
    public String createEphemeralSequential(String path,Object data,List<ACL> acl)
  • 删除节点(同步,递归删除)
    public boolean delete(String path,int version)
    public boolean deleteRecursive(String path)
  • 获取节点(同步,避免不存在异常)
    public List<String> getChildren(String path)
    public <T> T readData(String path, boolean returnNullIfPathNotExists)
    public <T> T readData(String path, Stat stat)
  • **更新节点(同步,实现CAS,状态返回)
    public void writeData(String path, Object datat, int expectedVersion)
    public Stat writeDataReturnStat(String path,Object datat,int expectedVersion)
  • 检测节点存在(同步)
    public boolean exists(String path)
  • 权限控制(同步)
    public void addAuthInfo(String scheme, final byte[] auth);
    public void setAcl(final String path, final List<ACL> acl);
  • 监听器
序号 监听器 注册API
1 IZkStateListener (un)subscribeStateChanges(IZkStateListener listener)
2 IZkDataListener subscribeDataChanges(IZkStateListener listener)
3 IZkDataListener (un)subscribeChildChanges(IZkStateListener listener)

4 Curator

开源的zk客户端,在原生API基础上封装,apache顶级项目;

4.1 Curator的maven依赖

Curator采用Fluent风格API

<!-- curator依赖 -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.0.0</version>
</dependency>

对序列化支持不太好 http://blog.itpub.net/29254281/viewspace-2097459/

4.2 Curator的API

  • 创建会话(同步,重试)
    CuratorFrameworkFactory.newClient(String connectString, int sessionTimeoutMs,
    int connectionTimeoutMs, RetryPolicy retryPolicy)
    CuratorFrameworkFactory.builder().connectString("192.168.11.56:2180")
    .sessionTimeoutMs(30000).connectionTimeoutMs(30000)
    .canBeReadOnly(false)
    .retryPolicy(new ExponentialBackoffRetry(1000, Integer.MAX_VALUE))
    .build();
    retryPolicy 连接策略:
    RetryOneTime: 只重连一次.
    RetryNTime: 指定重连的次数N.
    RetryUtilElapsed: 指定最大重连超时时间和重连时间间隔,间歇性重连直到超时或者链接成功.
    ExponentialBackoffRetry: 基于"backoff"方式重连,和RetryUtilElapsed的区别是重连的时间间隔是动态的.
    BoundedExponentialBackoffRetry: 同ExponentialBackoffRetry,增加了最大重试次数的控制.

  • 创建节点
    client.create().creatingParentIfNeeded()
    .withMode(CreateMode.PERSISTENT)
    .withACL(aclList)
    .forPath(path, "hello, zk".getBytes());

  • 删除节点
    client.delete().guaranteed().deletingChildrenIfNeeded()
    .withVersion(version).forPath(path)

  • 获取节点
    client.getData().storingStatIn(stat).forPath(path);
    client.getChildren().forPath(path);

  • 更新节点
    client.setData().withVersion(version).forPath(path, data)

  • 判断节点是否存在
    client.checkExists().forPath(path);

  • 设置权限
    Build.authorization(String scheme, byte[] auth)
    client.setACL().withVersion(version)
    .withACL(ZooDefs.Ids.CREATOR_ALL_ACL)
    .forPath(path);

  • 监听器(避免反复监听)
    Cache是curator中对事件监听的包装,对事件的监听可以近似看做是本地缓存视图和远程zk视图的对比过程
    NodeCache 节点缓存用于处理节点本身的变化 ,回调接口NodeCacheListener
    PathChildrenCache 子节点缓存用于处理节点的子节点变化,回调接口PathChildrenCacheListener
    TreeCache NodeCache和PathChildrenCache的结合体,回调接口TreeCacheListener

  • 事务支持(保证一组操作的原子性)
    Collection<CuratorTransactionResult> results = client.transaction().forOperations(operations);

  • 异步支持
    引入BackgroundCallback接口,用于处理异步接口调用之后服务端返回的结果信息
    public void processResult(CuratorFramework client, CuratorEvent event)
    CuratorEventType 事件类型
    org.apache.zookeeper.KeeperException.Code 服务器响应码(标识结果)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容