搭建 ZooKeeper 服务器的便捷方法 附ZooKeeper集群环境搭建实践.docx

上传人:太** 文档编号:72868398 上传时间:2023-02-13 格式:DOCX 页数:8 大小:23.04KB
返回 下载 相关 举报
搭建 ZooKeeper 服务器的便捷方法 附ZooKeeper集群环境搭建实践.docx_第1页
第1页 / 共8页
搭建 ZooKeeper 服务器的便捷方法 附ZooKeeper集群环境搭建实践.docx_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《搭建 ZooKeeper 服务器的便捷方法 附ZooKeeper集群环境搭建实践.docx》由会员分享,可在线阅读,更多相关《搭建 ZooKeeper 服务器的便捷方法 附ZooKeeper集群环境搭建实践.docx(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、搭建ZooKeeper服务港的便捷方法ZooKeeper是Apache的一个顶级项目,为分布式应用提供高效、高可用的 分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协 调/通知和分布式锁等分布式基础服务。由于ZooKeeper便捷的使用方式、卓越 的性能和良好的稳定性,被广泛地应用于诸如Hadoop、HBasc Kafka和Dubbo 等大型分布式系统中。ZooKeepcr有三种运行模式:单机模式、伪集群模式和集群模式。单机模式:这种模式一般适用于开发测试环境,一方面我们没有那么多机器 资源,另外就是平时的开发调试并不需要极好的稳定性。集群模式:一个ZooKeeper集群

2、通常由一组机器组成,一般3台以上就可以 组成一个可用的ZooKe印er扇群了。组成ZooKeeper集群的每台机器都会在内存 中维护当前的服务器状态,并且每台机器之间都会互相保持通信。伪集群模式:这是一种特殊的集群模式,即集群的所有服务器都部署在一台 机器上。当你手头上有一台比较好的机器,如果作为单机模式进行部署,就会浪 费资源,这种情况下,ZooKeeper允许你在一台机器上通过启动不同的端口来启 动多个ZooKeeper服务实例,以此来以集群的特性来对外服务。ZooKeeper的相关知识ZooKeeper中的角色领导者(leader):负责进行投票的发起和决议,更新系 统状态跟随者(fol

3、lower):用于接收客户端请求并给客户端返回结果,在选主过程 中进行投票观察(observer):可以接受客户端连接,将写请求转发给leader,但是 observer不参加投票的过程,只是为了扩展系统,提高读取的速度。ZooKeeper中的角色ZooKeeper的数据模型层次化的目录结构,命名符合常规文件系统规范,类似于Linux每个节点在ZooKeeper中叫做Znode,并且其有一个唯一的路径标识节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有 子节点Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那 么查询这个路径下的数据就需要带上版本客

4、户端应用可以在节点上设置监视器节点不支持部分读写,而是一次性完整读写ZooKeeper的节点特性ZooKeeper节点是生命周期的,这取决于节点的类型。在ZooKeepcr中,节 点根据持续时间可以分为持久节点(PERSISTENT)、临时节点(EPHEMERAL), 根据是否有序可以分为顺序节点(SEQUENTIAL)、和无序节点(默认是无序的)。持久节点一旦被创建,除非主动移除,不然一直会保存在ZooKeeper中(不 会因为创建该节点的客户端的会话失效而消失),临时节点。ZooKeeper的应用场景ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos 算法的实现

5、,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的 特性,使得ZooKeeper解决很多分布式问题。值得注意的是,ZooKeeper并非天生就是为这些应用场景设计的,都是后来 众多开发者根据其框架的特性,利用其提供的一系列API接口(或者称为原语 集),摸索出来的典型使用方法。数据发布与订阅(配置中心)发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKc叩er节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态 更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。应用中用到的一些配置信息放到ZK上进行集中管理。这类场景通常是这样:

6、应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher, 这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达 到获取最新配置信息的目的。分布式搜索服务中,索引的元信息和服务器集群机 器的节点状态存放在ZooKeeper的一些指定节点,供各个客户端订阅使用。分布 式日志收集系统。这个系统的核心工作是收集分布在不同机器的日志。收集器通 常是按照应用来分配收集任务单元,因此需要在ZooKeeper上创建一个以应用名 作为path的节点P,并将这个应用的所有机器IP,以子节点的形式注册到节点P 上,这样一来就能够实现机器变动的时候,能够实时通知到收集器调整任务分

7、配。 系统中有些信息需要动态获取,并且还会存在人工手动去修改这个信息的发问。 通常是暴露出接口,例如JMX接口,来获取一些运行时的信息。引入ZooKeeper 之后,就不用自己实现一套方案了,只要将这些信息存放到指定的ZooKeeper 节点上即可。注意:在上面提到的应用场景中,有个默认前提是:数据量很小, 但是数据更新可能会比较快的场景。负载均衡这里说的负载均衡是指软负载均衡。在分布式环境中,为了保证高可用性, 通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者 就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的 是消息中间件中的生产者,消费者负载均衡

8、。命名服务(NamingScrvicc)命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使 用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等 信息。被命名的实体通常可以是集群中的机器,提供的服务地址,远程对象等等 -一这些我们都可以统称他们为名字(Name)。其中较为常见的就是一些分布式 服务框架中的服务地址列表。通过调用ZK提供的创建节点的API,能够很容易 创建一个全局唯一的path,这个path就可以作为一个名称。阿里巴巴集团开源的分布式服务框架Dubbo中使用ZooKcepcr来作为其命 名服务,维护全局的服务地址列表。在Dubbo实现中:服务提供

9、者在启动的时 候,向ZooKecpcr上的指定节点/dubbo/$serviceName/providers目录下写入自己 的URL地址,这个操作就完成了服务的发布。服务消费者启动的时候,订阅 /dubbo/$serviceName/providers 目录下的提供者 URL 地址,并向 /dubbo/$serviceName(/consumers目录下写入自己的URL地址。注意,所有向 ZooKeeper上注册的地址都是临时节点,这样就能够保证服务提供者和消费者能 够自动感应资源的变化。另外,Dubbo还有针对服务粒度的监控,方法是订阅/dubbo/$serviceName 目录下所有提供者

10、和消费者的信息。分布式通知/协调ZooKeeper中特有walcher注册与异步通知机制,能够很好的实现分布式环 境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是 不同系统都对ZooKeeper上同一个Znode进行注册,监听Znode的变化(包括 Znode本身内容及子节点的),其中一个系统update 了 Znode,那么另一个系统 能够收到通知,并作出相应处理。另一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是 通过zk上某个节点关联,大大减少系统耦合。另一种系统调度模式:某系统有 控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送

11、工 作。管理人员在控制台作的一些操作,实际上是修改了 ZooKeeper上某些节点的 状态,而ZooKeeper就把这些变化通知给他们注册Walcher的密户端,即推送系 统,于是,作出相应的推送任务。另一种工作汇报模式:一些类似于任务分发系统,子任务启动后,到 ZooKeepcr来注册一个临时节点,并且定时将自己的进度进行汇报(将进度写回 这个临时节点),这样任务管理者就能够实时知道任务进度。分布式锁分布式锁,这个主要得益于ZooKeeper为我们保证了数据的强一致性。锁服 务可以分为两类,一个是保持独占,另一个是控制时序。所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成

12、功获得这把锁。通常的做法是把ZooKe叩er上的一个Znode看作是一把锁,通过 crcatcznode的方式来实现。所有客户端都去创建/distributelock节点,最终成功创 建的那个客户端也即拥有了这把锁。控制时序,就是所有视图来获取这个锁的客 户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只 是这里/distributelock已经预先存在,客户端在它下面创建临时有序节点(这个可 以通过节点的属性控制:CreateMode.EPHEMERALSEQUENTIAL来指定)。 ZooKeeper的父节点(/distributelock)维持一份sequence,保

13、证子节点创建的时 序性,从而也形成了每个客户端的全局时序。由于同一节点下子节点名称不能相同,所以只要在某个节点下创建Znode, 创建成功即表明加锁成功。注册监听器监听此Znode,只要删除此Znode就通知 其他客户端来加锁。创建临时顺序节点:在某个节点下创建节点,来一个请求则创建一个节点, 由于是顺序的,所以序号最小的获得锁,当释放锁时,通知下一序号获得锁。分布式队列队列方面,简单来说有两种,一种是常规的先进先出队列,另一种是等队列 的队员聚齐以后才按照顺序执行。对于第一种的队列和.卜.面讲的分布式锁服务中 控制时序的场景基本原理一致,这里就不赘述了。第二种队列其实是在FIFO队列的基础上

14、作了一个增强。通常可以在/queue 这个Znode下预先建立一个/queue/num节点,并且赋值为n (或者直接给/queue 赋值n),表示队列大小,之后每次有队列成员加入后,就判断下是否已经到达 队列大小,决定是否可以开始执行了。这种用法的典型场景是,分布式环境中, 一个大任务TaskA,需要在很多子任务完成(或条件就绪)情况下才能进行。这 个时候,凡是其中一个子任务完成(就绪),那么就去/taskList下建立自己的临 时时序节点(CreateMode.EPHEMERAL_SEQUENTIAL),当/taskList 发现自己下 面的子节点满足指定个数,就可以进行示一步按序进行处理了

15、。使用dokcer-compose搭建集群上面我们介绍了关于ZooKeeper有这么多的应用场景,那么接下来我们就先 学习如何搭建ZooKeeper集群然后再进行实战上面的应用场景。文件的目录结构 如下:|docker-compose.yml编写 docker-compose.yml 文件dockcr-compose.yml 文件内容如下:version:3.4services:zoo I:image:zookeeperrestart:always hostname:zoolports:-2181:2181environment:ZOO_MYD: 1ZOO_SERVERS:server. 1

16、=0.0.0.0:2888:3888;218 lserver.2=zoo2:2888:3888;218 1 server.3=zoo3:2888:3888;2181 zoo2:imagc:zookccpcrrestart: al wayshostname:zoo2ports:-2182:2181environment:Z00_MYJD:2ZOO_SERVERS:servcr. 1 =zoo 1:2888:3888;2181 servcr.2=0.0.0.0:2888:3888;218 1 server.3=zoo3:2888:3888;2181 zoo3:image:zookeeperrest

17、art:alwayshostname:zoo3ports:-2183:2181environment:Z00_MYD:3ZOO_SERVERS:server. 1 =zoo 1:2888:3888;2181 server.2=zoo2:2888:3888;2181s erver.3=0.0.0.0:2888:3888;2181在这个配置文件中,Docker运行了 3个ZooKeeper镜像,通过ports字段分 别将本地的2181, 2182, 2183端口绑定到对应容器的2181端口上。ZOOMYID和ZOOSERVERS是搭建ZooKeeper集群需要的两个环境变量。 ZOOMYID标识服

18、务的id,为1-255之间的整数,必须在集群中唯一。 ZOOSERVERS是集群中的主机列表。在docker-compose.yml所在目录下执行docker-composeup,可以看到启动的 日志。连接 ZooKeeper将集群启动起来以后我们可以连接ZooKeeper对其进行节点的相关操作。首先我们需要将ZooKeepcr下载下来将其解压进入其conf目录中,将zoo_samplc.cfg改成zoo.cfg配置文件说明:#Thenumberofmillisecondsofeachtick#tickTime: CS通信心跳数#ZooKeeper服务器之间或客户端与服务器之间维持心跳的时间间

19、隔,也就 是每个tickTime时间就会发送一个心跳。tickTime以亳秒为单位。tickTime=2000#Thcnumberofticksthatthcinitial#synchronizationphasecantake#initLimit: LF初始通信时限#集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容 忍的最多心跳数(tickTime的数量)。initLimit=5#Thenumberofticksthatcanpassbetween#sendingarcqucstandgcttinganacknowlcdgcmcnt#syncLimit: LF

20、同步通信时限#集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最 多心跳数(tickTime的数量)。syncLimit=2#thedirectorywherethesnapshotisstored.#donotuse/tmpforstorage,/tmphereisjust#cxamplcsakes.#dataDir:数据文件目录#ZooKeepcr保存数据的目录,默认情况下,ZooKeeper将写数据的日志文件 也保存在这个目录里。dataDir=/data/soft/zookeeper-3.4.12/data#dataLogDir:日志文件目录#ZooKeep

21、er保存日志文件的目录。#theportatwhichtheclientswillconnect#clientPort:客户端连接端口#客户端连接ZooKeeper服务器的端口,ZooKeeper会监听这个端口,接受 客户端的访问请求。clientPort=2181#themaximumnumberofclientconnections.#increasethisifyouneedtohandlemoreclients#maxClientCnxns=60#Besuretoreadthemaintenancesectionofthe#administratorguidebeforeturning

22、onautopurge.#/zookeeper.apache.org/doc/current/zookeeperAdmin.#sc_maintenance#ThenumberofsnapshotstoretainindataDir#autopurgc.snapRctainCount=3#Purgetaskintervalinhours#Setto0todisableautopurgefealure#autopurge.purgelnterval= 1# 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口, 选举端口)# 这个配置项的书写格式比较特殊,规则如下:#server.N=

23、YYY:A:B# 其中N表示服务器编号,YYY表示服务器的IP地址,A为LF通信端口, 表示该服务器与集群中的leader交换的信息的端口。B为选举端口,表示选举新 leader时服务器间相互通信的端口(当leader挂掉时,其余服务器会相互通信, 选择出新的leader)。一般来说,集群中每个服务器的A端口都是一样,每个服 务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能是 A端口和B端口不一样。可以不修改zoo.cfg,默认配置就行,接下来在解压后的bin目录中执行命 令./zkCli.sh-serverl 27.0.0.1:2181 就能进行连接 了。Welcomet

24、oZooKeeper!2020-06-0115:03:52,512myid:-INFOmain-SendThread(localhost:218 l):Client Cnxn$SendThread 1025-Openingsocketconnectiontoserverlocalhost/127.0.0.1:2181 .WillnotattempttoauthenticateusingSASL(unknownerror)Jlinesupportisenabled2020-06-0115:03:52,576myid:-INFOmain-SendThread(localhost:218 l):Cl

25、icnt Cnxn$SendThread879-Socketconnectionestablishedtolocalhost/127.0.0.1:2181,init iatingsession2020-06-0115:03:52,599myid:-INFOmain-SendThread(localhost:2181):Client Cnxn$SendThread1299-Sessioneslablishmentcompleteonserverlocalhost/127.0.0.1 :2181,sessionid=0x 1(X)()() 1140()8()()00,negotiatedtimeo

26、ut=30000WATCHER:WatchcdEvcntstatc:SyncConncctcdtypc:Noncpath:nullzk:l 27.0.0.1:2181 (CONNECTED)O接下来我们可以使用命令查看节点了。使用1s命令查看当前ZooKeeper中所包含的内容。命令:1s/zk:l 27.0.0.1:2181 (CONNECTED) 1 ()ls/ zookeeper创建了一个新的Znode节点“zk”以及与它关联的字符串。命令:create/zkmyDatafzk: 127.0.0.1:2181 (CONNECTED) 11 create/zkmyDataCreatcd/z

27、kfzk: 127.0.0.1:2181 (CONNECTED) 12ls/|zk,zookeeperzk:l 27.0.0.1:2181 (CONNECTED) 13获取Znode节点zk。命令:get/zkzk: 127.0.0.1:2181 (CONNECTED) 13get/zkmyDatacZxid=0x400000008ctime=MonJunOI 15:07:50CST2020mZxid=0x400000008mtime=MonJun0115:07:50CST2020pZxid=0x4000()()008cversion=0dataVersion=0aclVersion=0eph

28、emeralOwner=OxOdataLength=6numChildren=0删除Znode节点zk。命令:delete/zkzk:l 27.0.0.1:2181 (CONNECTED) 14dclcte/zkfzk: 127.0.0.1:2181 (CONNECTED) 1511s/zookeeper摘要:Zookeeper是一个很好的集群管理工具,被大量用于分布式计算。如 Hadoop以及Storm系统中。这里简单记录下Zookeeper集群环境的搭建过程。 本文以Ubuntu 12.04LTS作为操作系统环境。准备:这里以三台ubuntu机器为例搭建一个最小的集群环境,三台服务器 或者

29、三台虚拟机均可。安装Ubuntuserver的过程略,可以下载。第一步:服务器配置三台Ubuntuserver准备好之后,假设它们的IP地址分别为 192.168.0.11,192.168.0.12 和 192.168.0.13.将它们的 host 分别命名为 zool,zoo2 和 zoo3o安装Zookeeper需要先装JDK, Ubuntu F安装OracleJDK的文章请参考第二步:下载Zookeeper.去下载最新版本 Zookeeper-3.4.5 的安装包 zookeeper-3.4.5.tar.gz.第三步:安装Zookccpcr注:先在第一台服务器serveri上分别执行(1

30、)(3)步。(1)解压:这里假定以dermis作为用户名进行安装,将zookeepcr-3.4.5.tar.gz 放入/home/dennis 目录下,然后执行“tarzxfzookeeper-3.4.5.tar.gz”解压。(2)配置:将conf/zoo_sample.cfg拷贝一份命名为zoo.cfg,也放在conf目 录下。然后按照如下值修改页中的配置:tickTime=2000dataDir=/var/lib/zookeeper/initLimit=5syncLimit=2clientPort=2181server. l=zoo 1:2888:3888server.2=zoo2:288

31、8:3888server.3=zoo3:2888:3888(3)创建/var/lib/zookeepcr快照目录,并创建serverid文件。$sudomkdir/var/lib/zookeeper$cd/var/lib/zookccpcr在该目录下创建它为myid的文件,内容为1 (这个值随server而改变,后 面会提到)。(4 )将 serveri 上已经配置好的 和 /var/lib/zookeeper两个目录分别拷贝至server2和server3 然后将其上的 /var/lib/zookeeper/myid 的内容修改为 2 和 3.第四步:启动Zookeeper一次启动三台服务器,进入目录下,执行如下启动命令:$sudojava-cpzookeeper-3.4.5.jar:lib/slf4j-api-l .6.1 .jar:lib/slf4j-log4j 12-1.6.1 .jar: lib/log4j-1.2.15.jar:conforg.apache.zookeeper.server.quorum.QuorumPeerMainconf7z oo.cfg注:启动第一台的时候可能会报错,提示zoo2和zoo3,等全部启动完成之 后就不会报错了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com