ZooKeeper 基础知识

1、CAP 理论

(1)一致性(Consistency)(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
(2)可用性(Availability)(A):在集群中一部分节点故障后,在一定时间内,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
(3)分区容错性(Partition tolerance)(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。

ACID:
Automaticy 原子性
Consistency 一致性
Isolation 隔离性
Durability 持久性

CAP:
Consistency 最终一致性
Availability 可用性
Partition tolerance 分区容错性

BASE:
Basically Available 基本可用
Soft state 软状态
Eventually consistent 最终一致性

分布式事务:
2PC:Two-Phase Commit
阶段一:提交事务请求
阶段二:执行事务请求

3PC:Three-Phase Commit
阶段一:CanCommit
阶段二:PreCommit
阶段三:DoCommit
在这里插入图片描述
定理:任何分布式存储系统只可同时满足二点,没法三者兼顾。
忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。

原因总的来说就是:数据存在的节点越多,分区容错性(P)越高,但要复制更新的数据就越多,一致性(C)就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性(A)就会降低。

MySQL:满足 CA
ZooKeeper:满足 CP

分布式系统的 CAP 理论:http://www.hollischuang.com/archives/666

2、什么是 Zookeeper

What is ZooKeeper?

Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.

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. Each time they are implemented
there is a lot of work that goes into fixing the bugs and race conditions that are inevitable.Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现。

它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如分布式同步,配置管理,集群管理,命名管理,队列管理。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端跑在 java 上,提供 java 和 C 的客户端 API。

众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处于竞态以至于出现死锁。我们设计 ZooKeeper 的目的是为了减轻分布式应用程序所承担的协调任务。

ZooKeeper 是集群的管理者,监视着集群中各节点的状态,根据节点提交的反馈进行下一步合理的操作。最终,将简单易用的接口和功能稳定,性能高效的系统提供给用户。

官网地址:http://ZooKeeper.apache.org/
官网快速开始地址:http://ZooKeeper.apache.org/doc/trunk/ZooKeeperStarted.html
官网 API 地址:http://ZooKeeper.apache.org/doc/r3.4.10/api/index.html

3、ZooKeeper 提供了什么

3.1、文件系统

ZooKeeper 的命名空间就是 ZooKeeper 应用的文件系统,它和 linux 的文件系统很像,也是树状,这样就可以确定每个路径都是唯一的,对于命名空间的操作必须都是绝对路径操作。与 linux 文件系统不同的是,linux 文件系统有目录和文件的区别,而 ZooKeeper 统一叫做znode,一个 znode 节点可以包含子 znode,同时也可以包含数据。

所以总结说来,znode 即是文件夹又是文件的概念,所以在 ZooKeeper 这里面就不叫文件也不叫文件夹,叫 znode,每个 znode 有唯一的路径标识,既能存储数据,也能创建子 znode。但是 znode 只适合存储非常小量的数据,不能超过 1M,最好小于 1K
在这里插入图片描述

下面是关于 Znode 的介绍(非常重要):
(1)Znode 有两种类型:
短暂(ephemeral)(断开连接自己删除)
持久(persistent)(断开连接不删除)

(2)Znode 有四种形式的目录节点(默认是 persistent ):

目录节点节点释义
PERSISTENT持久化 znode 节点,一旦创建这个 znode 点存储的数据不会主动消失,除非是客户端主动的 delete
PERSISTENT_SEQUENTIAL自动增加顺序编号的 znode 节点,比如 ClientA 去 zk service 上建立一个 znode 名字叫做 /zk/conf,指定了这种类型的节点后 zk 会创建 /zk/conf0000000000 ,ClientB 再去创建就是创建 /zk/conf0000000001,ClientC 是创建 /zk/conf0000000002,以后任意 Client 来创建这个 znode 都会得到一个比当前 zk 命名空间最大 znode 编号 +1 的 znode,也就说任意一个 Client 去创建 znode 都是保证得到的 znode 是递增的,而且是唯一的
EPHEMERAL临时 znode 节点,Client 连接到 zk service 的时候会建立一个 session,之后用这个 zk 连接实例创建该类型的 znode,一旦 Client 关闭了 zk 的连接,服务器就会清除 session,然后这个 session 建立的 znode 节点都会从命名空间消失。总结就是,这个类型的 znode 的生命周期是和 Client 建立的连接一样的。比如 ClientA 创建了一个 EPHEMERAL 的/zk/conf0000000011 的 znode 节点,一旦 ClientA 的 zk 连接关闭,这个 znode 节点就会消失。整个 zk service 命名空间里就会删除这个 znode 节点
EPHEMERAL_SEQUENTIAL临时自动编号节点,znode 节点编号会自动增加,但是会随 zk session 消失而消失

(3)创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
(4)在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。
(5)EPHEMERAL 类型的节点不能有子节点。
(6)客户端可以在 znode 上设置监听器。

3.2、监听机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。

监听器的工作机制,其实是在客户端会专门创建一个监听线程,在本机的一个端口上等待 zk 集群发送过来事件。
在这里插入图片描述
注意:监听只生效一次
So,怎么做到循环监听?

具体请看本人博客后面的 ZooKeeper Shell 和 API 应用时的使用文章。

3.3、监听工作原理

ZooKeeper 的 Watcher 机制主要包括客户端线程、客户端 WatcherManager、Zookeeper 服务器三部分。客户端在向 ZooKeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中。当 ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,
客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。
在这里插入图片描述

3.4、ZooKeeper 典型应用场景

3.4.1、命名服务

命名服务是分布式系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体、服务地址和提供者的信息。Zookeeper 也可帮助应用系统通过资源引用的方式来实现对资源的定位和使用,广义上的命名服务的资源定位都不是真正意义上的实体资源,在分布式环境中,上层应用仅仅需要一个全局唯一的名字。Zookeeper 可以实现一套分布式全局唯一 ID 的分配机制。
在这里插入图片描述

3.4.2、配置管理

程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到 ZooKeeper 上去,保存在 ZooKeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到ZooKeeper 的通知,然后从 ZooKeeper 获取新的配置信息应用到系统中就好。
在这里插入图片描述

3.4.3、集群管理

所谓集群管理无在乎两点:是否有机器退出和加入、选举 master。

对于第一点,所有机器约定在父目录 GroupMembers 下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 ZooKeeper 的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:有兄弟挂了。新机器加入也是类似,所有机器收到通知:新兄弟目录加入,又多了个新兄弟。

对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为 master 就好。当然,这只是其中的一种策略而已,选举策略完全可以由管理员自己制定。
在这里插入图片描述

3.4.4、分布式锁

有了 ZooKeeper 的一致性文件系统,锁的问题变得容易。
**
锁服务可以分为两三类:
一个是写锁,对写加锁,保持独占,或者叫做排它锁,独占锁;
一个是读锁,对读加锁,可共享访问,释放锁之后才可进行事务操作,也叫共享锁;
一个是控制时序,叫时序锁。
**

对于第一类,我们将 ZooKeeper 上的一个 znode 看作是一把锁,通过 create znode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放出锁。

对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选 master 一样,编号最小的获得锁,用完删除,依次有序。
在这里插入图片描述

3.4.5、队列管理

**
两种类型的队列:
同步队列:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
先进先出队列:队列按照 FIFO 方式进行入队和出队操作。
**

第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。

同步队列的流程图:
在这里插入图片描述

4、ZooKeeper 特点/设计目的

ZooKeeper 作为一个集群提供数据一致的协调服务,自然,最好的方式就是在整个集群中的各服务节点进行数据的复制和同步。

数据复制的好处:
(1)容错:一个节点出错,不至于让整个集群无法提供服务;
(2)扩展性:通过增加服务器节点能提高 ZooKeeper 系统的负载能力,把负载分布到多个节点上;
(3)高性能:客户端可访问本地 ZooKeeper 节点或者访问就近的节点,依次提高用户的访问速度。

从客户端读写访问的透明度来看,数据复制集群系统:
写主:对数据修改的请求提交给主节点,对读数据请求没有限制,任何节点都能响应。

特点:
(1) 最终一致性:client 不论连接到哪个 Server,展示给它都是同一个视图,这是 ZooKeeper 最重要的性能。
(2) 可靠性:具有简单、健壮、良好的性能,如果消息 m 被到一台服务器接受,那么它将被所有的服务器接受。
(3) 实时性:ZooKeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,ZooKeeper 不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用 sync()接口。
(4) 等待无关(wait-free):慢的或者失效的 client 不得干预快速的 client 的请求,使得每个 client 都能有效的等待。
(5) 原子性:更新只能成功或者失败,没有中间状态。
(6) 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 Server 上消息 a 都将在消息 b 前被发布;偏序是指如果一个消息 b 在消息 a 后被同一个发送者发布,a 必将排在 b 前面。

5、学习内容

上节学习内容:hadoop-yarn 概述
下节学习内容:ZooKeeper 集群搭建

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值