zookeeper与java交互小结(zookeeper怎么用java创建临时节点)
本文目录
- zookeeper怎么用java创建临时节点
- hbase连接java时,zookeeper总是连接不上,但是确实已经启动,每次连接,都报错
- java连接zookeeper集群,必须配置多个ip吗
- zookeeper 集群 部署好后怎么使用 java
- JAVA 为什么不同注册中心(zookeeper,Eurake) 注册的服务不能互相调用
- 12步教你安装JDK和zookeeper
- Zookeeper在哪些系统中使用,又是怎么用的
zookeeper怎么用java创建临时节点
基本操作下面给出基本的操作 ZooKeeper 的示例代码,这样你就能对 ZooKeeper 有直观的认识了。下面的清单包括了创建与 ZooKeeper 服务器的连接以及最基本的数据操作:ZooKeeper 基本的操作示例// 创建一个与服务器的连接ZooKeeper zk = new ZooKeeper("localhost:" + CLIENT_PORT, ClientBase.CONNECTION_TIMEOUT, new Watcher() { // 监控所有被触发的事件public void process(WatchedEvent event) { System.out.println("已经触发了" + event.getType() + "事件!"); } }); // 创建一个目录节点zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); // 创建一个子目录节点zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); System.out.println(new String(zk.getData("/testRootPath",false,null))); // 取出子目录节点列表System.out.println(zk.getChildren("/testRootPath",true)); // 修改子目录节点数据zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1); System.out.println("目录节点状态:"); // 创建另外一个子目录节点zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null))); // 删除子目录节点zk.delete("/testRootPath/testChildPathTwo",-1); zk.delete("/testRootPath/testChildPathOne",-1); // 删除父目录节点zk.delete("/testRootPath",-1); // 关闭连接zk.close(); 输出的结果如下:已经触发了 None 事件!testRootData 目录节点状态: 已经触发了 NodeChildrenChanged 事件!testChildDataTwo 已经触发了 NodeDeleted 事件!已经触发了 NodeDeleted 事件!当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher 对象的 process 方法就会被调用。
hbase连接java时,zookeeper总是连接不上,但是确实已经启动,每次连接,都报错
HBase的安装包里面有自带zookeeper的。很多系统部署也是直接启动上面的zookeeper。 本来也是没有问题的,想想吧,系统里也只有hbase在用zookeeper。先启动zookeeper,再将hbase起来就好了 ? 但是今天遇到了一个很蛋疼的问题。和同事争论了很久。 ? 因为我们是好多hbase集群共用一个zookeeper的,其中一个集群需要从hbase 0.90.二 升级到hbase 0.9二上,自然,包也要更新。但是其中一台regionserver上面同时也有跑zookeeper,而zookeeper还是用hbase 0.90.二 自带的zookeeper在跑。 ? 现在好了,升级一个regionserver,连着zookeeper也要受到牵连,看来必须要重启,不然,jar包替换掉,可能会影响到zk正在跑的经常。但是重启zk毕竟对正在连接这个zk的client端会有短暂的影响
java连接zookeeper集群,必须配置多个ip吗
zookeeper的集群一般都是奇数,多采用三台服务器,就是一个leader,两个follower的模式,你只填一个IP,那就是单机模式
zookeeper 集群 部署好后怎么使用 java
很多使用Zookeeper的情景是需要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务,此时我们需要通过程序的方式来启动Zookeeper。此时可以通过Zookeeper API的ZooKeeperServerMain类来启动Zookeeper服务。 下面是一个集群模式下启动Zookeeper服务的例子 这里假定我们运行Zookeeper集群的三台机器名分别为fanbinx1,fanbinx2,fanbinx3首先是zoo.cfg配置文件 view plain copy print?tickTime=2000 dataDir=/tmp/zookeeper/data clientPort=2181 initLimit=10 syncLimit=5 server.1=fanbinx1:2888:3888 server.2=fanbinx2:2888:3888 server.3=fanbinx3:2888:3888 启动Zookeeper集群服务的类,如下 * 这个类同时使用同一个zoo.cfg配置文件来启动Zookeeper服务。* 在每台机器上启动Zookeeper服务的时候判断当前机器是不是定义在zoo.cfg文件里,如果是获取其中的ID号,然后生成myid文件并将ID写入其中。* 最后启动Zookeeper服务。 view plain copy print?package my.zookeeperstudy.server; import org.apache.commons.io.FileUtils; import org.apache.zookeeper.server.ServerConfig; import org.apache.zookeeper.server.ZooKeeperServerMain; import org.apache.zookeeper.server.quorum.QuorumPeerConfig; import java.io.File; import java.io.InputStream; import java.net.InetAddress; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ClusteredZKServer { public static void main(String args) throws Exception { InputStream is = ClusteredZKServer.class.getResourceAsStream("/my/zookeeperstudy/server/zoo.cfg"); Properties props = new Properties(); try { props.load(is); } finally { is.close(); } for (String key : props.stringPropertyNames()) { Pattern pKey = Pattern.compile("^server\\.(\\d)"); Pattern pValue = Pattern.compile("(*):\\d*:\\d*"); Matcher mKey = pKey.matcher(key); Matcher mValue = pValue.matcher(props.getProperty(key)); if (mKey.find() && mValue.find()) { String id = mKey.group(1); String host = mValue.group(1); String thisHostName = InetAddress.getLocalHost().getHostName(); String thisHostAddress = InetAddress.getLocalHost().getHostAddress(); if (host.equals(thisHostName) || host.equals(thisHostAddress)) { //System.out.println(new File(props.getProperty("dataDir"), "myid").getAbsolutePath()); FileUtils.write(new File(props.getProperty("dataDir"), "myid"), id); QuorumPeerConfig quorumConfig = new QuorumPeerConfig(); quorumConfig.parseProperties(props); final ZooKeeperServerMain zkServer = new ZooKeeperServerMain(); final ServerConfig config = new ServerConfig(); config.readFrom(quorumConfig); zkServer.runFromConfig(config); } } } } } 客户端测试代码如下,这里可以修改hostname为集群中的任意一台机器 view plain copy print?package my.zookeeperstudy.server; import org.apache.zookeeper.*; import java.util.List; public class Client { public static void main(String args) throws Exception { ZooKeeper zk = new ZooKeeper("fanbinx1:2181,fanbinx2:2181,fanbinx3:2181", 10000, new Watcher() { public void process(WatchedEvent event) { System.out.println("event: " + event.getType()); } }); System.out.println(zk.getState()); zk.create("/myApps", "myAppsData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/myApps/App1", "App1Data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/myApps/App2", "App2Data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/myApps/App3", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.setData("/myApps/App3","App3Data".getBytes(), -1); System.out.println(zk.exists("/myApps", true)); System.out.println(new String(zk.getData("/myApps", true, null))); List《String》 children = zk.getChildren("/myApps", true); for (String child : children) { System.out.println(new String(zk.getData("/myApps/" + child, true, null))); zk.delete("/myApps/" + child,-1); } zk.delete("/myApps",-1); zk.close(); } } 测试* 在集群中的各个机器上分别运行ClusteredZKServer类来启动Zookeeper服务。* 然后在任意一台机器上运行Client类来连接Zookeeper并操作数据。
JAVA 为什么不同注册中心(zookeeper,Eurake) 注册的服务不能互相调用
A服务在zk上拿不到B服务的信息,B服务在eureka上拿不到A服务的注册信息,调用不到就很正常了
12步教你安装JDK和zookeeper
安装zookeeper首先要安装JDK,Linux有自带的OPENJDK,要卸载然后重新安装。 1. java -version 查看JDK版本2. rpm -qa | grep java 查找有哪些java相关的包3. rpm -e --nodeps tzdata-java-2015e-1.e16.noarch 卸载,--nodeps 就是no depends的意思,忽略相关依赖强制卸载4. mkdir /export/server 创建zookeeper和 JDK安装的目录 5. mv jdk1.8.0_65.tar.gz /export/server 把jdk安装包移动到/export/server文件夹 cd /export/server 进入该文件夹, ls查看可以看到安装包 tar -zxvf jdk1.8.0_65.tar.gz 把JDK上传到linux系统中,然后执行tar解压操作 6. vi /etc/profile /etc目录下的profile文件,也就是配置环境变量的配置文件。 7. 打开文件后,按大写的G直接跳到文件的最后一行,然后按 i 进入文件状态,在末尾添加这三行配置信息 export JAVA_HOME=/export/server/jdk.1.8.0_65 配置一个JAVA_HOME的变量,值是jdk安装的目录,这个JAVA_HOME在下面两行会用到 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 完毕,按ESC退出文件状态,然后输入 指令 :wq (冒号+wq) 回车退出并保存该文件。 8. source /etc/profile 刷新profile文件到系统内存。 9. 在任意目录下 输入 java -v 查看JDK版本以上JDK安装完毕,接下来安装zookeeper。 10. 和上传JDK一样,把zookeeper-3.4.10.tar.gz文件放到/export/server目录下,并进行解压。(忘记了就去看第5步) tar -zxvf zookeeper-3.4.10.tar.gz 解压之后要进行相关的配置(软件安装无非就是解压+配置) 这里主要有两个重要要改的地方:1.zookeeper服务启动后数据文件保存在哪里? 2. zookeeper通常是会集群化,也就是启动好几台zookeeper同时提供服务的,因此在每台zookeeper服务的配置文件里面都要配置上其它zookeeper服务的ip和端口。 第二点不懂的话直接看配置文件就好了。 11. 首先实现第一点,创建zookeeper数据保存目录 mkdir /export/data/zkdata 创建zkdata文件夹,用于存在zookeeper数据.(这条如果报错了,说明你应该先执行mkdir /export/data/创建data目录) 12. 接下来进行配置 cd zookeeper/conf/ 配置文件放在该目录下,ll可以查看有哪些文件,如图其中有个zoo_sample.cfg 文件,这个文件是自带的一个模板,就是告诉你配置文件要照着这个样子去抄。。。 然后有个重要的东西就是:zookeeper启动的时候,默认是会读取该文件路径下配置文件zoo.cfg的,但是这里默认是i没有这个文件的。所以我们直接复制一个zoo_sample.cfg 重命名为zoo.cfg就OK了。但是要进去做自己的相关配置改动。 复制文件命令是: cp zoo_sample.cfg zoo.cfg 13. vi zoo.cfg 开始配置文件了,打开可以看见一堆你可能看不懂的东西,但是不重要因为大多数都是注释掉的东西。新手就别管那么多了。这里我们主要要修改的是两个东西,哪两个? 前面黑体字有说过了:数据存放目录,集群中各个zookeeper服务的ip port。 同样的,按 i 进入模式,找到dataDir=/tmp。。。这一行。 这一行就是设置数据存放的目录。 把它改成我们自己新建的目录: dataDir=/export/data/zkdata/ 这样第一点就配置完了。 实际上到这里一台zookeeper服务已经安装完毕了,但是说过了,zookeeper是集群,所以得多搞几个服务器。我这里用了三台虚拟机,复制三台。ip分别是192.168.209.128 / 192.168.209.129 / 192.168.209.130,这三台同样的安装JDK 和zookeeper。 重复前面的操作就行,也可以直接复制虚拟机。 同样的在zoo.cfg里面,大写的G到最后一行。在末尾加上这三行配置: server.1=192.168.209.128:2888:3888 #三台服务对应server 1 2 3 ,对应三个ip。 后面两个端口分别是 心跳端口2888 和选举端口。 server.2=192.168.209.129:2888:3888 server.3=192.168.209.130:2888:3888 然后保存退出就OK了。 13. 最后一步: 就是给三台zookeeper服务设置id。在哪里设置呢? 就是在zookeeper保存文件的目录下创建一个/export/data/zkdata/myid 文件。 文件名不能乱写,就得是是这个,选举的时候很关键的。 我们有三台zookeeper server,每台的myid文件数字 不一样,你得进入三台服务器分别这个文件。 第一台服务器,vi myid 该文件,写入一个数字 1 第二台服务器,vi myid 该文件,写入一个数字 2 第三台服务器,vi myid 该文件,写入一个数字 314. 最后你启动一下zookeeper试试安装成功了没 。 /export/server/zookeeper/bin/zkServer.sh start 启动zookeeper的指令。可以看到日志打印出来的是默认Using zoo.cfg这个配置文件。三台服务你都要启动,zookeeper会根据你配置的三个ip port去发送心跳,自动建立集群。 并且根据myid去选举哪个server是leader,哪个是follower。 【这里呢就安装完毕了! 动手操作也就14步是不是很简单。但是搞清楚原理才是最主要的。】
Zookeeper在哪些系统中使用,又是怎么用的
ZooKeeper作为发现服务的问题 ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分 布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它 很成熟,有相当大的社区来支持它的发展,而且在生产环境得到了广泛的使用;但是用它来做Service发现服务解决方案则是个错误。 在分布式系统领域有个著名的 CAP定理(C- 数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);ZooKeeper是个 CP的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性(注:也就 是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果)。但是别忘了,ZooKeeper是分布式协调服务,它的 职责是保证数据(注:配置数据,状态数据)在其管辖下的所有服务之间保持同步、一致;所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性 的了,如果是AP的,那么将会带来恐怖的后果(注:ZooKeeper就像交叉路口的信号灯一样,你能想象在交通要道突然信号灯失灵的情况吗?)。而且, 作为ZooKeeper的核心实现算法 Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。 作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了;因为对于Service发现服务来说就算是 返回了包含不实的信息的结果也比什么都不返回要好;再者,对于Service发现服务而言,宁可返回某服务5分钟之前在哪几个服务器上可用的信息,也不能 因为暂时的网络故障而找不到可用的服务器,而不返回任何结果。所以说,用ZooKeeper来做Service发现服务是肯定错误的,如果你这么用就惨 了! 而且更何况,如果被用作Service发现服务,ZooKeeper本身并没有正确的处理网络分割的问题;而在云端,网络分割问题跟其他类型的故障一样的确会发生;所以最好提前对这个问题做好100%的准备。就像 Jepsen在 ZooKeeper网站上发布的博客中所说:在ZooKeeper中,如果在同一个网络分区(partition)的节点数(nodes)数达不到 ZooKeeper选取Leader节点的“法定人数”时,它们就会从ZooKeeper中断开,当然同时也就不能提供Service发现服务了。 如果给ZooKeeper加上客户端缓存(注:给ZooKeeper节点配上本地缓存)或者其他类似技术的话可以缓解ZooKeeper因为网络故障造成节点同步信息错误的问题。 Pinterest与 Airbnb公 司就使用了这个方法来防止ZooKeeper故障发生。这种方式可以从表面上解决这个问题,具体地说,当部分或者所有节点跟ZooKeeper断开的情况 下,每个节点还可以从本地缓存中获取到数据;但是,即便如此,ZooKeeper下所有节点不可能保证任何时候都能缓存所有的服务注册信息。如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障(注:由于交换机故障导致交换机底下的子网间不能互访);那么ZooKeeper 会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是“健康”的,可以正常提供服务的;所以导致到达这些节点的服务请求 被丢失了。(注:这也是为什么ZooKeeper不满足CAP中A的原因) 更深层次的原因是,ZooKeeper是按照CP原则构建的,也就是说它能保证每个节点的数据保持一致,而为ZooKeeper加上缓存的做法的 目的是为了让ZooKeeper变得更加可靠(available);但是,ZooKeeper设计的本意是保持节点的数据一致,也就是CP。所以,这样 一来,你可能既得不到一个数据一致的(CP)也得不到一个高可用的(AP)的Service发现服务了;因为,这相当于你在一个已有的CP系统上强制栓了 一个AP的系统,这在本质上就行不通的!一个Service发现服务应该从一开始就被设计成高可用的才行! 如果抛开CAP原理不管,正确的设置与维护ZooKeeper服务就非常的困难;错误会 经常发生, 导致很多工程被建立只是为了减轻维护ZooKeeper的难度。这些错误不仅存在与客户端而且还存在于ZooKeeper服务器本身。Knewton平台 很多故障就是由于ZooKeeper使用不当而导致的。那些看似简单的操作,如:正确的重建观察者(reestablishing watcher)、客户端Session与异常的处理与在ZK窗口中管理内存都是非常容易导致ZooKeeper出错的。同时,我们确实也遇到过 ZooKeeper的一些经典bug: ZooKeeper-1159 与 ZooKeeper-1576; 我们甚至在生产环境中遇到过ZooKeeper选举Leader节点失败的情况。这些问题之所以会出现,在于ZooKeeper需要管理与保障所管辖服务 群的Session与网络连接资源(注:这些资源的管理在分布式系统环境下是极其困难的);但是它不负责管理服务的发现,所以使用ZooKeeper当 Service发现服务得不偿失。 做出正确的选择:Eureka的成功 我们把Service发现服务从ZooKeeper切换到了Eureka平台,它是一个开 源的服务发现解决方案,由Netflix公司开发。(注:Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作 服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。)Eureka一开 始就被设计成高可用与可伸缩的Service发现服务,这两个特点也是Netflix公司开发所有平台的两个特色。( 他们都在讨论Eureka)。自从切换工作开始到现在,我们实现了在生产环境中所有依赖于Eureka的产品没有下线维护的记录。我们也被告知过,在云平台做服务迁移注定要遇到失败;但是我们从这个例子中得到的经验是,一个优秀的Service发现服务在其中发挥了至关重要的作用! 首先,在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程;客户端请求会自动切换 到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务 注册信息而已。所以,再也不用担心有“掉队”的服务器恢复以后,会从Eureka服务器集群中剔除出去的风险了。Eureka甚至被设计用来应付范围更广 的网络分割故障,并实现“0”宕机维护需求。当网络分割故障发生时,每个Eureka节点,会持续的对外提供服务(注:ZooKeeper不会):接收新 的服务注册同时将它们提供给下游的服务发现请求。这样一来,就可以实现在同一个子网中(same side of partition),新发布的服务仍然可以被发现与访问。 但是,Eureka做到的不止这些。正常配置下,Eureka内置了心跳服务,用于淘汰一些“濒死”的服务器;如果在Eureka中注册的服务, 它的“心跳”变得迟缓时,Eureka会将其整个剔除出管理范围(这点有点像ZooKeeper的做法)。这是个很好的功能,但是当网络分割故障发生时, 这也是非常危险的;因为,那些因为网络问题(注:心跳慢被剔除了)而被剔除出去的服务器本身是很”健康“的,只是因为网络分割故障把Eureka集群分割 成了独立的子网而不能互访而已。 幸运的是,Netflix考虑到了这个缺陷。如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入”自我保护模式“,同时保留那些“心跳死亡“的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对 于”死亡“的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出”自我保护模式“。所以Eureka的哲学是,同时保 留”好数据“与”坏数据“总比丢掉任何”好数据“要更好,所以这种模式在实践中非常有效。 最后,Eureka还有客户端缓存功能(注:Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接口)。 所以即便Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器;Eureka服务的消费者仍然可以通过 Eureka客户端缓存来获取现有的服务注册信息。甚至最极端的环境下,所有正常的Eureka节点都不对请求产生相应,也没有更好的服务器解决方案来解 决这种问题时;得益于Eureka的客户端缓存技术,消费者服务仍然可以通过Eureka客户端查询与获取注册服务信息,这点很重要。 Eureka的构架保证了它能够成为Service发现服务。它相对与ZooKeeper来说剔除了Leader节点的选取或者事务日志机制,这 样做有利于减少使用者维护的难度也保证了Eureka的在运行时的健壮性。而且Eureka就是为发现服务所设计的,它有独立的客户端程序库,同时提供心 跳服务、服务健康监测、自动发布服务与自动刷新缓存的功能。但是,如果使用ZooKeeper你必须自己来实现这些功能。Eureka的所有库都是开源 的,所有人都能看到与使用这些源代码,这比那些只有一两个人能看或者维护的客户端库要好。 维护Eureka服务器也非常的简单,比如,切换一个节点只需要在现有EIP下移除一个现有的节点然后添加一个新的就行。Eureka提供了一个 web-based的图形化的运维界面,在这个界面中可以查看Eureka所管理的注册服务的运行状态信息:是否健康,运行日志等。Eureka甚至提供 了Restful-API接口,方便第三方程序集成Eureka的功能。
更多文章:
极品时刻表不能用了吗(为什么我的电脑不能使用极品列车时刻表)
2024年7月23日 17:24
坦克世界盒子更新之后插件不能用了!怎么办?坦克世界,哪个插件比较好用啊
2024年6月5日 21:03
植物大战僵尸西游版正版下载(怎么下载到电脑植物大战僵尸西游版)
2024年7月8日 14:55
火狐搜索入口(Mozillafirefox火狐浏览器主页网址)
2024年4月13日 15:05