- Test142
- Lang129
- Devops124
- Design85
- Note54
- BIZ39
- Windows39
- Data38
- UI37
- C32
- Apache31
- C#26
- Blogs23
- OS22
- Interview21
- Think21
- Awesome19
- Biz19
- Finance18
- Life16
- Team16
- Project15
- Kotlin14
- Doc10
- FLOW8
- Learn6
- Other6
- Work6
- Github6
- Mac5
- Reading5
- Acquire4
- Investment4
- Games3
- ITSM3
- LAW3
- Money3
- Performance3
- SEO3
- Software3
- DevOps3
- JS3
- Crawl2
- File2
- Marketing2
- OpenSource2
- Summary2
- test2
- Java2
- API1
- Backend1
- Baidu1
- Best Practice1
- blogs1
- Blog1
- Books1
- Common1
- Document1
- Google1
- Hack1
- How1
- How To1
- Index1
- Job1
- Manager1
- Market1
- NEW1
- Name1
- Pay1
- reading1
- Study1
- TODO1
- Thinking1
- XML1
ZooKeeper:分布式应用程序的分布式协调服务
ZooKeeper是用于分布式应用程序的分布式,开放源代码协调服务。它公开了一组简单的原语,分布式应用程序可以基于这些原语来实现用于同步,配置维护以及组和命名的更高级别的服务。
您可以现成使用它来实现共识,组管理,领导者选举和状态协议。
它的设计易于编程,并使用了按照文件系统熟悉的目录树结构样式设置的数据模型。它以Java运行,并且具有Java和C的绑定。
众所周知,协调服务很难做到。它们特别容易出现诸如比赛条件和死锁之类的错误。
ZooKeeper背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。
使用ZooKeeper协调分布式应用程序
本文档包含使您快速开始使用ZooKeeper的信息。
它主要针对希望试用的开发人员,并包含单个ZooKeeper服务器的简单安装说明,一些验证其正在运行的命令以及一个简单的编程示例。
最后,为方便起见,有几节涉及更复杂的安装,例如,运行复制的部署以及优化事务日志。
但是,有关商业部署的完整说明,请参阅 《ZooKeeper管理员指南》。
本文档是针对希望创建利用ZooKeeper协调服务的分布式应用程序的开发人员的指南。
它包含概念和实践信息。
本指南的前四个部分对各种ZooKeeper概念进行了更高级的讨论。这些对于理解ZooKeeper的工作方式以及如何使用它都是必要的。它不包含源代码,但确实假定您熟悉与分布式计算相关的问题。
第一组中的部分是:
-
ZooKeeper 数据模型
-
ZooKeeper 会话
-
ZooKeeper 观察者
-
一致性保证
为了向您介绍ZooKeeper Java API,我们在这里开发了一个非常简单的监视客户端。
该ZooKeeper客户端监视znode的更改并通过启动或停止程序来响应。
要求
客户有四个要求:
它作为参数:
ZooKeeper服务的地址
znode的名称-要监视的znode的名称
将输出写入的文件名
带有参数的可执行文件。
它获取与znode关联的数据并启动可执行文件。
如果znode更改,则客户端将重新获取内容并重新启动可执行文件。
在本教程中,我们展示了使用ZooKeeper的屏障和生产者-消费者队列的简单实现。
我们将各自的类称为Barrier和Queue。
这些示例假定您有至少一台ZooKeeper服务器正在运行。
这两个原语都使用以下通用代码摘录:
static ZooKeeper zk = null;
static Integer mutex;
String root;
SyncPrimitive(String address) {
if(zk == null){
try {
System.out.println("Starting ZK:");
zk = new ZooKeeper(address, 3000, this);
mutex = new Integer(-1);
System.out.println("Finished starting ZK: " + zk);
} catch (IOException e) {
System.out.println(e.toString());
zk = null;
}
}
}
synchronized public void process(WatchedEvent event) {
synchronized (mutex) {
mutex.notify();
}
}
在本文中,您将找到使用ZooKeeper实施高阶函数的准则。所有这些都是在客户端实施的约定,不需要ZooKeeper的特殊支持。
希望社区能够在客户端库中捕获这些约定,以简化它们的使用并鼓励标准化。
关于ZooKeeper的最有趣的事情之一是,即使ZooKeeper使用异步通知,您也可以使用它来构建同步一致性原语,例如队列和锁。
正如您将看到的,这是可能的,因为ZooKeeper对更新强加了总体顺序,并具有公开此顺序的机制。
请注意,以下食谱尝试采用最佳做法。
特别是,它们避免了轮询,计时器或其他任何会导致“群效应”的事情,从而导致流量爆发并限制了可伸缩性。
本节包含有关部署Zookeeper的信息,并涵盖以下主题:
-
系统要求
-
群集(多服务器)设置
-
单服务器和开发人员设置
前两个部分假设您对在生产环境(例如数据中心)中安装ZooKeeper感兴趣。
最后一部分介绍了在有限的基础上设置ZooKeeper的情况-用于评估,测试或开发-但不在生产环境中。
系统要求
客户端是Java客户端库,应用程序使用它来连接到ZooKeeper集合。
服务器是在ZooKeeper集成节点上运行的Java服务器。
ZooKeeper具有名称空间和字节配额。
您可以使用ZooKeeperMain类设置配额。
如果用户超过分配给他们的配额,ZooKeeper会打印WARN消息。
消息将打印在ZooKeeper的日志中。
注意:名称空间配额的含义是计数配额,该数量配额限制了路径(包括其自身)下的子代数。
$ bin/zkCli.sh -server host:port**
Apache ZooKeeper对JMX具有广泛的支持,使您可以查看和管理ZooKeeper服务集合。
本文档假定您具有JMX的基本知识。
有关设置VM实例的本地和远程管理的详细信息,请参见《JMX管理指南》。
默认情况下,随附的zkServer.sh仅支持本地管理-查看链接的文档以启用对远程管理的支持(超出本文档的范围)。
在启用JMX的情况下启动ZooKeeper
org.apache.zookeeper.server.quorum.QuorumPeerMain类将启动JMX可管理的ZooKeeper服务器。