Zookeeper选举方式,watch机制及基本操作

一、概念

1、Zookeeper是一个分布式协调服务的开源框架,本质是一个分布式的小文件存储系统,主要用来解决分布式集群中,应用系统的一致性问题。

2、架构图
在这里插入图片描述

  • Leader (Zookeeper集群工作的核心)
    事务请求(写操作) 的唯一调度和处理者,保证集群事务处理的顺序性;
    集群内部各个服务器的调度者。
    *事务:对于 create, setData, delete 等有写操作的请求,则需要统一转发给leader 处理, leader 需要决定编号、执行操作,这个过程称为一个事务。
  • Follower:
    处理客户端非事务(读操作) 请求,
    转发事务请求给 Leader;
    参与集群 Leader 选举投票 2n-1台可以做集群投票。
  • Observer:observer不参加投票,主要解决当follower过多,投票时间长的问题。
    观察者角色,观察 Zookeeper 集群的最新状态变化并将这些状态同步过
    来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给 Leader
    服务器进行处理。
    不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务
    处理能力的前提下提升集群的非事务处理能力。

3、特性:全局一致性,可靠性,顺序性,数据更新原子性,实时性

4、Zookeeper的数据模型
ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,拥有一个层次的命名空间,都是采用树形层次结构,ZooKeeper 树中的每个节点被称为—Znode。
和文件系统的目录树一样,ZooKeeper 树中的每个节点可以拥有子节点。
不同点:1. Znode 兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、 时间戳等数据结构,又像目录一样可以作为路径标识的一部分,并可以具有 子 Znode。用户对 Znode 具有增、删、改、查等操作(权限允许的情况下)。
临时节点下不能有子节点

5、、Zookeeper的主要实现方式
注册、监听、回调函数
对外:
不要求强一致性,分布式中过半数较合理
Zookeeper利用消息队列(每个server都有一个队列),确保zookeeper中的所有server都收到leader的信息,从而达到数据的一致性(消息队列中的数据会一直在队列中,除非被server消化掉),但是消化的速度有快有慢,数据还是可能出现短时间的不一致性,所有分布式系统都存在的问题,但是只能尽最大的努力减少这种情况的发生
对内:Paxos选举方式
Leader挂掉的问题:选举(投票传递) zxid最新,sid最大
server同时开启的话sid最大的为leader,如果一台台启,过半时的server为leader(优先考虑zxid,版本id(事务id),只有版本最新的才可能为leader)

二、Zookeeper的Shell操作

1、运行 zkCli.sh –server ip 进入命令行工具。输入 help,输出 zk shell 提示:
2、创建节点

create [-s] [-e] path data acl
其中,-s 或-e 分别指定节点特性,顺序或临时节点,若不指定,则表示持 久节点;acl 用来进行权限控制。

创建临时节点:客户端一旦断开连接,节点消失,配合watch机制使用,实现HA
在这里插入图片描述

3、读取节点

与读取相关的命令有 ls 命令和 get 命令,ls 命令可以列出 Zookeeper 指
定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;

get 命令可以获取 Zookeeper 指定节点的数据内容和属性信息。
ls path [watch]
get path [watch] ls2 path [watch]
更新节点
set path data [version]
data 就是要更新的新内容,version 表示数据版本。

在这里插入图片描述
4、删除节点

delete path [version]
若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。
Rmr path
可以递归删除节点。
三、Zookeeper的watch机制

ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能 。
ZooKeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。
触发事件种类很多,如:节点创建,节点删除,节点改变,子节点改变等。总的来说可以概括 Watcher 为以下三个过程:客户端向服务端注册 Watcher、服务端事件发生触发 Watcher、客户端回调 Watcher 得到触发事件情况
通过zk的watch机制以及临时节点的特性,实现服务器是否在线的实时监控

四、javaAPI操作Zookeeper

创建节点

/**
	 * 创建永久节点
	 * @throws Exception
	 */
	@Test
	public void createNode() throws Exception {
		RetryPolicy retryPolicy = new  ExponentialBackoffRetry(1000, 1);
		//获取客户端对象
		CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.52.100:2181,192.168.52.110:2181,192.168.52.120:2181", 1000, 1000, retryPolicy);
		//调用start开启客户端操作
		client.start();
		//通过create来进行创建节点,并且需要指定节点类型
		client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello3/world");
		client.close();
}

获取节点数据

	/**
	 * 数据查询
	 */
	@Test
	public void updateNode() throws Exception {
		RetryPolicy retryPolicy = new  ExponentialBackoffRetry(3000, 1);
		CuratorFramework client = CuratorFrameworkFactory.newClient("node01:2181,node02:2181,node03:2181", 3000, 3000, retryPolicy);
		client.start();
		byte[] forPath = client.getData().forPath("/hello5");
		System.out.println(new String(forPath));
		client.close();
	}

节点watch机制

/**
	 * zookeeper的watch机制
	 * @throws Exception
	 */
	@Test
	public void watchNode() throws Exception {
		RetryPolicy policy = new ExponentialBackoffRetry(3000, 3);
		CuratorFramework client = CuratorFrameworkFactory.newClient("node01:2181,node02:2181,node03:2181", policy);
		client.start();
		// ExecutorService pool = Executors.newCachedThreadPool();  
	    //设置节点的cache  
	    TreeCache treeCache = new TreeCache(client, "/hello5");  
	    //设置监听器和处理过程  
	    treeCache.getListenable().addListener(new TreeCacheListener() {  
	            @Override  
	            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {  
	                ChildData data = event.getData();  
	                if(data !=null){  
	                    switch (event.getType()) { 
	                    case NODE_ADDED:  
	                        System.out.println("NODE_ADDED : "+ data.getPath() +"  数据:"+ new String(data.getData()));  
	                        break;  
	                    case NODE_REMOVED:  
	                        System.out.println("NODE_REMOVED : "+ data.getPath() +"  数据:"+ new String(data.getData()));  
	                        break;  
	                    case NODE_UPDATED:  
	                        System.out.println("NODE_UPDATED : "+ data.getPath() +"  数据:"+ new String(data.getData()));  
	                        break;  
	                          
	                    default:  
	                        break;  
	                    }  
	                }else{  
	                    System.out.println( "data is null : "+ event.getType());  
	                }  
	            }  
	        });  
	    //开始监听  
	    treeCache.start();  
	    Thread.sleep(50000000);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值