Zookeeper学习笔记

本篇主要是一些基本的介绍和API的使用介绍, 有些只是记录了知识点,而没有完全在笔记中详细解释, 需要自行查找资料补充相关概念

主要参考了课程中的内容: Zookeeper分布式系统开发实战


Zookeeper 概述

简介:

  • 定义 : 分布式系统, 保证系统高可用, 并且高性能
  • 高性能, 分布式的, 分布应用协调服务
  • 使用文件系统目录树作为数据模型

ZK典型用用场景:

  • 注册订阅
  • 负载均衡
  • 命名服务
  • 分布式协调/通知
  • 集群管理

ZK基本概念:

  • 角色:在集群中的角色

    • leader
    • follower
    • observer:无投票权决定leader,只能获取数据
  • 会话 session
  • 数据节点: 树形数据结构
  • 数据节点分类
    • 持久节点
    • 临时节点
    • 顺序节点
  • 数据节点版本:
    • version : znode 数据版本
    • cversion : znode 的子节点版本
    • aversion
  • Watcher
  • ACL: access control lists

数据模型:

树形结构, ACL(访问控制)

Zookeeper 单机模式

安装: 解压缩

启动

  • 默认端口 2181
  • windows命令: bin/zkServer.cmd
  • unix命令: bin/zkServer.sh

Zookeeper 的命令

ls path [watch] //查看节点, 使用了 watch 之后有数据变化会收到通知

create

-s 为顺序节点
-e 为临时节点

get 获取数据内容和一些属性

set 更新节点数据内容

set path data [version] version //为指定要被更新的数据版本,如已被更新, 则操作失败

detele path [version] 为指定要被删除的数据版本,如已被更新, 则操作失败

Zookeeper 中的 Watch:

Zookeeper 中的 ACL:

每个节点的 ACL 不能继承, 需要单独设置

schema:各种访问控制策略

  • world
  • auth
  • digest
  • ip
  • ...

auth 的使用:

预先通过 addauth digest user:password 进行添加用户
setAcl /node2 auth:node2u:111111:crdwa
使用时, 需要通过 addauth digest user:password 进行设置之后, 才能访问相应的节点

ZK 集群介绍:

分布式系统的理解

  1. 基本概念: 多台计算机;彼此进行交互,通过网络进行通讯;共同目标

  2. 传统IT系统满足业务需求:

    • 性能
    • 可用性
    • 数据安全

      均是通过机器增加, 代码优化进行处理
  3. 分布式系统满足业务需求:

    通过增加机器(横向扩展)

    缺点:

    • 数据一致性的难度
    • 系统复杂性(软件结构,运维,开发调试)
    • 不可靠因素增加
    • 安全性

    保证数据一致性:

     数据复制
    集中存储(NAS , 分布式缓存等)

    Sharding:

     业务拆分
    数据拆分

ZK集群的设置:

所有集群的 zoo.cfg 中的集群配置一致

server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:12888:13888
server.3=127.0.0.1:22888:23888

在数据文件目录中有一个文件 myid , 内容为 server.X 对应的数字, 如果是 server.1 对应机器上, myid 内容即为1

Zookeeper API:

Zookeeper原生API

  1. Zookeeper 的构造函数进行服务端的连接(异步过程)

  2. create() 创建节点

    同步调用时: 如果已经存在则直接抛出异常

    异步回调时: 如果已经存在, 则返回 name 属性为 null , 正常创建则会返回创建的节点名称 , 回调需要实现 StringCallback 接口

    创建节点时需要设置 ACL 策略 : 可以使用预先定义的或者自定义的

  3. delete() 删除节点

  4. getChildren 获取子节点

  5. getData : 获取节点数据

  6. setData : 修改数据

  7. exists : 节点是否存在

以上API需要注意的是, 可以有个同步调用或者异步调用的方式, 另外可以设置 watcher

Curator:

特色: Fluent 风格API :方法级联和方法链的实现

  1. 连接

    新增连接超时(原有的超时为超过多少时间没有心跳消息而超时)

    实现重试策略

    实现指数倍增sleep时间

    ExponentialBackoffRetry

     RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    client = CuratorFrameworkFactory.builder()
    .connectString("192.168.1.195:2181")
    .sessionTimeoutMs(10000).retryPolicy(retryPolicy)
    .namespace("base").build();
    client.start();
  2. 创建节点:

     client.getZookeeperClient().getZooKeeper().addAuthInfo("digest", "liubx11:111111".getBytes());
    client.create().creatingParentsIfNeeded()
    .withMode(CreateMode.PERSISTENT).withACL(Ids.CREATOR_ALL_ACL)
    .forPath(path, data);
  3. 删除节点

      client.delete().guaranteed().deletingChildrenIfNeeded().withVersion(version).forPath(path);
  4. 获取数据 : getData

     Stat stat = new Stat();
    byte[] data = client.getData().forPath(path);
    System.out.println(stat.toString());
  5. 更新数据 : setData

     client.setData().withVersion(version).forPath(path, data);
  6. 读取子节点 : getChildren

     List<String> children = client.getChildren().usingWatcher(new WatcherTest()).forPath("/curator");
  7. Watcher 使用:

    • NodeCache:

    监听数据节点内容更新

    通过 NodeCacheListener 进行

    变动数据通过 NodeCache 获取

     public void addNodeDataWatcher(String path) throws Exception {
    final NodeCache nodeC = new NodeCache(client, path);
    nodeC.start(true);
    nodeC.getListenable().addListener(new NodeCacheListener() {
    public void nodeChanged() throws Exception {
    String data = new String(nodeC.getCurrentData().getData());
    System.out.println("path=" + nodeC.getCurrentData().getPath()
    + ":data=" + data);
    }
    });
    }
    • PathChildernCache

    监听指定节点的子节点变化情况:新增,子节点数据更新, 删除

    StartMode 的区别: NORMAL , POST_ INITIALIZED_EVENT

     final PathChildrenCache cache = new PathChildrenCache(this.client,
    path, true);
    cache.start(StartMode.POST_INITIALIZED_EVENT);
    System.out.println(cache.getCurrentData().size());
    cache.getListenable().addListener(new PathChildrenCacheListener() {
    public void childEvent(CuratorFramework client,
    PathChildrenCacheEvent event) throws Exception {
    if(event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)){
    System.out.println("客户端子节点cache初始化数据完成");
    System.out.println("size="+cache.getCurrentData().size());
    }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){
    System.out.println("添加子节点:"+event.getData().getPath());
    System.out.println("修改子节点数据:"+new String(event.getData().getData()));
    }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)){
    System.out.println("删除子节点:"+event.getData().getPath());
    }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
    System.out.println("修改子节点数据:"+event.getData().getPath());
    System.out.println("修改子节点数据:"+new String(event.getData().getData()));
    }
    }
    });
  8. 异步执行:

    通过调用inBackground() 方法实现, 需要传入回调函数, 或者执行线程池等..

    回调函数需要实现 BackgroundCallback 接口

    会有一个 CuratorEvent 的事件, 可以看到事件状态和返回码

     	//删除的异步执行
    client.delete().guaranteed().deletingChildrenIfNeeded().withVersion(version)
    .inBackground(new DeleteCallBack()).forPath(path);

Zookeeper学习笔记(上)的更多相关文章

  1. ZooKeeper 学习笔记

    ZooKeeper学习笔记 1.   zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...

  2. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  3. ZooKeeper学习笔记(一)——概述

    zookeeper学习笔记(一)--概述 1. 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.zookeeper从设计模式的角度来理解:是一个基于观察者设计 ...

  4. Zookeeper学习笔记(中)

    Zookeeper学习笔记(中) Zookeeper的基本原理和基本实现 深入了解ZK的基本原理 ZK的一致性: ZAB 协议: Zookeeper 原子消息广播协议 ZK通过选举保证 leader ...

  5. ZooKeeper学习笔记一:集群搭建

    作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...

  6. ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁

    作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...

  7. zookeeper学习(上)

    zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...

  8. ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心

    作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...

  9. ZooKeeper学习笔记二:API基本使用

    Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...

随机推荐

  1. lnmp源码搭建

      Nginx工作原理 这里需要结合Apache的工作,对PHP文件处理过程的区别 1:Nginx是通过php-fpm这个服务来处理php文件        2:Apache是通过libphp5.so ...

  2. @RequestMapping 和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法

    接下来讲解一下 @RequestMapping  和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法 @RequestMapping 为url映射路 ...

  3. Xcode10报错 library not found for -lstdc++ 问题解决

    在Xcode9上正常编译的项目,在Xcode10上编译可能会遇到如下错误: library not found for -lstdc++.6.0.9 library not found for -ls ...

  4. C/C++中的 void 和 void*

    转自:https://blog.csdn.net/tonglin12138/article/details/86516789 写在前面:开门见山,大家看下面这个例子: unsigned char er ...

  5. 设计模式(5): vue 不监听绑定的变量

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 绑定变量 一般情况下,如果我们需要在组件中使用某个变量,会这么使用: ...

  6. Jmeter之非GUI模式(命令行)执行

    在使用Jmeter进行性能测试时,建议使用非GUI模式执行. 命令行启动 1.进入jmeter安装的bin目录 2.执行Jmeter命令 如下: (1.jmeter.bat -n -t E:\apac ...

  7. unittest单元测试1

    一个简单的单元测试例子#coding:utf-8from selenium import webdriverimport unittestclass Baidu(unittest.TestCase): ...

  8. 2019JAVA第一次編程总结

    2019第二周实验报告 Java实验报告 班级 计算机科学与技术二班 学号 20188442 姓名 吴怡君 完成时间 2019/9/7 评分等级 实验一 Java开发环境与简单Java程序 一. 实验 ...

  9. 语言I—2019秋作业02

    这个作业属于那个课程 这个作业要求在哪里 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 参考文献 C语言程序设计I https://edu.cnblogs.com/campus/zswx ...

  10. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题:https://blog.csdn.net/jerrica/article/d ...