当前位置:首页 » 编程语言 » zookeeper是JAVA

zookeeper是JAVA

发布时间: 2022-12-11 21:05:35

① zookeeper是什么语言写的

本文是Jason Wilder对于常见的服务发现项目 Zookeeper , Doozer , Etcd 所写的一篇博客,其原文地址如下: Open-Source Service Discovery 。

服务发现是大多数分布式系统以及面向服务架构(SOA)的一个核心组成部分。这个难题,简单来说,可以认为是:当一项服务存在于多个主机节点上时,client端如何决策获取相应正确的IP和port。

在传统情况下,当出现服务存在于多个主机节点上时,都会使用静态配置的方法来实现服务信息的注册。但是当大型系统中,需要部署更多服务的时候,事情就显得复杂得多。在一个实时的系统中,由于自动或者人工的服务扩展,或者服务的新添加部署,还有主机的宕机或者被替换,服务的location信息可能会很频繁的变化。

在这样的场景下,为了避免不必要的服务中断,动态的服务注册和发现就显得尤为重要。

关于服务发现的话题,已经很多次被人所提及,而且也的确不断的在发展。现在,笔者介绍一下该领域内一些open-source或者被经常被世人广泛讨论的解决方案,尝试理解它们到底是如何工作的。特别的是,我们会较为专注于每一个解决方案的一致性算法,到底是强一致性,还是弱一致性;运行时依赖;client的集成选择;以后最后这些特性的折中情况。

本文首先从几个强一致性的项目于开始,比如Zookeeper,Doozer,Etcd,这些项目主要用于服务间的协调,同时又可用于服务的注册。

随后,本文将讨论一些在服务注册以及发现方面比较有意思的项目,比如:Airbnb的SmartStack,Netflix的Eureka,Bitly的NSQ,Serf,Spotify and DNS,最后是SkyDNS。

问题陈述

在定位服务的时候,其实会有两个方面的问题:服务注册(Service Registration)和服务发现(Service Discovery)。

服务注册—— 一个服务将其位置信息在中心注册节点注册的过程。该服务一般会将它的主机IP地址以及端口号进行注册,有时也会有服务访问的认证信息,使用协议,版本号,以及关于环境的一些细节信息。
服务发现—— client端的应用实例查询中心注册节点以获知服务位置的过程。
每一个服务的服务注册以及服务发现,都需要考虑一些关于开发以及运营方面的问题:

监控—— 当一个已注册完毕的服务失效的时候,如何处理。一些情况下,在一个设定的超时定时(timeout)后,该服务立即被一个其他的进程在中心注册节点处注销。这种情况下,服务通常需要执行一个心跳机制,来确保自身的存活状态;而客户端必然需要能够可靠处理失效的服务。
负载均衡—— 如果多个相同地位的服务都注册完毕,如何在这些服务之间均衡所有client的请求负载?如果有一个master节点的话,是否可以正确处理client访问的服务的位置。
集成方式—— 信息注册节点是否需要提供一些语言绑定的支持,比如说,只支持java?集成的过程是否需要将注册过程以及发现过程的代码嵌入到你的应用程序中,或者使用一个类似于集成助手的进程?
运行时依赖—— 是否需要JVM,ruby或者其他在你的环境中并不兼容的运行时?
可用性考虑—— 如果系统失去一个节点的话,是否还能正常工作?系统是否可以实时更新或升级,而不造成任何系统的瘫痪?既然集群的信息注册节点是架构中的中心部分,那该模块是否会存在单点故障问题?
强一致性的Registries

首先介绍的三个服务注册系统都采用了强一致性协议,实际上为达到通用的效果,使用了一致性的数据存储。尽管我们把它们看作服务的注册系统,其实它们还可以用于协调服务来协助leader选举,以及在一个分布式clients的集合中做centralized locking。

Zookeeper

Zookeeper是一个集中式的服务,该服务可以维护服务配置信息,命名空间,提供分布式的同步,以及提供组化服务。Zookeeper是由Java语言实现,实现了强一致性(CP),并且是使用 Zab协议 在ensemble集群之间协调服务信息的变化。

Zookeeper在ensemble集群中运行3个,5个或者7个成员。众多client端为了可以访问ensemble,需要使用绑定特定的语言。这种访问形式被显性的嵌入到了client的应用实例以及服务中。

服务注册的实现主要是通过命令空间(namespace)下的 ephemeral nodes 。ephemeral nodes只有在client建立连接后才存在。当client所在节点启动之后,该client端会使用一个后台进程获取client的位置信息,并完成自身的注册。如果该client失效或者失去连接的时候,该ephemeral node就从树中消息。

服务发现是通过列举以及查看具体服务的命名空间来完成的。Client端收到目前所有注册服务的信息,无论一个服务是否不可用或者系统新添加了一个同类的服务。Client端同时也需要自行处理所有的负载均衡工作,以及服务的失效工作。

Zookeeper的API用起来可能并没有那么方便,因为语言的绑定之间可能会造成一些细小的差异。如果使用的是基于JVM的语言的话, Curator Service Discovery Extension 可能会对你有帮助。

由于Zookeeper是一个CP强一致性的系统,因此当网络分区(Partition)出故障的时候,你的部分系统可能将出出现不能注册的情况,也可能出现不能找到已存在的注册信息,即使它们可能在Partition出现期间仍然正常工作。特殊的是,在任何一个non-quorum端,任何读写都会返回一个错误信息。

Doozer

Doozer是一个一致的分布式数据存储系统,Go语言实现,通过 Paxos算法 来实现共识的强一致性系统。这个项目开展了数年之后,停滞了一段时间,而且现在也关闭了一些fork数,使得fork数降至160 。.不幸的是,现在很难知道该项目的实际发展状态,以及它是否适合使用于生产环境。

Doozer在集群中运行3,5或者7个节点。和Zookeeper类似,Client端为了访问集群,需要在自身的应用或者服务中使用特殊的语言绑定。

Doozer的服务注册就没有Zookeeper这么直接,因为Doozer没有那些ephemeral node的概念。一个服务可以在一条路径下注册自己,如果该服务不可用的话,它也不会自动地被移除。

现有很多种方式来解决这样的问题。一个选择是给注册进程添加一个时间戳和心跳机制,随后在服务发现进程中处理那些超时的路径,也就是注册的服务信息,当然也可以通过另外一个清理进程来实现。

服务发现和Zookeeper很类似,Doozer可以罗列出指定路径下的所有入口,随后可以等待该路径下的任意改动。如果你在注册期间使用一个时间戳和心跳,你就可以在服务发现期间忽略或者删除任何过期的入口,也就是服务信息。

和Zookeeper一样,Doozer是一个CP强一致性系统,当发生网络分区故障时,会导致同样的后果。

Etcd

Etcd 是一个高可用的K-V存储系统,主要应用于共享配置、服务发现等场景。Etcd可以说是被Zookeeper和Doozer催生而出。整个系统使用Go语言实现,使用Raft算法来实现选举一致,同时又具有一个基于HTTP+JSON的API。

Etcd,和Doozer和Zookeeper相似,通常在集群中运行3,5或者7个节点。client端可以使用一种特定的语言进行绑定,同时也可以通过使用HTTP客户端自行实现一种。

服务注册环节主要依赖于使用一个key TTL来确保key的可用性,该key TTL会和服务端的心跳捆绑在一起。如果一个服务在更新key的TTL时失败了,那么Etcd会对它进行超时处理。如果一个服务变为不可用状态,client会需要处理这样的连接失效,然后尝试另连接一个服务实例。

服务发现环节设计到罗列在一个目录下的所有key值,随后等待在该目录上的所有变动信息。由于API接口是基于HTTP的,所以client应用会的Etcd集群保持一个long-polling的连接。

由于Etcd使用 Raft一致性协议 ,故它应该是一个强一致性系统。Raft需要一个leader被选举,然后所有的client请求会被该leader所处理。然而,Etcd似乎也支持从non-leaders中进行读取信息,使用的方式是在读情况下提高可用性的未公开的一致性参数。在网络分区故障期间,写操作还是会被leader处理,而且同样会出现失效的情况。

② zookeeper是java写的还是c

Java
因为安装 zk 需要安装 JDK

③ zookeeper 安装需要jdk吗

在安装ZooKeeper之前,请确保在以下任何操作系统上运行 :

  • 任意Linux OS− 支持开发和部署。它是演示应用程序的首选。

  • Windows OS− 仅支持开发。

  • Mac OS− 仅支持开发。

ZooKeeper服务器是用Java编写创建,它运行在JVM。所以需要使用JDK 6或更高版本。

④ apache zookeeper是干什么的

简介ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

Zookeeper是Google的Chubby一个开源的实现.是高有效和可靠的协同工作系统.Zookeeper能够用来leader选举,配置信息维护等.在一个分布式的环境中,我们需要一个Master实例或存储一些配置信息,确保文件写入的一致性等.[1]
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,包含一个简单的原语集,是Hadoop和Hbase的重要组件。

说白了是hadoop的组件之一,用来管理hadoop。

⑤ zookeeper和bbo都是分布式服务框架吗

zookeeper是注册中心,用来管理提供者和消费者的,包括软负载均衡等;DUBBO是一个SOA分布式框架,它也用到的ZOOKEEPER,其它的HADOOP等也用到的这个注册中心

⑥ zookeeper java实现的吗

是的,整个hadoop都是java写的

⑦ 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.exists("/testRootPath",true)+"]");
// 创建另外一个子目录节点
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
[testChildPathOne]
目录节点状态:[5,5,,,0,1,0,0,12,1,6]
已经触发了 NodeChildrenChanged 事件!
testChildDataTwo
已经触发了 NodeDeleted 事件!
已经触发了 NodeDeleted 事件!

当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher 对象的 process 方法就会被调用。

⑧ zookeeper 是java 还是c++

ZooKeeper是用Java编写的,运行在Java环境上,因此,在部署zk的机器上需要安装Java运行环境。为了正常运行zk,我们需要JRE1.6或者以上的版本。
对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量,而且不同的服务进程建议部署在不同的物理机器上面,以减少机器宕机带来的风险,以实现ZooKeeper集群的高可用。

⑨ 什么是Zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,[1] 提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。(概述图片来源:[2] )
外文名
ZooKeeper
类 别
分布式系统的可靠协调系统
所 属
Hadoop的正式子项目
特 点
高效,可靠

⑩ zookeeper一定要用java吗

znode创建类型(CreateMode):

PERSISTENT 持久化节点

PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1

EPHEMERAL 临时节点, 客户端session超时这类节点就会被自动删除

EPHEMERAL_SEQUENTIAL 临时自动编号节点

[java] view plainprint?
/*
* ZookeeperTest.java
*/
package com.x.zookeeper;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
*
* @author http://blog.csdn.net/java2000_wl
* @version <b>1.0</b>
*/
public class ZookeeperTest {

private static final int SESSION_TIMEOUT = 30000;

public static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperTest.class);

private Watcher watcher = new Watcher() {

public void process(WatchedEvent event) {
LOGGER.info("process : " + event.getType());
}
};

private ZooKeeper zooKeeper;

/**
* 连接zookeeper
* <br>------------------------------<br>
* @throws IOException
*/
@Before
public void connect() throws IOException {
zooKeeper = new ZooKeeper("localhost:2181,localhost:2182,localhost:2183", SESSION_TIMEOUT, watcher);
}

/**
* 关闭连接
* <br>------------------------------<br>
*/
@After
public void close() {
try {
zooKeeper.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/**
* 创建一个znode
* 1.CreateMode 取值
* PERSISTENT:持久化,这个目录节点存储的数据不会丢失
* PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
* EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session过期超时,这种节点会被自动删除
* EPHEMERAL_SEQUENTIAL:临时自动编号节点
* <br>------------------------------<br>
*/
@Test
public void testCreate() {
String result = null;
try {
result = zooKeeper.create("/zk001", "zk001data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} catch (Exception e) {
LOGGER.error(e.getMessage());
Assert.fail();
}
LOGGE

热点内容
sql数据库的端口 发布:2025-01-22 12:20:02 浏览:362
安卓最终幻想8怎么设置中文 发布:2025-01-22 12:19:23 浏览:651
怎么查电脑配置和网络 发布:2025-01-22 12:19:16 浏览:586
linuxsnmp查看 发布:2025-01-22 12:17:49 浏览:37
安卓数据线怎么接蓝牙 发布:2025-01-22 12:07:29 浏览:229
扣扣账号多少次密码不正确会被封 发布:2025-01-22 12:07:19 浏览:400
python是32位还是64位 发布:2025-01-22 11:51:41 浏览:894
铃声多多缓存文件夹 发布:2025-01-22 11:51:39 浏览:724
java按键精灵 发布:2025-01-22 11:49:31 浏览:81
python配色 发布:2025-01-22 11:46:40 浏览:613