实例介绍
深入浅出ZooKeeper,zookeeper入门必读,zookeeper原理讲解
自序 自序 2016年9月底,于北京 最早接触 ZooKeeper是因为工作上使用了 Kafka集群,看了一些 ZooKeeper的资料。那时对 κoκeper懵懵懂懂’后来心里有很多疑问。比如’那吋裉本搞不清Zσ kEeper是如何实现集 群调度的’ client的意义和zηode的意义是什么? leader选举是 ZooKeeper服务器之冋的策略算 法还是 Client之间的策略算法’甚至当时我員的混淆了(书中也提到了这一点)? ZooKeeper到底起了什么作用?而且最开始的一个锆误理解,认为每一台 Kafka服务器上都需 要一个 ZooKeeper’然后 ZooKeeper来帮助 Kafka实现集群内的数据一致性等特性。 当时按照教程搭建了 Kafka集群,应用起来也是行云流水,好像跟zo0 Keepe没有多大关系 了。后来,我买了本《 Hadoop: The definitive guide4 th edition》。当通读了 ZooKeeper相 关章节后,我的心里对我之前 ZooKeeper的认识,只剩下两个字了——呵呵- 切都好像拨云见日那样清爽了。不仅仅是对 ZooKeeper的认识更深了’也让自己对分布式 系统的认识上升了一个台阶。 最后,我考慮要整理一下关于 ZooKeeper的读书笔记’其实内容多是读书时自己的翻译。那 为什么不把《 Hadoop: The Definitive guide4 th edition》关于 ZooKeeper的内容翻译过来 呢’这样不是对于我来说更简单一些?于是,我就在我的博客上开始了翻译工作。 经过两个月陆陆续续的翻译’现在终于可以发出来了!本书的内容来自《 Hadoop:The Definitive guide4 th edition》’在这里向书的作者和贡献者致以崇高的敬意。 本书的内容纯属个人业余翻译,欢迎各位读者批评!这里留下作者的emai,欢迎大家吐 槽! holynull(@126com 概逑 概述 Zookeeper是Hadp分布式调度服务,用来构建分布式应用系统。构建一个分布式应用是一 个很复杂的事情·主要的原因是我们需要合理有效的处理分布式集群中的部分失败的问题。 例如’集群中的节点在相互通信时,A节点向B节点发送消息。A节点如果想知道消息是否发 送成功’只能由B节点告诉A节点。那么如果B节点关机或者由于其他的原因脱离集群网络 问題就出现了。A节点不断的向B发送消息,并且无法获得B的响应。B也没有办法通知A节点 已经离线或者关机。集群中其他的节点完全不知道B发生了什么情况·还在不断的向B发送消 息。这时·你的整个集群就发生了部分失败的故障。 乙 keeper不能让部分失败的问题彻底消失,但是它提供了一些工具能够让你的分布式应用安 全合理的处理部分失败的问题。 安装和运行 Zookeeper 安装和运行 Zookeeper 我们采用 standalone模式’安装运行一个单独的 zookeeper服务。安装前请确认您已经安装了 Java运行环境。 我们去 Apache ZooKeeper releases page下载z0 keeper安装包’并解压到本地 tar xzf zookeeper-x y.Z. tar. gz ZooKeeper提供了一些可执行程序的工具,为了方便起见,我们将这些工具的路径加入到 PATH环境变量中 export Z00KEEPER_HOME=-/sw/zookeeper-x.yZ export PatH=$PATH: $ZOOKEEPER HOME/bin 运行 ZooKeeper之前我们需要编写配置文件。配置文件一般在安装目录下的con/z0o.cfg 我们可以把这个文件放在/etc/ zookeeper下’或者放到其他目录下’并在环境变量设 置z00 CEGDIR指向这个个目录。下面是配置文件的内容: tickTime=2000 dataDir=/Users/tom/zookeeper clientport=2181 tickTime是 zookeeper中的基本时间单元’单位是毫秒。 datadirz是z0 okeepe持久化数据存放 的目录。 clientPort是 zookeeper监听客户端连接的端口’默认是2181 启动命令 zkServer, sh star t 我们通过nc或者 telnet命令访问2181端口,通过执行ruok( Are you OK?)命令来检查 zookeeper是否启动成功: %echo ruok nc localhost 2181 imok 那么我看见 zookeeper回答我们屮moK”。下表中是所有的 zookeeper的命名,都是由4个字符 组成 安装和运行 Zookeeper Category Command Description Server ruok Prints imok if the server is running and not in an error status state conf Prints the server configuration( from zoo. cfg) Prints the server environment, including ZooKeeper env version, Java version and other system properties Prints server statistics, including latency statistics, the srvr number of znodes, and the server mode(standalone leader, or follower) stat Prints server statistics and connected clients srst Resets server statistics Shows whether the server is in read-only(ro) mode(due sro to a network partition or read/write mode (rw) Client Lists all the sessions and ephemeral znodes for the ensemble. You must connect to the leader(see srvr)for connections dump this command cons Lists connection statistics for all the server' s clients crst Resets connection statistics Watches wchs Lists summary information for the server's watches Lists all the server's watches by connection caution wChc may impact server performance for a large number of watches Lists all the servers watches by znode path. Caution wchp may impact server performance for a large number of watches Lists server statistics in Java properties format, suitable Monitoring mntr as a source for monitoring systems such as ganglia and lagIos 350以上的版本会有一个内嵌的web服务,通过访问http://localhost:8080/commands来访问 以上的命令列表。 Z0 keeper开发实例 Zookeeper.开发实例 这一节我们将讲解如何编写 Zookeeper客户端的程序’来控制 zookeeper上的数据’以达到管 理客户端所在集群的成员关系。 Z00 Keeper中的组和成员 ZooKeeper中的组和成员 我们可以把 Zookeeper理解为一个高可用的文件系统。但是它没有文件和文件夹的概念’只有 个叫傚 znode的节点概念。那么 znode即是数据的容器,也是其他节点的容器。(其实 znode就可以理解为文件或者是文件夹)我们用父节点和子节点的关系来表示组和成员的关 系。那么一个节点代表一个组,组节点下的子节点代表组内的成员。如下图所示 Z00 /zoo/duck /zoo/goat /z00/cow 创建组 创建组 我们使用z0 keeper的 Java aP来创建一个/z00的组节点 public class createGroup implements watcher i private static final int SESSION_TIMEOUT =5000 private ZooKeeper zk private Count DownLatch connectedsignal new Count DownLatch(1)i public void connect(string hosts)throws IOException InterruptedException I zk new ZooKeeper(hosts SESSION_TIMEoUT, this); connectedSignal await( } @override public void process(Watched Event event)t// watcher interface if (event. getstate( = Keeperstate Syncconnected) nnectedsignal, countDown public void create(string groupName) throws Keeper Exception InterruptedException t String path groupName i String createdPath Zk create(path, null/data/, Ids. OPEN_ ACL UNSAFE, CreateMode. PERSISTENT) System. out. println ( created createdPath) public void close( throws InterruptedException t Zk close (i public static void main(String[ args)throws Exception i CreateGroup createGroup new createGroup oi createGroup connect(args[o]i createGroup create(args[1])i createGroup close() 当main()执行时,首先创建了一个 CreateR oup的对象’然后调用 connec t()方法,通过 zookeeper的A門|与z0 keeper服务器连接。创建连接我们需要3个参数:一是服务器端主杌名 称以及端口号’二是客户端连接服务器 session的超时时间,三是Ⅵ atcher.接口的一个实例。 Watcher实例负贲接收 Zookeeper数据变化吋产生的事件回调。 创建组 在连接函数中创建了zσ keeper的实例’然后建立与服务器的连接。建立连接函数会立即返 ’所以我们需要等待连接建立成功后再进行其他的操作。我们使用 CountDownlatch来阻塞 当前线程’直到z0 keeper准备就绪。这时我们就看到 Watcher的作用了。我们实现了 Watcher接口的一个方法 public void process(watchedEvent event ) i 当客户端连接上了 zookeeper,服务器, Watcher将由 process(()函数接收一个连接成功的事 件。我们接下来调用 CountDownlatch’释放之前的阻塞。 连接成功后’我们调用 create()方法。我们在这个方法中调用 zookeeper实例的 create()方 法来创建一个 znode。参数包括:一是 znode的path;二是znoe的内容(一个二选制数 组)三是一个 access control list八ACL’访问控制列表’这里使用完全开放模式)·最后是 znode的性质。 znode的性质分为 ephemeral和 persistent两种。 ephemeral性质的 znode在创建他的客户端的 会话结束’或者客户端以其他原因断开与服务器的连接吋’会被自动删除。而 persistent性质 约 znode就不会被自动删除’除非客户端主动删除,而且不一定是创建它的客户端可以删除 它’其他客户端乜可以删除它。这里我们创建一个 persistent的 znode create()将返回 znode的path我们讲新建 znode的pah打印出来 我们执行如上程序 export CLASSPATH=ch21-zk/target/classes/: $ Z00KEEPER_HOME/*: $ZooKEEPER HOME/lib/*: Z00KEEPER HOME/conf java createGroup localhost zoo Created /zoo 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论