15. 使用Apache Curator管理ZooKeeper

时间:2022-09-07 18:46:18

Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来。 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题。 社区已经在ZooKeeper数据模型及其API之上开发了高级框架。 Apache Curator是一个高级的包装类库和框架,使得ZooKeeper非常简单易用。

Tips

Curator最初由Netflix开发,现在是一个Apache项目。 项目页面位于http://curator.apache.org/。

一 Curator组件

Curator是ZooKeeper的高级类库;它使处理ZooKeeper变得更容易,并扩展了核心ZooKeeper的功能。 Curator在高层次上由以下部分组成:

  • Client:Curator客户端是ZooKeeper的Java客户端的一个包装器。 它是Curator堆栈中的一个低级API,并且抽象出ZooKeeper客户端的功能。
  • Framework:Curator框架是一个具有高级功能的高级API,如自动连接管理,操作重试等等。 它在很大程度上简化了ZooKeeper的使用。
  • Recipe:Curator Recipe提供ZooKeeper Recipe的实现; 这些实现可以直接用于分布式应用程序来解决协调问题。
  • Extensions:Curator Recipe包实现了常见的Recipe。 为了避免这个包的膨胀,使用一个单独的扩展包。

除了前面的组件外,Curator还附带一些ZooKeeper有用的工具。 Curator堆栈如下图所示:

15. 使用Apache Curator管理ZooKeeper

Curator JARs可以在Maven Central的仓库中找到。 Curator可以很容易地包含在Maven,Gradle,Ivy,SBT等构建脚本中。

各种Maven artifacts在http://mvnrepository.com/artifact/org.apache.curator上列出。

二 Curator客户端

Curator Client是ZooKeeper Java客户端的一个包装器。它使客户端访问ZooKeeper更简单,更不易出错。

Curator客户端提供以下功能:

  • 连接管理:管理与ZooKeeper服务器的连接
  • 操作重试实用程序:这是重试操作的机制
  • 测试ZooKeeper服务器:这是用于测试ZooKeeper服务器

使用Curator客户端连接ZooKeeper服务器的 MyCuratorClient.java的代码片段如下:

public void myCuratorClient() throws Exception
{
CuratorZookeeperClient client = new CuratorZookeeperClient(server.getConnectString(), 10000, 10000, null,new RetryOneTime(1));
client.start();
try
{
client.blockUntilConnectedOrTimedOut();
String path = client.getZooKeeper().create("/test_znode", "".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
finally
{
client.close();
}
}

CuratorZooKeeperClient构造方法用于连接到ZooKeeper服务器。 它需要连接字符串或ZooKeeper主机端口对列表,会话和连接超时时间,可选的观察器对象以及要使用的重试策略。 重试策略是客户端在重试连接时尝试各种重试机制的机制。在前面的例子中,使用了一个客户端只会重试一次的策略。

Curator客户端支持以下重试策略:

  • BoundedExponentialBackoffRetry:通过增加重试之间的休眠时间直到最大上限重试指定的次数
  • ExponentialBackoffRetry:通过增加重试之间的休眠时间来重试指定的次数
  • RetryNTimes:重试n次
  • RetryOneTime:只重试一次
  • RetryUntilElapsed:一直重试,直到超过指定时间

一旦客户端启动,blockUntilConnectedOrTimedOut方法直到ZooKeeper连接服务器成功或者连接超时。连接成功之后,创建/testznode的znode。getZooKeeper()方法将连接的实例返回给托管的ZooKeeper服务器。

Note

Curator API文档可在http://curator.apache.org/apidocs/index.html察看。

Curator客户端是一个低层次的API,它提供了对管理员客户端API的抽象。开发人员应该使用Curator框架,而不是直接在他们的应用程序中使用CuratorZookeeperClient类作为最佳实践。

三 Curator框架

Curator框架(org.apache.curator.framework)是一个高层次的API,很大程度上简化了ZooKeeper的使用。 它提供的一些功能如下:

  • 自动连接管理:此功能自动且透明地处理客户端需要重新建立与ZooKeeper服务器的连接和/或重试操作的场景。
  • 简单而灵活的API:使用一组新式且流畅的接口来应用ZooKeeper原始的API。
  • Recipe:这个功能实现了常见的ZooKeeper Recipe。

CuratorFramework使用CuratorFrameworkFactory进行分配。 它提供了工厂方法以及构造器创建实例。 CuratorFramework实例完全是线程安全的。在使用CuratorFramework开发应用程序时,开发人员应该为每个ZooKeeper集群创建和共享一个CuratorFramework实例。CuratorFramework使用fluent风格接口。

以下展示的是ZooKeeper客户端使用CuratorFramework的代码示例:

public void myCuratorFrameworkClient()
throws Exception
{
CuratorFramework client =
CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
client.start();
try
{
String path = client.create().withMode(
CreateMode.PERSISTENT).forPath(
"/test_znode", "".getBytes());
}
finally
{
client.close();
}
}

newClient()工厂方法创建一个新的客户端实例,默认会话超时和默认连接超时。 它需要一个连接字符串,是ZooKeeper主机-端口对列表和要使用的重试策略。

CuratorFramework有一个命名空间的概念。 通过这个,可以在使用构造器方法创建CuratorFramework实例时设置命名空间。 当其中一个API被调用时,该框架将该命名空间预加载到所有路径:

CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
CuratorFramework client = builder.connectString (server.getConnectString()).namespace("MyApp").retryPolicy(new RetryOneTime(1)).build();
client.create().forPath("/test_znode", data);

在这里,尽管znode的名称被指定为/test_znode,但是创建的实际znode是/MyApp/test_znode

Curator框架还提供了一个名为CuratorTempFramework的有限功能框架接口,用于通过不可靠的网络(如WAN)进行临时连接。 在这个框架中,如果会话保持空闲一段时间,ZooKeeper连接将被关闭。

四 Curator recipe

Curator为ZooKeeper提供了一系列随时可用的recipe。 Curator实现的recipe的详细列表和描述可以从http://curator.apache.org/curator-recipes/index.html的项目页面中获取。

在这里,将简略地介绍一下ZooKeeper的recipe:

  • 领导者选举:Curator为领导选举提供了两种算法:领导者锁定(leader latch)和领导者选择( leader selector)。两种算法在连接到Zookeeper集群的多个竞争者中选择一个“领导者”。

    在领导者锁定中,如果一组n个参与者与竞争领导,则将n个参与者中的一个随机分配为领导,而在领导选择中,按照到达该Zookeeper服务器的请求的顺序来选择领导。 当领导者解除领导时,选择集群中的n个参与者的另一个竞争者。
  • 锁:Curator实现以下不同类型的分布式锁:
    • 共享重入锁:这种类型的锁提供全局同步的全分布锁。
    • 共享锁:这是非重入共享重入锁。
    • 共享重入读/写锁:这是一个可跨JVM使用的重入读/写互斥锁。
    • 共享信号量:这是一个计数信号量(semaphore),可以跨JVM使用。
    • 多锁共享:这是用来管理多个锁作为一个单一的实体。 acquire()调用获取所有的锁。 如果呼叫失败,所有获得的路径被释放。 release()调用释放所有托管的锁。
  • 屏障(Barrier):这是屏障和双重屏障的具体实现。
  • 计数器:提供了一种机制来管理共享计数器的共享整数。它还给出了分布式原子增量的分布式原子长整型,分布式原子整型和分布式原子值的机制。
  • 缓存:缓存是通过路径缓存,节点缓存和树缓存recipe实现的,分别保存ZK路径的znode,本地缓存节点和所有本地缓存的子节点的状态变化数据。
  • 队列:这提供了分布式队列实现。 支持以下不同类型的队列:
    • 分布式队列:这是一个简单的分布式队列,其中放入队列中的条目是在FIFO中排序的。
    • 分布式ID队列:这是一个分布式队列的版本,允许一些标识符与队列项相关联。
    • 分布式优先级队列:这是ZooKeeper的分布式优先级队列的实现。在内部,它使用一个分布式队列,其中可以将优先级指定给项目。
    • 分布式延迟队列:这是使用时间作为优先级的分布式优先级队列的变体。当将条目添加到队列时,会给出一个延迟值。直到超过延迟时间,该项目将被发送给消费者。
    • 简单的分布式队列:这是ZooKeeper分布式org.apache.zookeeper.recipes.queue.DistributedQueue队列的一部分替代实现。
  • 节点:这提供了一个persistent ephemeral节点的recipe;这是一个ephemeral的节点,即使在连接和会话中断的情况下也会试图保持在ZooKeeper中。

五 Curator实用程序

Curator类库也为ZooKeeper提供了一些有用的工具。 其中一些如下所示:

  • Test server:这是一个可用于本地进程ZooKeeper服务器的测试
  • Test cluster:这是一个内部运行的用于ZooKeeper服务器ensemble的测试
  • ZKPaths:提供了各种使用ZooKeeper znode路径的静态方法
  • EnsurePath:确保在使用之前创建特定znode路径的实用程序
  • BlockingQueueConsumer:一个类似于Java中的BlockingQueue的队列消费者
  • Reaper:删除没有子节点的路径和没有数据的节点的实用程序

六 Curator扩展

Curator扩展包除了包含在recipe包中那些外,还包括额外的recipe。 扩展包中的recipe具有curator-x-name的命名约定。

Curator目前提供以下扩展功能:

  • Service discovery:这是一个使用ZooKeeper作为服务发现机制的系统。
  • Service discovery server:这是一个使用REST服务进行非Java和遗留程序的Curator服务发现。 它公开RESTful Web服务来注册,删除和查询服务。
  • Curator RPC proxy:该模块实现了一个代理,将非Java环境与Curator框架和recipe桥接在一起。 它使用Apache Thrift,使大量的语言和环境使用Curator的功能,并统一ZooKeeper跨语言/环境的用法。
  • ZKClient bridge:这个扩展是Curator和ZKClient之间的桥梁(https://github.com/sgroschupf/zkclient)。 使用ZKClient编写的应用程序在不改变现有代码的情况下使用Curator类库会非常有用。 ZKClient bridge不作为Curator分发的一部分进行打包。 它可以在它自己的Maven中心存储库中的curator-x-zkclient-bridge中找到。

到目前为止,我们已经了解Curator类库及其各种组件。Curator为ZooKeeper API实现了一个非常好的,可靠的扩展,将ZooKeeper的许多复杂性抽象出来。 强烈建议开发人员使用Curator在Java语言的ZooKeeper开发分布式应用程序。 不仅如此,Curator的强大功能也可以从Java以外的语言编写的应用程序中使用。

15. 使用Apache Curator管理ZooKeeper的更多相关文章

  1. 15. 使用Apache Curator装饰ZooKeeper

    Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...

  2. 使用Apache Curator管理ZooKeeper(转)

    Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...

  3. 使用Apache Curator监控Zookeeper的Node和Path的状态

    1.Zookeeper经常被我们用来做配置管理,配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同 ...

  4. Apache Curator: Zookeeper客户端

    Apache Curator Framework url: http://curator.apache.org/curator-framework/ The Curator Framework is ...

  5. Apache Curator获得真正的

    Apache Curator获得真正的 Curator它是Netflix一家公司来源Zookeeper顾客,与Zookeeper相比于提供本地客户端,Curator的抽象层次更高,简化了Zookeep ...

  6. Apache Curator入门实战

    Apache Curator入门实战 Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeep ...

  7. Apache Curator is a Java/JVM client library for Apache ZooKeeper

    http://curator.apache.org/index.html Welcome to Apache Curator What is Curator? Curator n ˈkyoor͝ˌāt ...

  8. 【zookeeper】Apache curator的使用及zk分布式锁实现

    上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...

  9. 基于Apache Curator框架的ZooKeeper使用详解

    一 简介 Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作.通过查看官方文档,可以发现Curator主要解决了三类问题 ...

随机推荐

  1. Clouda聊天室实践

    1.Clouda说明 Clouda是简单,可依赖的实时Javascript框架.对一个想开发移动webapp的开发者来说,可以使用clouda开发框架,实现一个功能和体验与native app齐平的轻 ...

  2. C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  3. 数据持久化(一)--NSKeyedArchiver

    数据持久化:  将内存中的数据按某种格式存进磁盘 数据的种类: 1,结构化的数据 2, 字节流数据 结构化的数据        字节流 内存中结构化的数据   ->   磁盘,  叫: 归档 字 ...

  4. Statistical Models and Social Science

    1.1 Statistical Models and Social Reality KEY: complex society v.s statistical models relationship,d ...

  5. CentOS6&period;5安装MySQL5&period;6

    CentOS6.5安装MySQL5.6,开放防火墙3306端口,允许其他主机使用root账户密码访问MySQL数据库 查看操作系统相关信息 ** 该查看方法只适用于CentOS6.5 (lsb_rel ...

  6. eclipse配置汇总

    1.背景色调节 general->editor->texteditor->选中background RGB: 85 90 205 2.java vm参数设置 VmAguments中 ...

  7. jsonp 跨域1

    今天上课学到了jsonp,看了理解,还需要多敲,代码贴出来看看 <!doctype html> <html> <head> <meta charset=&qu ...

  8. Spring学习笔记--通过构造方法创建Bean

    如果一个bean没有默认的构造函数,那么可以通过工厂方法来构造一个bean.Spring通过<bean>元素的factory-method属性来装配工厂创建的Bean.下面例子中的Stag ...

  9. Go语言备忘录(1):基本数据结构

    本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(1):基本数据 ...

  10. 【js学习】js连接RabbitMQ达到实时消息推送

    js连接RabbitMQ达到实时消息推送 最近在自己捯饬一个网站,有一个功能是需要后端处理完数据把数据发布到MQ中,前端再从MQ中接收数据.但是前端连接MQ又成了一个问题,在网上搜了下资料,点进去一篇 ...