天下風雲出我輩
一入江湖歲月催

ZooKeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务;是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件;它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

zookeeper的应用场景:

  • 配置管理:分布式应用中的统一配置管理,提供集中服务配置管理功能,应用场景HBase,控制集群配置信息;Kafka消息队列,使用Zookeeper,管理Broker(经纪人)Alibaba的服务器治理框架Dubbo,利用zookeeper来管理一些服务配置。
  • 命名管理:跟域名类似的功能,类似域名管理的;如果应用中需要服务和IP的映射关系的配置,也可以统一集中管理。
  • 分布式锁服务:HBase的HMaster的使用。
  • 集群管理:用于管理在线集群信息

数据模型和命名空间

Zookeeper提供的命名空间与标准的文件系统非常类似,一个名称就是一个由“/”分割的路径序列,其层级结构为:

zk-files

跟Linux的标准文件系统的结构是一致的;每一个节点就是一个路径。

节点和临时节点

Zookeeper的节点有两种:节点和临时节点:
第一种,节点znode,其特点为:
1、跟标准文件系统不一样的是,Zookeeper的每个命名空间,还关联数据,也跟它的孩子一样。这就好比在一个文件系统中,允许一个文件同时也作为一个文件目录。

2、Zookeeper被设计为存储协调数据,通常存储在每个节点中的数据通常很小,zookeeper的数据节点通常被成为znode.

3、znodes维护了一个状态结构,包含版本、ACL、时间戳,用以验证和协调更新。每次数据发生变化,版本号就会增加。

4、每个命名空间中的znode的读和写都是自动的;每个节点都有一个ACL限制列表。

另一类是临时节点
Zookeeper有一个临时节点的概念,这些节点只在创建他们的会话活动期间,当会话结束的时候,这些节点就被删除,临时节点在实现tbd时是有用的。

有条件地更新和监控

Zookeeper支持监控,即客户端可以设置在某个znode上的监控;当一个节点发生变化时,就会触发和删除一个监控。当一个监控触发时,客户端会收到一个说明节点变化的包。

当客户端和Zookeeper Server断开时,客户端将收到一个本地通知。
本质就是:监听器(观察者模式)

各种保证

Zookeeper之所以能构造复杂的服务,如同步、配置管理、组管理等功能,是因为它提供了一系列的保证:
1)顺序一致性:客户端的更新操作必须与它们被发送的顺序严格一致
2)原子性:更新操作要么成功、要么失败
3)单个系统影像:一个客户端将会看到相同的服务视图,不管它与那个Server连接(跟一致性是呼应的)
4)可靠性:一旦一个更新操作被应用,从更新时间点向前的时间都将报错一致,直到下一次更新。
5)时间轴:在一个特定的时间点上,客户端看到的系统视图被保证是最新的。

Zookeeper组件结构

在这里插入图片描述

除了request processor, 组成zookeeper服务的每个server都会在本地备份其它组件的拷贝(应该是Leader的复本)。

复制数据库是一个内存数据库,保存了所有的数据树;更新操作被记录到磁盘中,便于数据恢复;写操作在应用于内存数据库之前先被序列化到磁盘上了。也就是说磁盘上的日志才是数据正真的现状。

单机

# 下载解压
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
tar xf apache-zookeeper-3.6.2-bin.tar.gz
mv apache-zookeeper-3.6.2-bin zookeeper
# 更改配置
cp zoo_sample.cfg zoo.cfg

vim zoo.cfg

tickTime=2000  #心跳检测 毫秒
dataDir=/opt/zookeeper/data  # 数据文件夹
clientPort=2181  #监听端口
initLimit=5
syncLimit=2

# 启动
cd bin
./zkServer.sh start

集群

集群数量为奇数,并且超过N+1台,只要集群中大多数节点都处于可用状态,那么集群就是可用的,集群中的服务器角色有:
1)领导者:复杂投票的发起和决议,并更新系统状态
2)学习者:包括跟随者和观察者,从Leader处获取最新的系统状态
3)Follower用于接受客户端请求,并向客户端返回结果,在选举过程中参与投票
4)Observer观察者可以接受客户端请求,将写请求转发给Leader,但是不参与投票,只同步状态。它的目的是为了扩展系统,以提高读取速度。

集群中由一个Leader节点和N个Follower节点组成,所有的Server之间能彼此通信,并且在各自内存中维护了状态图,与之一致的事务日志和快照位于持久化存储中。这一点类似Redis的Sentinel模式,它们都具有高度的自治能力,一旦Leader节点不可达,则自动完成新Leader的选举并恢复服务。

zookeeper架构图

部署规划

系统 ip Hostname
Centos 7.6 192.168.0.11 zk-1
Centos 7.6 192.168.0.12 zk-2
Centos 7.6 192.168.0.13 zk-3

修改配置文件

基于单机版的部署操作每一台

# vim zoo.cfg

tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
#集群模式
server.1=192.168.0.11:2888:3888
server.2=192.168.0.12:2888:3888
server.3=192.168.0.13:2888:3888

创建myid文件

cd /opt/zookeeper/
## 以下三行根据当前实际IP,选择一行执行

## 192.168.0.11 执行
echo '1' > data/myid

## 192.168.0.12 执行
echo '2' > data/myid

## 192.168.0.13 执行
echo '3' > data/myid

启动&验证

./zkServer.sh start

./zkServer.sh status
赞(0) 打赏
未经允许不得转载:Anonym0x1 » ZooKeeper

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏