ZooKeeper, HBase, Azkaban

ZooKeeper

一、ZooKeeper 简介

分布式协调服务

主要⽤用来解决分布式集群中应⽤用系统的一致性问题

  • ZooKeeper 本质上是⼀个分布式的⼩文件存储系统, 基于类似于⽂文件系统的⽬目录树⽅方式的数 据存储,并且可以对树中的节点进⾏行行有效管理理。

  • ZooKeeper 提供给客户端监控存储在zk内部数据的功能, 达到基于数据的集群管理理

    统一命名服务(dubbo)、分布式配置管理理(solr的配置集中管理理)、分布式消息队列列 (sub/pub)、分布式锁、分布式协调

1.1 ZooKeeper 架构

Leader

Leader 不是手动指定的,而是 Follower 选举出来的

核心组件,事务请求(写操作) 的唯一处理者

Follower

处理客户端非事务(读操作) 请求

转发事务请求给 Leader

Observer

针对访问量大的 ZooKeeper 集群,可以增加 Observer

观察 ZooKeeper 集群的最新状态变化,并将这些状态同步

对于 非事务请求,可以独立处理

对于 事务请求,会转发给 Leader 服务器

不会参与任何形式的投票,只提供非事务服务

不影响群事务处理能力的前提下,提升集群的非事务处理能力

1.2 ZooKeeper 特点

  1. Leader + 多个 Follower 的集群

  2. Leader 负责发起投票和决议,更新系统状态

  3. Follower 用于接受客户请求,并向 客户端返回结果,参与投票

  4. 集群中有 半数节点存活,集群就能正常服务

  5. 因为 全局数据一致,每个 server 保存一份相同的数据副本

  6. 更新请求顺序执行

  7. 数据更新原子性,一次数据更新,要么成功,要么失败

二、环境搭建

  1. 解压
tar -zxvf zookeeper-3.4.14.tar.gz -C ../servers/
  1. 修改配置文件, 创建 data 和 log 目录
  1. 添加 myid 配置

  2. 启动 zk

  3. 查看启动情况

  4. 集群启动停止脚本

三、数据结构 和 监听机制

ZooKeeper 数据模型 Znode

数据信息保存在若干数据节点 Znode 上,是 ZooKeeper 中最小的数据单位

Znode 组成 Znode 树的命名空间

3.1 Znode 类型

  • persistent 持久性节点
  • ephemeral 临时性节点
  • sequential 顺序性节点

持久性节点,直到删除操作才会被清除

临时节点,不能有子节点,其生命周期和客户端会话绑定在一起,会话结束后被清除

持久顺序节点,持久的节点,其节点名会有一个表示顺序的数字后缀

临时顺序节点,临时的节点,其节点名会有一个表示顺序的数字后缀

  • 事务 ID

事务 - 对物理和抽象的应用状态上的操作集合

通常指的是数据库事务,一般包含了⼀系列对数据库有序的读写操作

但是,事务是指能够改变 ZooKeeper 服务器器状态的操作

或更新操作,⼀般包括数据节点创建与删除、数据节点内容更新等操作

zk 中的事务指的是对zk服务器状态改变的操作(create, update data,更新字节点); zk 对这些事务操作都会编号,这个编号是⾃增长的被称为ZXID

3.2 Znode 状态信息

#使⽤用bin/zkCli.sh 连接到zk集群

[zk: localhost:2181(CONNECTED) 2] get /zookeeper
cZxid = 0x0
ctime = Wed Dec 31 19:00:00 EST 1969 mZxid = 0x0
mtime = Wed Dec 31 19:00:00 EST 1969 pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

ZNode 节点内容包括两部分: 节点数据内容 和 节点状态信息。此处数据内容是空

cZxid 就是 Create ZXID,表示节点被创建时的事务 ID。

ctime 就是 Create Time,表示节点创建时间。

mZxid 就是 Modified ZXID,表示节点最后⼀次被修改时的事务ID。

mtime 就是 Modified Time,表示节点最后⼀次被修改的时间。

pZxid 表示该节点的子节点列表最后⼀次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,⼦节点内容变更不会更新。

cversion 表示子节点的版本号。

dataVersion 表示内容版本号。

aclVersion 标识 acl 版本

ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0

dataLength 表示数据⻓长度。

numChildren 表示直系⼦子节点数。

3.3 Watcher 机制

实现 分布式数据的发布/订阅 功能

一对多的订阅关系,让多个订阅者同时监听某个主题对象,当主题对象状态变化时,会通知所有订阅者,并作出相应的处理

  • 客户端在向 Zookeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中
  • 当 Zookeeper 服务器触发 Watcher 事件后,会向客户端发送通知
  • 客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑

四、基础应用

4.1 命令行操作

客户端命令行

bin/zkCli.sh	连接本地的 zk 服务器
bin/zkCli.sh -server ip:port(2181)	连接指定的服务器

查看可用命令

[zk: localhost:2181(CONNECTED) 3] help
ZooKeeper -server host:port cmd args
	stat path [watch]
	set path data [version]
	ls path [watch]
	delquota [-n|-b] path
	ls2 path [watch]
	setAcl path acl
	setquota -n|-b val path
	history
	redo cmdno
	printwatches on|off
	delete path [version]
	sync path
	listquota path
	rmr path
	get path [watch]
	create [-s] [-e] path data acl
	addauth scheme auth
	quit
	getAcl path
	close
	connect host:port

创建节点

create [-s] [-e] path data acl
-s -e 分别指定节点特性(顺序 或 临时), 若不指定,则为 持久节点
  1. 创建顺序节点
create -s /zk-test 123

-s 顺序节点
/zk-test 节点名
123 节点内容
  1. 创建临时节点
create -e /zk-temp 123
  1. 创建持久节点
create /zk-permanent 123

读取节点

ls 查看节点
ls path

get 获取节点的数据内容和属性信息
get path

更新节点

set path data
如:
set /zk-permanent 456

删除节点

delete path
delete /zk-permanent

若删除节点存在子节点,则无法删除,需要先删除子节点

4.2 客户端操作

依赖:

<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.14</version>
	<type>pom</type>
</dependency>

<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
	<groupId>com.101tec</groupId>
	<artifactId>zkclient</artifactId>
	<version>0.2</version>
</dependency>

创建会话

package com.lagou.zk.demo;

import org.I0Itec.zkclient.ZkClient;

public class ZkDemo {
   

    public static void main(String[] args) {
   

        // 1. 获取 zkClient 对象
        final ZkClient zkClient = new ZkClient("linux121:2181");
        System.out.println("zkclient is ready");
    }
}

创建节点

// 2. 创建节点
// 持久节点, 注意递归创建节点,需要 设置 true
zkClient.createPersistent("/lagou-client/lagou-c1", true);
System.out.println("node is created");

删除节点

// 3. 删除节点
// 递归删除
zkClient.deleteRecursive("/lagou-client");
System.out.println("node is deleted");

监听节点变化

注意 监听器 可用对 不存在的节点 进行监听

监听⽬录下子节点发生改变,可以接收到通知,携带数据有⼦节点列表

3 监听⽬录创建和删除本身也会被监听到

package com.lagou.zk.demo;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;

public class Get_ChildNode_Change {
   

    public static void main(String[] args) throws InterruptedException {
   

        // 1. 获取 zkClient
        final ZkClient zkClient = new ZkClient("linux121:2181");

        // 2. 对指定节点进行监听,指定收到通知后的处理逻辑
        // 处理逻辑 通过重写 handleChildChange 方法实现
        zkClient.subscribeChildChanges("/lg-client", new IZkChildListener() {
   
            @Override
            public void handleChildChange(String path, List<String> childs) throws Exception {
   
                // 打印节点信息
                System.out.println(path + " child node changes - current children " + childs);
            }
        });

        // 3. 删除节点,验证监听是否有效
        zkClient.createPersistent("/lg-client");
        Thread.sleep(1000);
        zkClient.createPersistent("/lg-client/c1");
        Thread.sleep(1000);

        zkClient.delete("/lg-client/c1");
        Thread.sleep(1000);
        zkClient.delete("/lg-client");

        Thread.sleep(Integer.MAX_VALUE);
    }
}

监听、获取数据

监听数据变化的监听器,需要监听节点是否被删除,以及监听数据是否改变

zkClient.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值