1.1、概述
Apache ZooKeeper 是一个开源的分布式协调服务,它为分布式应用提供一致性服务。ZooKeeper 维持一个简单的数据结构类似于文件系统,使得分布式系统可以协调它们的动作,确保数据的一致性和完整性。
ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
1.2、ZooKeeper 的由来
Zookeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
关于“ZooKeeper”这个项目的名字,其实也有一段趣闻。在立项初期,考虑到之前内部很多项目都是使用动物的名字来命名的(例如著名的 Pig 项目),雅虎的工程师希望给这个项目也取一个动物的名字。时任研究院的首席科学家 Raghu Ramakrishnan 开玩笑地说:“在这样下去,我们这儿就变成动物园了!”
此话一出,大家纷纷表示就叫动物园管理员吧,因为各个以动物命名的分布式组件放在一起,雅虎的整个分布式系统看上去就像一个大型的动物园了。 而 Zookeeper 正好要用来进行分布式环境的协调,于是,Zookeeper 的名字也就由此诞生了。示意图如下:

1.3、核心概念
1.3.1、三种角色
- 领导者(leader)
负责进行投票的发起和决议,更新系统状态。 - 学习者(learner)
包括跟随者(follower)和观察者(observer)。
① follower 用于接受客户端请求并向客户端返回结果,在选举过程中参与投票
② Observer 可以接受客户端连接,将写请求转发给 leader,但 observer 不参加投票过程,只同步 leader 的状态,observer 的目的是为了扩展系统,提高读取速度 - 客户端(client)
请求发起方。
三种角色的关系如下图所示:

一个 ZooKeeper 集群同一时刻只会有一个 Leader,ZooKeeper 集群的所有机器通过选举过程来选定一台被称为 Leader 的机器,Leader 服务器为客户端提供读和写服务。其他都是 Follower 或 Observer。
leader 负责客户端 writer 类型的请求,Follower 和 Observer 都能提供读服务,不能提供写服务。两者唯一的区别在于,Observer 不参与 Leader 选举过程,也不参与写操作的『过半写成功』策略,因此 Observer 可以在不影响写性能的情况下提升集群的读性能。
1.3.2、节点状态
每个集群中的节点都有一个状态 LOOKING, FOLLOWING, LEADING, OBSERVING。都属于这 4 种,每个节点启动的时候都是 LOOKING 状态,如果这个节点参与选举但最后不是 leader,则状态是 FOLLOWING,如果不参与选举则是 OBSERVING,leader的状态是 LEADING。
1.3.3、集群服务器数
ZooKeeper 官方建议集群服务器的数量为奇数,这是因为一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之间能够正常通信。
基于这个特性,如果想搭建一个能够允许 N 台机器 down 掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。因此,一个由 3 台机器构成的 ZooKeeper 集群,能够在挂掉 1 台机器后依然正常工作, 而对于一个由 5 台服务器构成的 ZooKeeper 集群,能够对 2 台机器挂掉的情况进行容灾。
如果是一个由 6 台服务器构成的 ZooKeeper 集群,同样只能够挂掉 2 台机器,因为如果挂掉 3 台,剩下的机器就无法实现过半了。 zookeeper 有这样一个特性:集群中只要有超过过半的机器是正常工作的,那么整个集群对外就是可用的。
1.4、核心特点
- 顺序一致性
从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。 - 原子性
所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。 - 单一系统映像(最终一致性)
无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。 - 可靠性
可靠性方面使其不会成为单点故障。 - 实时性
Zookeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper 不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用 sync() 接口。
1.5、总结
Apache ZooKeeper 作为分布式系统的一致性基石,为开发者提供了一种简单、可靠的方式来管理和同步分布式系统中的数据。它的数据模型、一致性保证、顺序性、可扩展性和高可用性等特点,使其在分布式系统中具有广泛的应用。掌握 ZooKeeper 的使用,对于构建稳定、高效的分布式系统具有重要意义。
352

被折叠的 条评论
为什么被折叠?



