zookeeper的一篇概述

 www.lehu8.vip     |      2019-08-13 23:45
zookeeper的一篇概述
之前在公司由于业务需要,对zookeeper进行了一些知识点的梳理进行分享,对一些刚刚接触zookeeper的小伙伴来说,或许可以借鉴一下
 
一、ZOOKEEPER介绍
简介
 
Zookeeper致力于提供一个 高性能 、 高可用 ,且具备 严格的顺序访问 控制能力的分布式协调服务。
 
设计目标
简单的数据结构: 共享的树形结构,类似文件系统,存储于内存;
可以构建集群: 避免单点故障,3-5台机器就可以组成集群,超过半数,正常工作就能对外提供服务;
顺序访问: 对于每个写请求,zk会分配一个全局唯一的递增编号,利用 这个特性可以实现高级协调服务;
高性能: 基于内存操作,服务于非事务请求,适用于读操作为主的业务 场景。3台zk集群能达到13w QPS;
应用场景
数据发布订阅
负载均衡
命名服务
Master选举
集群管理
配置管理
分布式队列
分布式锁
二、zookeeper特性
会话(session):客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输;
 
数据节点(znode)
持久节点(PERSISTENT)
持久顺序节点(PERSISTENT_SEQUENTIAL)
临时节点(EPHEMERAL)
临时顺序节点(EPHEMERAL_SEQUENTIAL) 
对于持久节点和临时节点,同一个znode下,节点的名称是唯一的:[center red 20px] 
 
Watcher 事件监听器:客户端可以在节点上注册监听器,当特定的事件发生后,zk会通知到感兴趣的客户端。
 
EventType: NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChange
 
ACL:Zk采用ACL(access control lists)策略来控制权限
 
权限类型:create,read,write,delete,admin
 
三、zookeeper常用命令
启动ZK服务: bin/zkServer.sh start
查看ZK服务状态:bin/zkServer.sh status
停止ZK服务: bin/zkServer.sh stop
重启ZK服务: bin/zkServer.sh restart
客户端连接:zkCli.sh -server 127.0.0.1:2181
显示目录:ls /
创建:create /zk “test”
获得值:get /zk
修改值:set /zk “test”
删除:delete /zk
ACL:
getAcl / setAcl
addauth
四、zookeeper的java客户端
<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
</dependency>
<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
 </dependency>
public class App {
    public static void main(String[] args) throws Exception {
        String connectString = "211.159.174.226:2181";
 
        RetryPolicy retryPolicy = getRetryPolicy();
        CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, 5000, 5000, retryPolicy);
        client.start();
 
        //增删改查
        client.create().withMode(CreateMode.PERSISTENT).forPath("/test-Curator-PERSISTENT-nodata");
        client.create().withMode(CreateMode.PERSISTENT).forPath("/test-Curator-PERSISTENT-data", "test-Curator-PERSISTENT-data".getBytes());
        client.create().withMode(CreateMode.EPHEMERAL).forPath("/test-Curator-EPHEMERAL-nodata");
        client.create().withMode(CreateMode.EPHEMERAL).forPath("/test-Curator-EPHEMERAL-data", "/test-Curator-EPHEMERAL-data".getBytes());
 
        for (int i = 0; i < 5; i++) {
            client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test-Curator-PERSISTENT_SEQUENTIAL-nodata");
        }
 
        byte[] bytes = client.getData().forPath("/test-Curator-PERSISTENT-data");
        System.out.println("----------zk节点数据:" + new String(bytes) + "------------");
 
        client.create().withMode(CreateMode.PERSISTENT).forPath("/test-listener", "test-listener".getBytes());
        final NodeCache nodeCache = new NodeCache(client, "/test-listener");
        nodeCache.start();
        NodeCacheListener listener = new NodeCacheListener() {
 
            @Override
            public void nodeChanged() throws Exception {
                System.out.println("node changed : " + nodeCache.getCurrentData());
            }
        };
        nodeCache.getListenable().addListener(listener);
 
        client.setData().forPath("/test-listener", "/test-listener-change".getBytes());
 
    }
    /**
     * RetryOneTime: 只重连一次.
     * RetryNTime: 指定重连的次数N.
     * RetryUtilElapsed: 指定最大重连超时时间和重连时间间隔,间歇性重连直到超时或者链接成功.
     * ExponentialBackoffRetry: 基于"backoff"方式重连,和RetryUtilElapsed的区别是重连的时间间隔是动态的
     * BoundedExponentialBackoffRetry: 同ExponentialBackoffRetry,增加了最大重试次数的控制.
     */
    public static RetryPolicy getRetryPolicy() {
        return new ExponentialBackoffRetry(1000, 3);
标签:www.lehu8.vi

上一篇:周鸿祎首次深度解密360安全大脑战略战术:打!
下一篇:LPR背后,银行面临的真正挑战是什么?