微服务 zookeeper分布式协调服务框架

微服务 zookeeper分布式协调服务框架

  • 1. zookeeper概念
    • 1.1 zookeeper简介
    • 1.2 zookeeper应用场景
  • 2. zookeeper下载安装
    • 2.1 zookeeper下载
    • 2.2 zookeeper安装
  • 3. zookeeper使用

1. zookeeper概念

1.1 zookeeper简介

什么是zookeeper,这个官网说的很清楚了,分布式协调服务框架。
zookeeper本身是树形结构的存储工具,但是在微服务中不同场景下不同的使用方式,使其具有不同的功能。
zookeeper官网地址:https://zookeeper.apache.org/index.html
微服务 zookeeper分布式协调服务框架_第1张图片

1.2 zookeeper应用场景

zookeeper是一个分布式协调服务框架。
通过对Zookeeper中数据节点进行交叉使用,配合Watcher事件通知机制,可以非常方便的构建一系列分布式应用中都会涉及的核心功能,如:

数据发布/订阅
负载均衡
服务命名
分布式协调/通知
集群管理
Master选举
分布式锁
分布式队列

1.数据发布/订阅
介绍
数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者进行数据订阅。
目的
动态获取数据(配置信息)
实现数据(配置信息)的统一管理和数据的动态更新
设计模式
Push 模式
Pull 模式
数据(配置信息)特性:
数据量通常比较小
数据内容在运行时会发生动态更新
集群中各机器共享,配置一致

如:机器列表信息、运行时开关配置、数据库配置信息等
基于Zookeeper的实现方式
数据存储:将数据(配置信息)存储到Zookeeper上的一个数据节点
数据获取:应用在启动初始化节点从Zookeeper数据节点读取数据,并在该节点上注册一个数据变更Watcher
数据变更:当变更数据时,更新Zookeeper对应节点数据,Zookeeper会将数据变更通知发到各客户端,客户端接到通知后重新读取变更后的数据即可。

2.负载均衡
zk的命名服务
命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

3.分布式通知和协调
对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态,然后zk将这些变化发送给注册了这个节点的watcher的所有客户端。
对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点。并携带工作的进度数据,这样汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况。

4.zk的命名服务(文件系统)
命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

5.zk的配置管理(文件系统、通知机制)
程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。

6.Zookeeper集群管理(文件系统、通知机制)
所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。
新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。

7.Zookeeper分布式锁(文件系统、通知机制)
有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。
对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次执行。

8.Zookeeper队列管理(文件系统、通知机制)
两种类型的队列:
1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
2、队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建PERSISTENT_SEQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。

2. zookeeper下载安装

2.1 zookeeper下载

zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
微服务 zookeeper分布式协调服务框架_第2张图片

注意事项:
apache-zookeeper-3.5.7-bin.tar.gz 才是启动zookeepr需要的,千万别下载错。若下载的不是bin开头的tar包,则会抛出找不到主类异常。

Zookeeper:无法加载主类
org.apache.zookeeper.server.quorum.QuorumPeerMain 

若启动zkServer报错:找不到或无法加载主类,肯定是tar包版本下载不对。

具体下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/
微服务 zookeeper分布式协调服务框架_第3张图片

2.2 zookeeper安装

  • Windows环境
1. jdk环境安装配置
	查看jdk环境配置:java -version
2. 解压。
	解压到zookeeper目录下
3. 修改配置
    在C:\ZooKeeper\路径下创建新文件夹data
    在C:\ZooKeeper\zookeeper-3.4.14\conf中的zoo-sample.conf更名为zoo.cfg
    用文本编辑器打开zoo.cfg,将dataDir=/tmp/zookeeper改成dataDir=C:\\ZooKeeper\\data
4. 启动zk
	运行C:\ZooKeeper\zookeeper-3.4.14\bin\zkServer.cmd
    运行C:\ZooKeeper\zookeeper-3.4.14\bin\zkCli.cmd,若命令行窗口含有	Welcome to ZooKeeper!,表示安装成功,输入quit退出zkCli.cmd。

  • Linux环境
1. 环境准备
2. 解压
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
3. 修改配置
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir=/opt/module/zookeeper-3.4.10/zkData
4.启动
bin/zkServer.sh start
5.查看
jps

3. zookeeper使用

1. 启动客户端
[atguigu@hadoop103 zookeeper-3.4.10]$ bin/zkCli.sh
2.显示所有操作命令
[zk: localhost:2181(CONNECTED) 1] help
3. 查看当前 znode 中所包含的内容
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
4. 查看当前节点详细数据
[zk: localhost:2181(CONNECTED) 1] ls2 /
[zookeeper]
5. 分别创建 2 个普通节点
[zk: localhost:2181(CONNECTED) 3] create /sanguo "jinlian"
Created /sanguo
[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo
"liubei"
Created /sanguo/shuguo
6.获得节点的值
[zk: localhost:2181(CONNECTED) 5] get /sanguo
jinlian
7. 创建短暂节点
[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo
"zhouyu"
Created /sanguo/wuguo
(1)在当前客户端是能查看到的
[zk: localhost:2181(CONNECTED) 3] ls /sanguo
[wuguo, shuguo]
(2)退出当前客户端然后再重启客户端
[zk: localhost:2181(CONNECTED) 12] quit
[atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkCli.sh
(3)再次查看根目录下短暂节点已经删
8. 创建带序号的节点
(1)先创建一个普通的根节点/sanguo/weiguo
[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo
"caocao"
Created /sanguo/weiguo
(2) 创建带序号的节点
[zk: localhost:2181(CONNECTED) 2] create -s
/sanguo/weiguo/xiaoqiao "jinlian"
9. 修改节点数据值
[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"
10.节点的值变化监听
(1) 在 hadoop104 主机上注册监听/sanguo 节点数据变化
[zk: localhost:2181(CONNECTED) 26] [zk:
localhost:2181(CONNECTED) 8] get /sanguo watch
(2)在 hadoop103 主机上修改/sanguo 节点的数据
[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"
(3)观察 hadoop104 主机收到数据变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged
path:/sanguo
11. 节点的子节点变化监听(路径变化)
(1)在 hadoop104 主机上注册监听/sanguo 节点的子节点变化
[zk: localhost:2181(CONNECTED) 1] ls /sanguo watch
[aa0000000001, server101]
(2) 在 hadoop103 主机/sanguo 节点上创建子节点
[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"
Created /sanguo/jin
(3) 观察 hadoop104 主机收到子节点变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged
path:/sanguo
12. 删除节点
[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin
13.递归删除节点
[zk: localhost:2181(CONNECTED) 15] rmr /sanguo/shuguo
14.查看节点状态
[zk: localhost:2181(CONNECTED) 17] stat /sanguo

参考文档:
zookeeper三十问
ZooKeeper学习笔记
Window下zookeeper安装和启动
下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/

你可能感兴趣的:(服务架构,zookeeper,分布式)