Zookeeper学习笔记(上)
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 集群介绍:
分布式系统的理解
基本概念: 多台计算机;彼此进行交互,通过网络进行通讯;共同目标
传统IT系统满足业务需求:
- 性能
- 可用性
- 数据安全
均是通过机器增加, 代码优化进行处理
分布式系统满足业务需求:
通过增加机器(横向扩展)
缺点:
- 数据一致性的难度
- 系统复杂性(软件结构,运维,开发调试)
- 不可靠因素增加
- 安全性
保证数据一致性:
数据复制
集中存储(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
Zookeeper 的构造函数进行服务端的连接(异步过程)
create() 创建节点
同步调用时: 如果已经存在则直接抛出异常
异步回调时: 如果已经存在, 则返回 name 属性为 null , 正常创建则会返回创建的节点名称 , 回调需要实现 StringCallback 接口
创建节点时需要设置 ACL 策略 : 可以使用预先定义的或者自定义的
delete() 删除节点
getChildren 获取子节点
getData : 获取节点数据
setData : 修改数据
exists : 节点是否存在
以上API需要注意的是, 可以有个同步调用或者异步调用的方式, 另外可以设置 watcher
Curator:
特色: Fluent 风格API :方法级联和方法链的实现
连接
新增连接超时(原有的超时为超过多少时间没有心跳消息而超时)
实现重试策略
实现指数倍增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();
创建节点:
client.getZookeeperClient().getZooKeeper().addAuthInfo("digest", "liubx11:111111".getBytes());
client.create().creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT).withACL(Ids.CREATOR_ALL_ACL)
.forPath(path, data);
删除节点
client.delete().guaranteed().deletingChildrenIfNeeded().withVersion(version).forPath(path);
获取数据 : getData
Stat stat = new Stat();
byte[] data = client.getData().forPath(path);
System.out.println(stat.toString());
更新数据 : setData
client.setData().withVersion(version).forPath(path, data);
读取子节点 : getChildren
List<String> children = client.getChildren().usingWatcher(new WatcherTest()).forPath("/curator");
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()));
}
}
});
异步执行:
通过调用inBackground() 方法实现, 需要传入回调函数, 或者执行线程池等..
回调函数需要实现 BackgroundCallback 接口
会有一个 CuratorEvent 的事件, 可以看到事件状态和返回码
//删除的异步执行
client.delete().guaranteed().deletingChildrenIfNeeded().withVersion(version)
.inBackground(new DeleteCallBack()).forPath(path);
Zookeeper学习笔记(上)的更多相关文章
- ZooKeeper 学习笔记
ZooKeeper学习笔记 1. zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
- ZooKeeper学习笔记(一)——概述
zookeeper学习笔记(一)--概述 1. 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.zookeeper从设计模式的角度来理解:是一个基于观察者设计 ...
- Zookeeper学习笔记(中)
Zookeeper学习笔记(中) Zookeeper的基本原理和基本实现 深入了解ZK的基本原理 ZK的一致性: ZAB 协议: Zookeeper 原子消息广播协议 ZK通过选举保证 leader ...
- ZooKeeper学习笔记一:集群搭建
作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...
- ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁
作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...
- zookeeper学习(上)
zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...
- ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心
作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...
- ZooKeeper学习笔记二:API基本使用
Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...
随机推荐
- iOS SDK开发之 .framework静态库
查看.a静态库的生成及使用单击此处 注:这篇教程将只使用一小部分Objective-C代码,本文主要讲解从开始到应用的详细步骤.环境:xcode 9.2下面我们开始操作: 第一步:创建一个静态库工程 ...
- 二、Jmter查看结果数只能显示有限的数据,查看全部数据
1.打开jmeter安装目录,找到bin目录下jmeter.properties文件 2.搜索:view.results.tree.max_size=10485760 3.将#号去掉,重启jmeter
- c++实验7 二叉树
二叉树数据结构表示及基本操作算法实现 1.所加载的库函数或常量定义及类的定义: #include<stdlib.h> #include<stdio.h> #include&qu ...
- 用U盘完成win10系统的安装
电脑太卡了,每次都要重装,然后每次忘记要从哪里开始动手,都要百度,仅以此篇记录下 目录 1.系统盘准备 2.从U盘启动安装 1.系统盘准备 第一步:在电脑中完成系统盘制作工具的安装,由于它是要依赖.n ...
- wpf 非窗体类中 异步调用窗体与控件
App.Current.Dispatcher.Invoke((Action)(() => { MessageBoxWindow mwb = ); mwb.ShowDialog(); return ...
- 在树莓派上搭建jupyter notebook server
自从搬家后,树莓派闲置了好一段时间,最近打算将其利用起来.想来想去,搭个jupyter notebook用要靠谱的,毕竟经常要实验一些Python脚本. 具体过程参考以下链接: https://www ...
- Tensorflow Learning1 模型的保存和恢复
CKPT->pb Demo 解析 tensor name 和 node name 的区别 Pb 的恢复 CKPT->pb tensorflow的模型保存有两种形式: 1. ckpt:可以恢 ...
- kettle入门大数据管理工具
研究 kettle 的使用 大佬博客:https://www.cnblogs.com/mq0036/p/9238646.html 国内镜像下载:http://mirror.bit.edu.cn/pen ...
- 2019JAVA第一次編程总结
2019第二周实验报告 Java实验报告 班级 计算机科学与技术二班 学号 20188442 姓名 吴怡君 完成时间 2019/9/7 评分等级 实验一 Java开发环境与简单Java程序 一. 实验 ...
- spring扩展点之PropertyPlaceholderConfigurer
原理机制讲解 https://leokongwq.github.io/2016/12/28/spring-PropertyPlaceholderConfigurer.html 使用时多个配置讲解 ht ...