zookeeper安装与使用介绍

(一) ZooKeeper是什么?

官方上是这么介绍的:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.All of these kinds of services are used in some form or another by distributed applications

翻译过来就是:ZooKeeper 是一个典型的分布式数据一致性解决方案,它能为分布式应用程序提供诸如配置管理、命名服务、分布式锁、集群管理等功能.

1.1. 配置管理

Zookeeper提供了这样的一种服务:一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。这样就省去手动拷贝配置了,还保证了可靠和一致性。 
zookeeper安装与使用介绍_第1张图片

1.2. 名字服务

这个可以简单理解为一个电话薄,电话号码不好记,但是人名好记,要打谁的电话,直接查人名就好了。 
分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务; 
类似于域名与ip之间对应关系,域名容易记住; 
通过名称来获取资源或服务的地址,提供者等信息

1.3. 分布式锁

碰到分布二字貌似就难理解了,其实很简单。单机程序的各个进程需要对互斥资源进行访问时需要加锁,那分布式程序分布在各个主机上的进程对互斥资源进行访问时也需要加锁。很多分布式系统有多个可服务的窗口,但是在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。举个通俗点的例子,比如银行取钱,有多个窗口,但是呢对你来说,只能有一个窗口对你服务,如果正在对你服务的窗口的柜员突然有急事走了,那咋办?找大堂经理(zookeeper)!大堂经理指定另外的一个窗口继续为你服务!

1.4. 集群管理

在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中有些机器(比如Master节点)需要感知到这种变化,然后根据这种变化做出对应的决策。我已经知道HDFS中namenode是通过datanode的心跳机制来实现上述感知的,那么我们可以先假设Zookeeper其实也是实现了类似心跳机制的功能吧!

简单来说zookeeper=文件系统+监听通知机制。

1.5、 文件系统

Zookeeper维护一个类似文件系统的数据结构:

zookeeper安装与使用介绍_第2张图片

 

每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。

有四种类型的znode:

  • PERSISTENT-持久化目录节点

    客户端与zookeeper断开连接后,该节点依旧存在

  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

  • EPHEMERAL-临时目录节点

    客户端与zookeeper断开连接后,该节点被删除

  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

1.6 监听通知机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

(二) zookeeper单机模式安装

2.1 检查java环境

配置JAVA环境,检验环境:java -version

2.2 下载并解压zookeeper

zookeeper下载路径:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/, 一定要下载源码版本,也就是以-bin.tar.gz结尾的包,不然启动zookeeper时会Starting zookeeper ... FAILED TO START错误

2.3  重命名zoo_sample.cfg

重命名zoo_sample.cfg为zoo.cfg

2.4 启动zookeeper

 bin/zkServer.sh start

2.5 客户端链接zookeeper

 bin/zkCli.sh

(三) zookeeper的简单使用

ls /: 查看zookeeper内容

creaate /zknode data :创建znode节点

get /zknode: 获取节点内容

delete /zknode: 删除节点

zookeeper安装与使用介绍_第3张图片

 

(四) 使用java API 连接zookeeper

引入依赖:


    org.apache.zookeeper
    zookeeper
    3.5.5

创建znode : create /zknode data

启动zookeeper客户端程序,代码如下所示

package com.dy.demo.entiy;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

public class ZookeeperClientSync implements Watcher {

	private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
	private static ZooKeeper zKeeper = null;
	private static Stat stat = new Stat();

	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
		String path = "/zknode";
		zKeeper = new ZooKeeper("localhost:2181", 5000, new ZookeeperClientSync());
		// 等待zk连接成功的通知
		connectedSemaphore.await();
		// 获取path目录节点的配置数据,并注册默认的监听器
		System.out.println(new String(zKeeper.getData(path, true, stat)));

		Thread.sleep(Integer.MAX_VALUE);

	}

	@Override
	public void process(WatchedEvent event) {
		if (KeeperState.SyncConnected == event.getState()) { // 连接成功
			System.out.println("连接成功");
			if (EventType.None == event.getType() && null == event.getPath()) {
				connectedSemaphore.countDown();
			} else if (event.getType() == EventType.NodeDataChanged) {// zk目录节点数据变换通知事件
				try {
					System.out.println("配置已修改为: " + new String(zKeeper.getData(event.getPath(), true, stat)));
				} catch (KeeperException | InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

变更znode节点数据 : set /zknode data1234,客户端打印

参考:https://blog.csdn.net/java_66666/article/details/81015302

          https://www.cnblogs.com/arjenlee/articles/9224366.html

你可能感兴趣的:(zookeeper,入门)