分布式-分布式协调框架Zookeeper(一)——基础概念及常用命令

一、ZooKeeper概述

1.1、什么是 ZooKeeper

ZooKeeper 是一个分布式协调框架。是一个典型的分布式数据一致性解决方案。分布式应用可以基于ZooKeeper 实现比如数据的发布/订阅、负载均衡、分布式协调/通知、集群管理、master选举、分布式锁、分布式队列等功能。

一个最常用的场景就是担任服务生产者和服务消费者的注册中心,提供发布-订阅服务,例如在Dubbo中就担任了注册中心角色:

Dubbo

1.2、结合个人情况讲一下ZooKeeper

项目中使用ZooKeeper 作为Dubbo注册中心。另外搭建在solr集群时候使用ZooKeeper作为集群管理工具(三台服务区就可以ZooKeeper 集群),这时ZooKeeper 主要提供如下几个功能:1、集群管理:容错、复杂均衡 2、配置文件的集中管理 3、集群的入口

为什么最好使用奇数台服务器构成 ZooKeeper 集群?

所谓的zookeeper容错,是指当宕机几个zookeeper服务器之后,剩下个数必须大于宕机个数整个zookeeper才依然可用。所以奇数最好

1.3、Zookeeper的角色

(1)领导者(Leader):进行投票的发起和决议,更新系统状态

(2)学习者(Learner):

——跟随者(Follower):接收客户端请求,并向客户端返回结果,在选举过程中参与投票;

——观察者(Observer):接收客户端连接,将写请求转发给leader节点。但Observer不参与投票,只同步leader状态。Observer目的只是为了扩展系统,提高读取速度。

(3)客户端(Client):请求发起方

1.4、Zookeeper(动物管理员)的工作原理

zookeeper集群上每个server数据一致,leader在集群启动时选举,如图:

写操作时,请求要发送给某个server,再由server转发leader,leader(领导者)给每一个server发送投票消息,每个server把投票结果传给leader,要有半数serer统一次请求,leader就会commit到每一个服务器执行写操作。

写操作时一些注意事项:

(1)写数据时,一个Follower挂了,修复好之后会和leader通过一致性协议ZAB修复follower数据,达到每个server上的数据最终一致;

(2)写数据时,过一段时间,ZK就会把所有server的数据镜像写出,然后把每个server上的数据删除,保证了每个sever的容量;

(3)写数据时,在某一台follower写入了某数据的同时,读另一台follower刚刚写入的信息不一定成功,因为每台server数据同步会有少许间隔,所以说是最终一致性。

二、ZooKeeper 的一些重要概念

2.1、重要概念总结

ZooKeeper 本身就是一个分布式程序(只要半数以上节点存活,就能正常服务);

为保证高可用,最好集群;

ZooKeeper 将数据保存在内存中,这也就保证了高吞吐和低延迟;

ZooKeeper 临时节点的概念。创建临时节点的客户端会话一直保持活动,瞬时节点就一直存在,当会话结束瞬时节点被删除。持久节点是指一旦这个ZNode被创建除非注定进行删除操作不然一直保存在ZK中。

2.2、会话(Session)

指的是ZooKeeper 服务器与客户端会话。在ZK中一个客户端连接是指客户端和服务器之间的一个TCP长连接。客户端启动时首先与服务器简历一个TCP连接,通过这个链接客户端能够通过心跳检测与服务保持有效的会话,也能够向ZK发送请求并接受响应。

在客户端创建会话之前,服务器首先会为客户端都分配一个sessionID,这ID全局唯一

2.3、ZNode

数据模型的数据单元,称为数据节点ZNode。在ZK中,node可以分为持久节点和临时节点两类。每个ZNode上都可以保存数据,同时还是可以有子节点。

持久节点:一旦这个ZNode被创建,除非主动删除操作不然一直保存在ZK上;

临时节点它的生命周期和客户端会话绑定,一旦客户端会话失败,那么这个客户端创建的所有临时节点都被移除(比如后台启动后关闭临时节点就消失了)。

2.4、版本

ZK的每个ZNode上都会存储数据,对应每个ZNode,ZK会为其维护一个Start的数据结构,Stat中记录了这个ZNode的三个数据版本,分别是version(当前数据版本)、cversion(当前ZNode子节点版本)、aversion(当前ZNode的ACL版本)

2.5、ACL

ZK采用ACL策略来进行权限控制,ZK定义了如下5中权限:

  • CREATE:创建子节点的权限;
  • READ:获取子节点数据和子节点列表的权限;
  • WRITE:更新节点数据的权限;
  • DELETE:删除子节点权限;
  • ADMIN:设置节点ACL的权限。

三、ZooKeeper特点

顺序一致性:从同一个客户端发起事物请求,最终会按顺序应用到ZK中;

原子性:要么整个集群中所有机器都成功应用了某一个事物,要么都没有应用 ;

单一系统映像:无论客户端连接到哪一个ZK服务器上,其看到的服务端数据模型都是一致的;

可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。

四、ZooKeeper设计目标

4.1、简单的数据模型

允许分布式进程通过共享的层次结构命名空间进行相互协调,名称空间叫ZNode(类似于文件和目录)。与传统文件系统不同,ZK将数据保存在内存中,这意味着ZK可实现高吞吐和低延迟。

4.2、可构建集群

集群部署ZooKeeper

4.3、顺序访问

对于客户端的每一额请求,ZK都会分配一个全局唯一的递增编号,这个编号反应了所有事物操作的先后顺序,这个编号也叫时间戳——zxid

4.4、高性能

在读多写少环境中尤其高性能,因为写会导致所有服务器间进入同步状态

五、ZooKeeper 集群

ZK中没有使用传统的Master/Slave(主备模式),而是引入了Leader、Follower和Observer三种角色。

ZK集群中所有机器通过一个Leader选举过程来选定一台称为“Leader”的机器,Leader既能为客户端提供写服务又能提供读服务,但是Follower和Observer只能提供读服务。Follower和Observe的唯一区别是Observer 机器不参与Leader的选举过程。

当Leader服务器出现网络中断、崩溃退出、重启等异常情况时,ZAB协议就会进入恢复迷失并选举产生新的Leader服务器,流程如下:

(1)选举阶段:节点在一开始都处于选举阶段,只要有一个节点的票数超过半数节点的票数,就可以选择为准leader;

(2)发现阶段:followers 跟准leader进行通信,同步followers 最近接收的事物提议;

(3)同步阶段:利用leader前一阶段获得的最新提议历史,同步集群中所有的副本,同步完成后 准leader才会成为真正的leader;

(4)广播阶段:这个阶段Zookeeper 集群才真正对外提供事物服务,并且lerder可以进行消息广播,同时如果有新的节点加入,还需要对新节点进行同步。

六、ZAB协议和Paxos算法

ZooKeeper 并没有完全采用Paxos算法,而是使用AZB协议作为其保证数据一致性的核心算法。

6.1、ZAB协议介绍

ZAB(原子广播)协议是分布式协调服务ZooKeeper专门设计的一种支持崩溃恢复的原子广播协议。在ZK中主要依赖ZAB协议来实现分布式数据一致性,基于该协议,ZK实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。

6.2、ZAB协议两种基本的模式:崩溃恢复和消息广播

整个框架在启动过程或者Leader服务器出现异常时ZAB就会进入恢复模式并选举产生新的Leader服务器。集群中已有过半机器与该Leader服务器完成同步之后,ZAB协议就会推出恢复模式。其中状态同步就是指数同步,用来保证集群中存在过半的机器能够和Leader服务器的数据状态保持一致。

当集群中有过半的Follower服务器完成了和Leader服务器的状态同步,那么整个服务框架就可以进入消息广播模式了。

七、ZooKeeper常用命令

 7.1、测试 ZooKeeper 中的常见操作

(1)连接命令:连接ZooKeeper服务

进入安装 ZooKeeper文件夹的 bin 目录下执行下面的命令连接 ZooKeeper 服务(Linux环境下)

(连接之前首选要确定你的 ZooKeeper 服务已经启动成功)

./zkCli.sh -server 127.0.0.1:2181

(2)help命令:查看常用命令

(3)create 命令:创建节点

通过 create 命令在根目录创建了node1节点,与它关联的字符串是"node1"

[zk: 127.0.0.1:2181(CONNECTED) 34] create /node1 “node1”

通过 create 命令在根目录创建了node1节点,与它关联的内容是数字 123

[zk: 127.0.0.1:2181(CONNECTED) 1] create /node1/node1.1 123
Created /node1/node1.1

(4)set 命令:更新节点数据内容

[zk: 127.0.0.1:2181(CONNECTED) 11] set /node1 "set node1" 

(5)get命令:获取节点数据
可以获取指定节点的数据内容和节点的状态

(如下可看出,通过set命令已经将节点数据内容改为“set node1”)

set node1
cZxid = 0x47
ctime = Sun Jan 20 10:22:59 CST 2019
mZxid = 0x4b
mtime = Sun Jan 20 10:41:10 CST 2019
pZxid = 0x4a
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1

(6)ls命令:查看某个目录下的子节点

通过 ls 命令查看根目录下的节点:

[zk: 127.0.0.1:2181(CONNECTED) 37] ls /
[dubbo, zookeeper, node1]

通过 ls 命令查看 node1 目录下的节点:

[zk: 127.0.0.1:2181(CONNECTED) 5] ls /node1
[node1.1]

zookeeper 中的 ls 命令和 linux 命令中的 ls 类似, 这个命令将列出绝对路径path下的所有子节点信息(列出1级,并不递归)

(7)stat命令:查看节点状态

[zk: 127.0.0.1:2181(CONNECTED) 10] stat /node1
cZxid = 0x47
ctime = Sun Jan 20 10:22:59 CST 2019
mZxid = 0x47
mtime = Sun Jan 20 10:22:59 CST 2019
pZxid = 0x4a
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 1

(8)ls2命令:查看节点信息和状态

ls2命令更像是ls命令和stat命令的结合。ls2命令返回的信息包括2部分:子节点列表+当前节点的stat信息

[zk: 127.0.0.1:2181(CONNECTED) 7] ls2 /node1
[node1.1]
cZxid = 0x47
ctime = Sun Jan 20 10:22:59 CST 2019
mZxid = 0x47
mtime = Sun Jan 20 10:22:59 CST 2019
pZxid = 0x4a
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 1

(9)delete命令:删除节点

注意:如果要删除某一个节点,那么该节点必须无子节点才行

[zk: 127.0.0.1:2181(CONNECTED) 3] delete /node1/node1.1

  参考资料:https://zhuanlan.zhihu.com/p/44731983

  参考资料:https://zhuanlan.zhihu.com/p/24996631

发布了52 篇原创文章 · 获赞 116 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/RuiKe1400360107/article/details/103709430