Zookeeper快速入门

Zookeeper 概述

ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper经过其简单的架构和API解决了这个问题。ZooKeeper容许开发人员专一于核心应用程序逻辑,而没必要担忧应用程序的分布式特性。node

分布式应用的优势算法

  • 可靠性 - 单个或几个系统的故障不会使整个系统出现故障。
  • 可扩展性 - 能够在须要时增长性能,经过添加更多机器,在应用程序配置中进行微小的更改,而不会有停机时间。
  • 透明性 - 隐藏系统的复杂性,并将其显示为单个实体/应用程序。

分布式应用的挑战数据库

  • 竞争条件 - 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。
  • 死锁 - 两个或多个操做等待彼此无限期完成。
  • 不一致 - 数据的部分失败。

什么是Apache ZooKeeper?

Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并经过稳健的同步技术维护共享数据。ZooKeeper自己是一个分布式应用程序,为写入分布式应用程序提供服务。apache

ZooKeeper提供的常见服务以下 :vim

  • 命名服务 - 按名称标识集群中的节点。它相似于DNS,但仅对于节点。
  • 配置管理 - 加入节点的最近的和最新的系统配置信息。
  • 集群管理 - 实时地在集群和节点状态中加入/离开节点。
  • 选举算法 - 选举一个节点做为协调目的的leader。
  • 锁定和同步服务 - 在修改数据的同时锁定数据。此机制可帮助你在链接其余分布式应用程序(如Apache HBase)时进行自动故障恢复。
  • 高度可靠的数据注册表 - 即便在一个或几个节点关闭时也能够得到数据。

ZooKeeper的好处

  • 简单的分布式协调过程
  • 同步 - 服务器进程之间的相互排斥和协做。此过程有助于Apache HBase进行配置管理。
  • 有序的消息
  • 序列化 - 根据特定规则对数据进行编码。确保应用程序运行一致。这种方法能够在MapReduce中用来协调队列以执行运行的线程。
  • 可靠性
  • 原子性 - 数据转移彻底成功或彻底失败,但没有事务是部分的。

ZooKeeper的架构

输入图片说明
屏幕截图.png

Client(客户端)bash

  • 客户端,咱们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每一个客户端向服务器发送消息以使服务器知道客户端是活跃的。相似地,当客户端链接时,服务器发送确认码。若是链接的服务器没有响应,客户端会自动将消息重定向到另外一个服务器。

Server(服务器)服务器

  • 服务器,咱们的ZooKeeper整体中的一个节点,为客户端提供全部的服务。向客户端发送确认码以告知服务器是活跃的。

Ensemble架构

  • ZooKeeper服务器组。造成ensemble所需的最小节点数为3。

Leader:app

  • 服务器节点,若是任何链接的节点失败,则执行自动恢复。Leader在服务启动时被选举。

Follower分布式

  • 跟随leader指令的服务器节点。

层次命名空间

ZooKeeper节点称为 znode 。每一个znode由一个名称标识,并用路径(/)序列分隔。

输入图片说明
屏幕截图.png

  • config 命名空间用于集中式配置管理,workers 命名空间用于命名。
  • 在 config 命名空间下,每一个znode最多可存储1MB的数据。这与UNIX文件系统相相似,除了父znode也能够存储数据。这种结构的主要目的是存储同步数据并描述znode的元数据。此结构称为 ZooKeeper数据模型。
  • ZooKeeper数据模型中的每一个znode都维护着一个 stat 结构。一个stat仅提供一个znode的元数据。它由版本号,操做控制列表(ACL),时间戳和数据长度组成。
  1. 版本号 - 每一个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增长。当多个zookeeper客户端尝试在同一znode上执行操做时,版本号的使用就很重要。
  2. 操做控制列表(ACL) - ACL基本上是访问znode的认证机制。它管理全部znode读取和写入操做。
  3. 时间戳 - 时间戳表示建立和修改znode所通过的时间。它一般以毫秒为单位。ZooKeeper从“事务ID"(zxid)标识znode的每一个更改。Zxid是惟一的,而且为每一个事务保留时间,以便你能够轻松地肯定从一个请求到另外一个请求所通过的时间。
  4. 数据长度 - 存储在znode中的数据总量是数据长度。你最多能够存储1MB的数据。

Znode的类型

Znode被分为持久(persistent)节点,顺序(sequential)节点和临时(ephemeral)节点。

  • 持久节点 - 即便在建立该特定znode的客户端断开链接后,持久节点仍然存在。默认状况下,除非另有说明,不然全部znode都是持久的。
  • 临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开链接时,临时节点会自动删除。所以,只有临时节点不容许有子节点。若是临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要做用。
  • 顺序节点 - 顺序节点能够是持久的或临时的。当一个新的znode被建立为一个顺序节点时,ZooKeeper经过将10位的序列号附加到原始名称来设置znode的路径。例如,若是将具备路径 /myapp 的znode建立为顺序节点,则ZooKeeper会将路径更改成 /myapp0000000001 ,并将下一个序列号设置为0000000002。若是两个顺序节点是同时建立的,那么ZooKeeper不会对每一个znode使用相同的数字。顺序节点在锁定和同步中起重要做用。

Sessions(会话)

  • 会话对于ZooKeeper的操做很是重要。会话中的请求按FIFO顺序执行。一旦客户端链接到服务器,将创建会话并向客户端分配会话ID 。
  • 客户端以特定的时间间隔发送心跳以保持会话有效。若是ZooKeeper集合在超过服务器开启时指定的期间(会话超时)都没有从客户端接收到心跳,则它会断定客户端死机。
  • 会话超时一般以毫秒为单位。当会话因为任何缘由结束时,在该会话期间建立的临时节点也会被删除。

Watches(监视)

  • 监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。客户端能够在读取特定znode时设置Watches。Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。
  • Znode更改是与znode相关的数据的修改或znode的子项中的更改。只触发一次watches。若是客户端想要再次通知,则必须经过另外一个读取操做来完成。当链接会话过时时,客户端将与服务器断开链接,相关的watches也将被删除。

Zookeeper 工做流

一旦ZooKeeper集合启动,它将等待客户端链接。客户端将链接到ZooKeeper集合中的一个节点。它能够是leader或follower节点。一旦客户端被链接,节点将向特定客户端分配会话ID并向该客户端发送确认。若是客户端没有收到确认,它将尝试链接ZooKeeper集合中的另外一个节点。 一旦链接到节点,客户端将以有规律的间隔向节点发送心跳,以确保链接不会丢失。

  • 若是客户端想要读取特定的znode,它将会向具备znode路径的节点发送读取请求,而且节点经过从其本身的数据库获取来返回所请求的znode。为此,在ZooKeeper集合中读取速度很快。
  • 若是客户端想要将数据存储在ZooKeeper集合中,则会将znode路径和数据发送到服务器。链接的服务器将该请求转发给leader,而后leader将向全部的follower从新发出写入请求。若是只有大部分节点成功响应,而写入请求成功,则成功返回代码将被发送到客户端。 不然,写入请求失败。绝大多数节点被称为 Quorum 。

ZooKeeper集合中的节点

  • 若是咱们有单个节点,则当该节点故障时,ZooKeeper集合将故障。它有助于“单点故障",不建议在生产环境中使用。
  • 若是咱们有两个节点而一个节点故障,咱们没有占多数,由于两个中的一个不是多数。
  • 若是咱们有三个节点而一个节点故障,那么咱们有大多数,所以,这是最低要求。ZooKeeper集合在实际生产环境中必须至少有三个节点。
  • 若是咱们有四个节点而两个节点故障,它将再次故障。相似于有三个节点,额外节点不用于任何目的,所以,最好添加奇数的节点,例如3,5,7。
  • 写入过程比ZooKeeper集合中的读取过程要贵,由于全部节点都须要在数据库中写入相同的数据

输入图片说明
屏幕截图.png

写入(write)

  • 写入过程由leader节点处理。leader将写入请求转发到全部znode,并等待znode的回复。若是一半的znode回复,则写入过程完成。

读取(read)

  • 读取由特定链接的znode在内部执行,所以不须要与集群进行交互。

复制数据库(replicated database)

  • 它用于在zookeeper中存储数据。每一个znode都有本身的数据库,每一个znode在一致性的帮助下每次都有相同的数据。

Leader负责处理写入请求的Znode。

Follower:从客户端接收写入请求,并将它们转发到leader znode。

请求处理器(request processor):只存在于leader节点。它管理来自follower节点的写入请求。

原子广播(atomic broadcasts):负责广播从leader节点到follower节点的变化。

Zookeeper leader选举

分析如何在ZooKeeper集合中选举leader节点。考虑一个集群中有N个节点。leader选举的过程以下:

  • 全部节点建立具备相同路径 /app/leader_election/guid_ 的顺序、临时节点。
  • ZooKeeper集合将附加10位序列号到路径,建立的znode将是 /app/leader_election/guid_0000000001,/app/leader_election/guid_0000000002等。
  • 对于给定的实例,在znode中建立最小数字的节点成为leader,而全部其余节点是follower。
  • 每一个follower节点监视下一个具备最小数字的znode。例如,建立znode/app/leader_election/guid_0000000008的节点将监视znode/app/leader_election/guid_0000000007,建立znode/app/leader_election/guid_0000000007的节点将监视znode/app/leader_election/guid_0000000006。
  • 若是leader关闭,则其相应的znode/app/leader_electionN会被删除。
  • 下一个在线follower节点将经过监视器得到关于leader移除的通知。
  • 下一个在线follower节点将检查是否存在其余具备最小数字的znode。若是没有,那么它将承担leader的角色。不然,它找到的建立具备最小数字的znode的节点将做为leader。
  • 相似地,全部其余follower节点选举建立具备最小数字的znode的节点做为leader。

Zookeeper集群安装 安装:

wget http://www.apache.org/dist//zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
tar zxvf zookeeper-3.3.3.tar.gz
cd zookeeper-3.3.3
cp conf/zoo_sample.cfg conf/zoo.cfg
复制代码

zookeeper-3.4.10/conf新创建zoo.cfg,zoo2.cfg,zoo3.cfg三个文件,配置以下,

#心跳间隔 毫秒每次
tickTime = 2000
##日志位置 伪集群设置不一样目录
dataDir = /home/zookeeper-3.4.10/data/data1
#监听客户端链接的端口 伪集群设置不一样端口
clientPort = 2181
#多少个心跳时间内,容许其余server链接并初始化数据,若是ZooKeeper管理的数据较大,则应相应增大这个值
initLimit = 10
#多少个tickTime内,容许follower同步,若是follower落后太多,则会被丢弃
syncLimit = 5

#伪集群配置 不须要集群去掉(vim /etc/host 映射ip的hostname的关系)
server.1=CentOS124:2886:3886
server.2=CentOS124:2888:3888
server.3=CentOS124:2889:3889
复制代码

并在zookeeper-3.4.10/data的 data1,data2,data3 目录下放置myid文件,文件内容为1,2,3:

输入图片说明
屏幕截图.png
输入图片说明
屏幕截图.png

进入bi目录 启动

./zkServer.sh start zoo.cfg
./zkServer.sh start zoo2.cfg
./zkServer.sh start zoo3.cfg
复制代码

查看服务状态

./zkServer.sh status zoo.cfg
./zkServer.sh status zoo2.cfg
./zkServer.sh status zoo3.cfg
复制代码

使用Zookeeper的客户端来链接并测试了

[root@CentOS124 bin]# ./zkCli.sh

#查看根节点
[zk: localhost:2181(CONNECTED) 0] ls /
[firstNode, SecodeZnode, firstNode0000000002, hbase, zookeeper]
[zk: localhost:2181(CONNECTED) 0] create /mykey1 myvalue1  #建立一个新节点mykey1 
Created /mykey1
[zk: localhost:2181(CONNECTED) 1] get /mykey1   #获取mykey1节点 

#要建立顺序节点
create -s /FirstZnode second-data

#要建立临时节点
create -e /SecondZnode “Ephemeral-data" 复制代码
相关文章
相关标签/搜索