Zookeeper介绍
- 格式:docx
- 大小:19.88 KB
- 文档页数:2
zookeeper集群工作原理Zookeeper集群工作原理Zookeeper是一个开源的分布式协调服务,它提供了一个高可用的、有序的、一致性的数据管理和协调服务。
在分布式系统中,Zookeeper集群起到了关键的作用,负责管理和维护分布式系统中的各种数据和状态。
一、Zookeeper集群的基本概念1. 服务器角色:Zookeeper集群中的每个节点都可以担任Leader 或Follower的角色。
Leader负责处理客户端请求和写操作,Follower则负责处理读操作和同步数据。
2. 数据模型:Zookeeper将数据存储在树形结构的命名空间中,类似于文件系统的目录结构,每个节点都有一个路径和一个关联的数据。
3. 会话:客户端与Zookeeper集群之间的连接被称为会话,会话可以保持一段时间,并且可以处理客户端请求。
二、Zookeeper集群的工作原理1. Leader选举:在Zookeeper集群中,只有一个节点可以担任Leader角色,其余节点为Follower。
当集群启动或Leader节点宕机时,会发起一次Leader选举。
选举过程通过ZAB协议(Zookeeper Atomic Broadcast)进行,节点首先互相通信,然后通过投票的方式选择出新的Leader节点。
2. 数据一致性:Zookeeper通过使用ZAB协议来实现数据的一致性。
当客户端向Leader节点发送写请求时,Leader节点将该请求转发给所有的Follower节点,一旦大多数Follower节点都返回成功响应,Leader节点就会将数据变更应用到自身的数据副本中,并通知Follower节点更新数据。
这样就保证了数据的一致性。
3. 数据同步:Zookeeper集群中的Follower节点会定期从Leader 节点同步数据,以保持数据的一致性。
Follower节点会向Leader 节点发送请求,获取最新的数据更新,然后更新到自身的数据副本中。
ZooKeeper SASL原理解析1. 什么是ZooKeeper?ZooKeeper是一个开源的分布式协调服务,用于处理分布式应用程序中的各种协调任务。
它提供了一个简单且高效的分布式系统,可以用于配置管理、命名服务、分布式协调/通知和集群管理等场景。
在分布式系统中,ZooKeeper通过提供强一致性、高可用性和可靠性的服务来保证数据的一致性。
它使用了一种基于状态树(state tree)的数据模型,并提供了类似于文件系统的层次结构来组织数据。
2. 什么是SASL?SASL(Simple Authentication and Security Layer)是一种网络通信协议层,它为客户端和服务器之间的安全认证和传输层加密提供了一个框架。
SASL可以在多种应用层协议上使用,包括LDAP、IMAP、SMTP等。
SASL通过插件机制支持多种不同的认证机制,例如Kerberos、PLAIN(明文)、CRAM-MD5等。
这些认证机制允许客户端和服务器进行身份验证,并确保通信过程中的消息机密性和完整性。
3. ZooKeeper中使用SASL原理在ZooKeeper中,SASL用于对客户端和服务器之间的通信进行安全认证。
它通过在ZooKeeper客户端和服务器之间建立一个安全的通道,来保护敏感数据的传输。
3.1. 客户端认证当客户端连接到ZooKeeper服务器时,首先需要进行身份验证。
客户端可以选择使用不同的SASL机制与服务器进行认证。
以下是一个简化的客户端认证流程:1.客户端向服务器发送一个初始请求。
2.服务器返回一个包含支持的SASL机制列表的响应。
3.客户端选择一个合适的SASL机制,并将其作为下一步认证过程的参数。
4.客户端使用选定的SASL机制生成一个初始凭据,并将其发送给服务器。
5.服务器验证凭据,并返回下一步认证所需的挑战(challenge)。
6.客户端接收挑战并生成响应。
7.客户端将响应发送给服务器进行验证。
zookeeper工作原理Zookeeper是一个开放源代码的分布式协调服务框架,主要用于解决分布式系统中的一致性问题。
它为分布式应用程序提供了高性能、可靠的分布式协调服务,使得开发者可以更加简单地构建和管理分布式系统。
Zookeeper的工作原理可以分为以下几个方面:1. 集群模式:Zookeeper采用集群模式工作,由多个节点组成一个Zookeeper集群。
其中,有一个leader节点负责协调其他节点的工作,其他节点则作为follower节点进行服务。
当leader节点出现故障时,Zookeeper会在多个follower节点中选举出一个新的leader节点,以保证系统的可用性。
2. 数据模型:Zookeeper将所有数据组织成一个层次化的命名空间,类似于文件系统的结构。
每个节点被称为znode,可以存储一些元数据信息,如数据值、ACL(访问控制列表)等。
Zookeeper提供了一套API用于操作这些znode,包括创建、删除、更新等。
3. Watch机制:Zookeeper中的每个znode都可以注册一个watcher,用于监听znode的变化。
当znode发生变化时,Zookeeper会通知对该znode注册了watcher的客户端。
这种watch机制可以让客户端实时感知到系统状态的变化,从而做出相应的处理。
4. 事务日志和快照:Zookeeper通过将所有的修改操作写入事务日志来保证数据的一致性。
事务日志中的每一条记录都有一个唯一的事务ID,通过该ID可以进行序列化和恢复操作。
为了提高读取性能,Zookeeper还会周期性地创建快照,将内存中的数据保存到磁盘上。
当系统异常停止时,可以通过读取最新的快照和事务日志来快速恢复系统状态。
5. 选举算法:Zookeeper使用了一种基于投票的选举算法来选举leader节点。
选举过程主要分为两个阶段:首先,每个节点发起一个投票请求,并将自己的标识和最大事务ID发送给其他节点;然后,每个节点根据收到的投票请求进行投票,并将选票发送给其他节点。
zookeeper源码编译ZooKeeper是一个开源的分布式协调服务项目,它提供了一个分布式的、高性能的、高可用的分布式协调服务框架。
本文将以ZooKeeper源码编译为标题,介绍ZooKeeper的源码编译过程和相关内容。
一、ZooKeeper简介ZooKeeper是一个分布式协调服务,它的主要目标是为分布式应用提供协调服务和统一命名服务。
ZooKeeper提供了一个简单的文件系统接口和一套基本的原语,可以帮助开发人员构建分布式应用。
二、ZooKeeper源码编译环境配置在进行ZooKeeper源码编译之前,我们需要准备好合适的开发环境。
首先,我们需要安装Java JDK,并配置好JAVA_HOME环境变量。
其次,我们需要安装Apache Ant和Apache Maven,这两个工具将帮助我们进行源码编译和构建。
三、ZooKeeper源码下载与编译1. 下载源码:我们可以从ZooKeeper的官方网站上下载最新的稳定版本的源码包。
下载完成后,解压缩源码包到任意目录下。
2. 配置编译参数:在源码目录下,我们可以找到一个名为build.xml的Ant构建脚本文件。
在该文件中,我们可以配置一些编译参数,例如JDK版本、编译目标版本等。
3. 编译源码:打开命令行工具,切换到源码目录下,并执行以下命令进行编译:ant compile该命令将会编译ZooKeeper的源码,并生成编译后的class文件。
4. 构建发布包:执行以下命令进行构建:ant jar该命令将会构建ZooKeeper的发布包,包括JAR文件和文档等。
四、ZooKeeper源码结构解析ZooKeeper的源码结构清晰明了,主要包括以下几个部分:1. src目录:包含了ZooKeeper的Java源代码,其中包括核心逻辑和实现。
2. conf目录:包含了一些配置文件,例如zoo.cfg,用于配置ZooKeeper的运行参数。
3. lib目录:包含了一些依赖的JAR包,这些JAR包将会被ZooKeeper引用。
zookper的工作原理Zookeeper是一个分布式协调服务,用于在分布式系统中管理和协调大规模的集群。
它的工作原理包括以下几个方面:1. 数据模型:Zookeeper以类似文件系统的层次化命名空间结构(称为znode)来存储和管理数据。
每个znode都可以包含数据以及与其他znode的关联关系。
2. 一致性协议:Zookeeper使用ZAB(Zookeeper Atomic Broadcast)协议,该协议确保了在整个集群中的数据一致性。
ZAB协议通过一个主节点(leader)和多个从节点(follower)来实现。
3. 数据访问与监听:Zookeeper提供了一套API,允许客户端对znode进行读写操作,并且可以监听znode的变化。
客户端可以通过创建临时节点和顺序节点来实现分布式锁、选举等功能。
4. 事件通知机制:一旦znode发生变化,Zookeeper会向监听该znode的客户端发送通知。
客户端可以根据这些通知做相应的处理,实现实时的数据同步和事件驱动。
5. 高可用性和容错性:Zookeeper通过在集群中多个机器上复制数据来提供高可用性和容错性。
如果主节点宕机,从节点会发起选举过程,选择一个新的主节点来继续处理客户端请求。
6. 事务日志和快照:Zookeeper将所有的写操作以及相关的元数据记录在事务日志中,以便在节点重启时进行恢复。
同时,它还会定期生成数据快照,以提高系统的恢复性能。
总的来说,Zookeeper通过一致性协议、数据模型、事件通知机制和高可用性策略等多种机制,确保了分布式系统中的数据一致性、节点的高可用性和容错性,为分布式应用提供了可靠的协调服务。
本篇文章结构:总共包括10个系列ZooKeeper系列之一:ZooKeeper简介ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念ZooKeeper系列之三:ZooKeeper的安装ZooKeeper系列之四:ZooKeeper的配置ZooKeeper系列之五:ZooKeeper的运行ZooKeeper系列之六:ZooKeeper四字命令ZooKeeper系列之七:ZooKeeper命令行工具ZooKeeper系列之八:ZooKeeper的简单操作ZooKeeper系列之九:ZooKeeper API简介及编程ZooKeeper系列之十:ZooKeeper的一致性保证及Leader选举---------------------------------------------------------------------------------------ZooKeeper系列之一:ZooKeeper简介ZooKeeper 是一个为分布式应用所设计的分布的、开源的协调服务。
分布式的应用可以建立在同步、配置管理、分组和命名等服务的更高级别的实现的基础之上。
ZooKeeper 意欲设计一个易于编程的环境,它的文件系统使用我们所熟悉的目录树结构。
ZooKeeper 使用 Java 所编写,但是支持 Java 和 C 两种编程语言。
众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处于竞态以至于出现死锁。
我们设计ZooKeeper的目的是为了减轻分布式应用程序所承担的协调任务。
ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念ZooKeeper数据模型和层次命名空间提供的命名空间与标准的文件系统非常相似。
一个名称是由通过斜线分隔开的路径名序列所组成的。
ZooKeeper中的每一个节点是都通过路径来识别。
下图是Zookeeper中节点的数据模型,这种树形结构的命名空间操作方便且易于理解。
zookeeper的set格式【最新版】目录1.ZooKeeper 简介2.set 格式的作用3.set 格式的基本语法4.set 格式的实例分析5.小结正文1.ZooKeeper 简介ZooKeeper 是一个开源的分布式协调服务,它主要用于分布式系统的协调和管理,例如分布式系统的配置管理、命名服务、分布式锁等。
ZooKeeper 提供了丰富的 API,使得开发者可以方便地实现这些功能。
2.set 格式的作用在 ZooKeeper 中,set 格式是一种用于创建或更新某个节点的值的操作。
通过 set 格式,可以实现对分布式系统中的数据进行有效的管理。
3.set 格式的基本语法set 格式的基本语法如下:```zkCli.set(znodePath, data, watcher)```其中,参数说明如下:- znodePath:要创建或更新的节点路径。
- data:要存储的数据。
- watcher:可选参数,用于监视节点的变化,当节点发生变化时,会触发回调函数。
4.set 格式的实例分析下面是一个使用 Python 实现的 set 格式的实例:```pythonimport zookie# 创建一个 ZooKeeper 客户端zk = zookie.ZooKeeper()# 连接到 ZooKeeper 服务器zk.connect("127.0.0.1:2181")# 创建一个节点,并设置其值为"Hello, ZooKeeper!"zk.set("/myNode", "Hello, ZooKeeper!")# 获取节点的值value = zk.get("/myNode")print("Value of /myNode:", value)# 监视节点的变化zk.watch("/myNode", (data, stat) => print("Data changed:", data))# 关闭 ZooKeeper 客户端zk.close()```5.小结通过以上介绍,我们可以看出,ZooKeeper 的 set 格式是一种非常实用的操作,它可以帮助我们方便地管理和协调分布式系统中的数据。
zoomkeeper原理Zookeeper是一个分布式的开源协调服务,它可以提供高可用性、高可靠性的分布式协调服务。
Zookeeper的原理主要包括以下几个方面:1. 集群模式Zookeeper是以集群模式运行的,每个节点都是相同的。
在集群中,有一个节点作为Leader,其他节点作为Follower。
Leader负责处理客户端请求,并将更新广播给所有Follower。
2. 数据模型Zookeeper将数据存储在树形结构中,类似于文件系统。
每个节点都有一个路径和一个值。
路径类似于文件系统中的目录路径,而值则类似于文件系统中的文件内容。
3. 会话管理Zookeeper使用会话来管理客户端连接。
当客户端连接到Zookeeper时,会话被创建,并在一段时间内保持活动状态。
如果会话超时或断开连接,则客户端必须重新连接并创建新的会话。
4. Watcher机制Watcher机制使得客户端能够接收到关于节点变化的通知。
当某个节点发生变化时,Zookeeper会向所有监听该节点变化的客户端发送通知。
5. 事务处理Zookeeper支持事务处理,并使用版本号来确保数据一致性。
当多个客户端同时尝试更新同一个节点时,只有一个客户端能够成功更新该节点,并且其他客户端会收到版本号不匹配的错误。
6. Paxos算法Zookeeper使用Paxos算法来保证数据的一致性。
Paxos算法是一种分布式一致性协议,它可以确保不同节点之间的数据一致性。
7. 客户端连接客户端连接到Zookeeper时,会先与其中一个节点建立TCP连接,然后通过该节点将请求转发给Leader。
Leader处理请求后将结果返回给客户端。
总之,Zookeeper是一个高可用性、高可靠性的分布式协调服务,它使用集群模式、数据模型、会话管理、Watcher机制、事务处理和Paxos算法等多种技术来实现数据的一致性和可靠性。
同时,客户端连接也是Zookeeper实现原理中不可或缺的部分。
Zookeeper简介及使⽤⼀、Zookeeper简介1、zookeeper简介动物管理员Apache ZooKeeper致⼒于开发和维护开源服务器,实现⾼度可靠的分布式协调。
2、什么是ZooKeeper?ZooKeeper是⼀种集中式服务,⽤于维护配置信息,命名,提供分布式同步和提供组服务。
所有这些类型的服务都以分布式应⽤程序的某种形式使⽤。
每次实施它们都需要做很多⼯作来修复不可避免的错误和竞争条件。
由于难以实现这些类型的服务,应⽤程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。
即使正确完成,这些服务的不同实现也会在部署应⽤程序时导致管理复杂性。
3、zookeeper功能(1)存储数据(2)监听4、zookeeper⼯作机制基于观察者模式设计的分布式服务管理框架5、zookeeper的存储结构⽬录树结构6、zookeeper应⽤场景(1)集群统⼀配置管理(2)集群统⼀命名服务(3)集群统⼀管理(4)服务器的动态上下线感知(5)负载均衡7、安装zookeeper单机版(1)下载安装包 zookeeper-3.4.10.tar.gz(2)上传安装包到Linuxalt+p(SecureCRT中)(3)解压tar -zxvf zookeeper-3.4.10.tar.gz(4)修改配置⽂件进⼊zookeeper安装⽬录下的conf⽂件夹下mv zoo_sample.cfg zoo.cfgvi zoo.cfgdataDir=/root/hd/zookeeper-3.4.10/zkData(5)启动zkbin/zkServer.sh start(6)查看状态bin/zkServer.sh status(7)启动客户端bin/zkCli.sh8、完全分布式安装(1)下载安装包 zookeeper-3.4.10.tar.gz(2)上传安装包到Linuxalt+p(SecureCRT中)(3)解压tar -zxvf zookeeper-3.4.10.tar.gz(4)修改配置⽂件进⼊zookeeper安装⽬录下的conf⽂件夹下mv zoo_sample.cfg zoo.cfgvi zoo.cfgdataDir=/root/hd/zookeeper-3.4.10/zkData###############cluster###############server.1=hd09-1:2888:3888server.2=hd09-2:2888:3888server.3=hd09-3:2888:3888其中server.后⾯的数字1、2、3分别是机器hd09-1、hd09-2、hd09-3中zookeeper-3.4.10/zkData/myid⽂件中的值(5)添加⽂件myid$cd zookeeper-3.4.10/zkData$touch myid(6)添加内容在myid为1$ vi myid1(7)发送zookeeper⽂件到其它机器$ scp -r zookeeper-3.4.10 hd09-2:$PWD$ scp -r zookeeper-3.4.10 hd09-3:$PWD(8)修改myid依次为2 3(9)修改环境变量vi /etc/profileexport ZOOKEEPER_HOME=/root/hd/zookeeper3.4.10 export PATH=$PATH:$ZOOKEEPER_HOME/bin (10)⽣效环境变量source /etc/profile(11)启动zookeeperzkServer.sh start(12)查看状态zkServer.sh status(13)关闭zookeeperzkServer.sh stop9、客户端的命令⾏操作(1)启动客户端zkCli.sh(2)查看帮助help(3)查看当前znode所包含的内容ls /(4)创建节点create /hello 18(5)创建短暂znodecreate -e /haha tom(6)创建带序号znodecreate -s /bigdata tom(7)创建短暂带序号create -e -s /bigdata tom(8)查看此节点的详细信息ls2 /(9)获得节点值监听get /hello watch(10)监听路径ls / watch(11)修改znode数据set /hello iiiii(12)删除节点delete /hello(13)递归删除rmr /delireba(14)查看节点状态信息stat /⼆、Zookeeper⼯作机制1、Zookeeper⼯作机制2、Zookeeper⽬录结构3、Zookeeper选举机制三、Zookeeper简单客户端APIpackage com.css.zk;import java.io.IOException;import java.util.List;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooDefs.Ids;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.data.Stat;import org.junit.Before;import org.junit.Test;public class ZkClient {private String connectString = "192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181"; private int sessionTimeout = 3000;ZooKeeper zkCli = null;// 初始化客户端@Beforepublic void init() throws IOException {zkCli = new ZooKeeper(connectString, sessionTimeout, new Watcher() {// 回调监听@Overridepublic void process(WatchedEvent event) {// System.out.println(event.getPath() + "\t" + event.getState() + "\t" + event.getType());try {List<String> children = zkCli.getChildren("/", true);for (String c : children) {// System.out.println(c);}} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}// 创建⼦节点@Testpublic void createZnode() throws KeeperException, InterruptedException {String path = zkCli.create("/hello", "world".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(path);}// 获取⼦节点@Testpublic void getChild() throws KeeperException, InterruptedException {List<String> children = zkCli.getChildren("/", true);for (String c : children) {System.out.println(c);}Thread.sleep(Long.MAX_VALUE);}// 删除节点@Testpublic void rmChildData() throws KeeperException, InterruptedException {// byte[] data = zkCli.getData("/bbq", true, null);// System.out.println(new String(data));zkCli.delete("/hello", -1);}// 修改数据@Testpublic void setData() throws KeeperException, InterruptedException {zkCli.setData("/hello", "17".getBytes(), -1);}// 判断节点是否存在@Testpublic void testExist() throws KeeperException, InterruptedException {Stat exists = zkCli.exists("/hello", false);System.out.println(exists == null ? "not exists" : "exists");}}四、Zoopeeper监听API1、监听单节点内容package com.css.zk;import java.io.IOException;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;// 监听单节点内容public class WatchDemo {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {ZooKeeper zkCli = new ZooKeeper("192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181", 3000, new Watcher() {// 监听回调@Overridepublic void process(WatchedEvent event) {}});byte[] data = zkCli.getData("/hello", new Watcher() {// 监听的具体内容@Overridepublic void process(WatchedEvent event) {System.out.println("监听路径为:" + event.getPath());System.out.println("监听的类型为:" + event.getType());System.out.println("监听被修改了");}}, null);System.out.println(new String(data));Thread.sleep(Long.MAX_VALUE);}}2、监听⽬录package com.css.zk;import java.io.IOException;import java.util.List;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;// 监听⽬录public class WatchDemo1 {static List<String> children = null;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {ZooKeeper zkCli = new ZooKeeper("192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181", 3000, new Watcher() {// 监听回调@Overridepublic void process(WatchedEvent event) {System.out.println("正在监听中......");}});// 监听⽬录children = zkCli.getChildren("/", new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听路径为:" + event.getPath());System.out.println("监听的类型为:" + event.getType());System.out.println("监听被修改了");for (String c : children) {System.out.println(c);}}});Thread.sleep(Long.MAX_VALUE);}五、Zookeeper动态上下线感知系统需求某分布式系统当中,主节点有多台,可以进⾏动态上下线,当有任何⼀台机器发⽣了动态的上下线任何⼀台客户端都能感知到。
什么是Zookeeper,Zookeeper的作⽤是什么什么是Zookeeper,Zookeeper的作⽤是什么,它与NameNode及HMaster如何协作?在没有接触Zookeeper的同学,或许会有这些疑问。
这⾥给⼤家总结⼀下。
⼀、什么是ZookeeperZooKeeper 顾名思义动物园管理员,他是拿来管⼤象(Hadoop) 、蜜蜂(Hive) 、⼩猪(Pig) 的管理员, Apache Hbase和 Apache Solr 以及LinkedIn sensei 等项⽬中都采⽤到了 Zookeeper。
ZooKeeper是⼀个分布式的,开放源码的分布式应⽤程序协调服务,ZooKeeper是以Fast Paxos算法为基础,实现同步服务,配置维护和命名服务等分布式应⽤。
上⾯的解释感觉还不够,太官⽅了。
Zookeeper 从程序员的⾓度来讲可以理解为Hadoop的整体监控系统。
如果namenode,HMaster宕机后,这时候Zookeeper 的重新选出leader。
这是它最⼤的作⽤所在。
下⾯详细介绍zookeeper的作⽤⼆、zookeeper的作⽤1.Zookeeper加强集群稳定性Zookeeper通过⼀种和⽂件系统很像的层级命名空间来让分布式进程互相协同⼯作。
这些命名空间由⼀系列数据寄存器组成,我们也叫这些数据寄存器为znodes。
这些znodes就有点像是⽂件系统中的⽂件和⽂件夹。
和⽂件系统不⼀样的是,⽂件系统的⽂件是存储在存储区上的,⽽zookeeper的数据是存储在内存上的。
同时,这就意味着zookeeper有着⾼吞吐和低延迟。
Zookeeper实现了⾼性能,⾼可靠性,和有序的访问。
⾼性能保证了zookeeper能应⽤在⼤型的分布式系统上。
⾼可靠性保证它不会由于单⼀节点的故障⽽造成任何问题。
有序的访问能保证客户端可以实现较为复杂的同步操作。
2.Zookeeper加强集群持续性ZooKeeper Service<ignore_js_op>组成Zookeeper的各个服务器必须要能相互通信。
Zookeeper介绍
简介:
Zookeeper看名字是动物园管理员,这个跟它的功能是非常的一致的。
Zookeeper 分布式服务框架是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
ZooKeeper典型的应用场景:
Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave 管理模式。
a.统一命名服务(Name Service)
b.配置管理(Configuration Management)
c.集群管理(Group Membership)
d.共享锁(Locks)
e.队列管理
安装及配置:
单机模式
单机安装非常简单,只要获取到Zookeeper 的压缩包并解压到某个目录如:/home/zookeeper-3.2.2 下,Zookeeper 的启动脚本在bin 目录下,Linux 下的启动脚本是zkServer.sh。
在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。
下面详细介绍一下,这个配置文件中各个配置项的意义。
tickTime=2000
dataDir=D:/devtools/zookeeper-3.2.2/build
clientPort=2181
∙tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
∙dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
∙clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
集群模式
Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。
实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。
Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。
集群模式除了上面的三个配置项还要增加下面几个配置项:
initLimit=5
syncLimit=2
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888
∙initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务
器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受
多少个心跳时间间隔数。
当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个
客户端连接失败。
总的时间长度就是 5*2000=10 秒
∙syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间
长度就是 2*2000=4 秒
∙server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务
器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要
一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来
执行选举时服务器相互通信的端口。
如果是伪集群的配置方式,由于 B 都
是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它
们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
更多详细介绍,请参考:
/developerworks/cn/opensource/os-cn-zookeeper/
/zookeeper/。