前言

Zookeeper作为一个分布式协调服务,在Java以及大数据开发中都遇到过,这里我们对Zookeeper进行一些相应的总结,以便更好地理解并对其进行应用。

一、Zookeeper是什么

Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务
a、zookeeper是为别的分布式程序服务的
b、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
c、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
d、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
管理(存储,读取)用户程序提交的数据;
并为用户程序提供数据节点监听服务;

二、Zookeeper用来做什么

它就像一个管理员,用来管Hadoop,Hive,Pig。Apache Hbase 和 Apache Solr 的分布式集群都用到了 zookeeper;Zookeeper是一个分布式的、开源的程序协调服务,是 hadoop 项目下的一个子项目。他提供的主要功能包括:节点选举、统一配置文件管理、发布和订阅消息、集群管理。
a.节点选举:Master节点,主节点挂了之后,从节点就会接手工作 ,并且,保证这个节点是唯一的,这就是首脑模式,从而保证集群的高可用
b.统一配置文件管理:只需要部署一台服务器,则可以把相同的配置文件,同步更新到其他所有服务器,比如,修改了Hadoop,Kafka,redis统一配置等
c.发布与订阅消息:类似于消息队列,发布者把数据存在znode节点上,订阅者会读取这个数据
d.集群管理:集群中保证数据的一致性
Zookeeper的选举机制===>过半机制
安装的台数===>奇数台(否则无法过半机制)
一般情况下10台服务器需安装ZK3台
20台======>5台
50台=======>7台
100台=======>11台

三.Zookeeper的优势是什么

Zookeeper作用包括存储数据(文件系统)和监听(监听通知机制)
优点
1)分布式协调过程简单
2)同步:zk高度同步,这意味着服务器进程之间既存在互斥又存在合作,同步有助于Apache HBase进行配置管理。
3)有序消息:zk跟踪一个数字,表示每个更新的顺序,保证消息有序
4)序列化:根据具体规则,zk对数据进行编码。 另外,它还可确保我们的应用程序始终如一地运行。 但是,在MapReduce中,我们使用此方法(序列化)来协调队列以执行正在运行的线程
5)速度:在读请求多的情况下,能以很快的速度运行
6)可扩展性:此外,可以通过部署更多机器来加强zk的性能
7)有序性有何优势?:众所周知,zk中的消息是有序的。所以,为了实现更高级别的抽象,需要有序性。 这就是有序性对我们有利的方式
8)快:在读多的情况下,zk会非常快
9)可靠性:zk非常可靠,因为zk更新了,更新后的数据会一直保持,直到被覆盖更新
10)原子性:zk只有两种情况,要么全部成功,要么全部失败,没有中间状态的情况
11)实时性:zk保证在一定时间段内,客户端最终一定能从服务器上读到最新的数据状态

四.为什么用zookeeper

a. 大部分的分布式应用程序都需要一个主控、协调器或者控制器来物理分布的子进程(如资源,内存分配等)
b. 目前大部分应用开发私有的协调程序,缺乏一个通用性
c. 协调程序的反复编写浪费,难以形成通用、伸缩性好的协调器
d. ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用

五.zookeeper解决了什么问题

a.Master节点管理
集群当中最重要的是Master,所以一般都会设置一台Master的Backup。
b.Zookeeper Master选举
zookeeper会分配给注册到它上面的客户端一个编号,并且zk自己会保证这个编号的唯一性和递增性,N多机器中只需选出编号最小的Client作为Master就行,并且保证这些机器的都维护一个一样的meta信息视图,一旦Master挂了,那么这N机器中编号最小的胜任Master,Meta信息是一致的。
c.配置文件管理
集群中配置文件的更新和同步是很频繁的,传统的配置文件分发都是需要把配置文件数据分发到每台worker上,然后进行worker的reload,这种方式是最笨的方式,结构很难维护,因为如果集群当中有可能很多种应用的配置文件要同步,而且效率很低,集群规模一大负载很高。还有一种就是每次更新把配置文件单独保存到一个数据库里面,然后worker端定期pull数据,这种方式就是数据及时性得不到同步。
解决问题:
统一配置文件分发并且及时让worker生效
d.zookeeper发布与订阅模型
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。
e.分布式锁
在一台机器上要多个进程或者多个线程操作同一资源比较简单,因为可以有大量的状态信息或者日志信息提供保证,比如两个A和B进程同时写一个文件,加锁就可以实现。但是分布式系统怎么办?需要一个三方的分配锁的机制,几百台worker都对同一个网络中的文件写操作,怎么协同?还有怎么保证高效的运行?
解决问题:
高效分布式的分布式锁
zookeeper分布式锁
分布式锁主要得益于ZooKeeper为我们保证了数据的强一致性,zookeeper的znode节点创建的唯一性和递增性能保证所有来抢锁的worker的原子性。
f.集群worker管理
集群中的worker挂了是很可能的,一旦workerA挂了,如果存在其余的workers互相之间需要通信,那么workers必须尽快更新自己的hosts列表,把挂了的worker剔除,从而不在和它通信,而Master要做的是把挂了worker上的作业调度到其他的worker上。同样的,这台worker重新恢复正常了,要通知其他的workers更新hosts列表。传统的作法都是有专门的监控系统,通过不断去发心跳包(比如ping)来发现worker是否alive,缺陷就是及时性问题,不能应用于在线率要求较高的场景
解决问题:
集群worker监控,zookeeper监控集群
利用zookeeper建立znode的强一致性,可以用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。

总结

Zookeeper作为一个分布式协调服务,由于其通用性,所以在众多软件开发中被使用。它一般包括存储数据和监听功能,主要提供节点选举、统一配置文件管理、发布和订阅消息、集群管理等功能。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐