在过去的几十年里,互联网改变了我们生活的方式。Internet上提供的服务通常由复杂的软件系统支持,这些系统跨越了大量的服务器,而且常常位于不同的地理位置上。这种系统被称为计算机科学术语中的分布式系统。为了正确和有效地运行这些大型系统,这些系统内部的过程应该彼此之间达成某种协议;本协议也称为分布式协调。构成分布式系统的组件所达成的协议包括分布式系统的总体目标或达成一些最终导致目标的子任务的协议。这并不像听起来那么简单,因为流程不仅要达成一致,而且要确定他们的对等组件所同意的内容。

虽然在一个大的分布式系统中协调任务和过程听起来很简单,但是当要以容错的方式正确地实现它们时,这是一个非常棘手的问题。Apache ZooKeeper是Apache软件基金会的一个项目,它旨在通过简单的api提供一组可靠的原语来解决分布式系统的设计和开发中的这些协调问题。

在本章中,我们将介绍下面的内容:

  • 分布式系统是什么及其特点
  • 为什么分布式系统中的协调是困难的
  • Apache ZooKeeper介绍
  • 下载并安装Apache ZooKeeper
  • 使用ZooKeeper shell连接到ZooKeeper
  • 多节点 ZooKeeper集群配置

1.定义一个分布式系统

分布式系统被定义为一个由独立的计算实体组成的软件系统,由一个计算机网络连接在一起,它的组件相互通信并相互协调以实现一个共同的目标。电子邮件系统,如Gmail或Yahoo
!邮件就是这样一个分布式系统的一个例子。另一个分布式系统的例子是一个多人在线游戏,玩家可以在不同的地理位置上玩。

为了确定分布式系统,以下是需要注意的关键特性:

  • 资源共享:这指的是在系统中使用资源的可能性,例如存储空间、计算能力、数据和来自任何地方的服务,等等。
  • 可扩展性:这是指从硬件和软件角度逐步扩展和改进系统的可能性
  • 并发性:这指的是系统能够同时被多个用户使用,以完成相同的任务或不同的任务。
  • 性能和可伸缩性:这确保系统的响应时间不会随着整体负载的增加而降低。
  • 容错:这确保了系统总是可用,即使某些组件失败或以降级模式运行。
  • 通过API的抽象:这确保系统的各个组件隐藏于最终用户,仅向他们提供最终服务。

要设计一个分布式系统是很困难的,当一个单独的计算实体的集合被程序化到一起时,它就更加困难了。设计师和开发人员经常做出一些假设,这些假设也被称为分布式计算的谬论。这些谬论的列表最初是由SUN
公司的工程师在研究网络文件系统Network File System(NFS)的初始设计时创造的。

可以在以下表格中引用这些内容:

假设 现实
网络是可靠的 在现实中,由于系统内部错误或由于电源故障等外部因素,网络或组件之间的互连可能会失败。
零延迟 分布式系统的用户可以从全球任何地方连接到它,并且需要时间将数据从一个地方移动到另一个地方。网络的服务质量也影响应用程序的延迟。
带宽是无限的 网络带宽在最近已经改进了很多倍,但在世界范围内这并不是统一的。带宽取决于网络的类型(T1,LAN,WAN,移动网络,等等)。
网络是安全的 网络永远不安全。通常,系统面临拒绝服务攻击的可能,因为在他们的设计中没有认真考虑应用程序的安全方面的隐患。
拓扑结构不会改变 实际上,拓扑结构永远不是恒定。 组件随时间被移除/添加,系统应该能够容忍这种更改。
有一个管理员 分布式系统从不孤立地运行。它们与其他外部系统相互作用;这可能超出了管理的控制。
传输成本为零 这远不是真实的,因为到处都有成本,从建立网络到发送网络数据包到目的地。成本可以是CPU周期的形式,用来支付给网络服务提供商的实际美元。
网络是同质的 网络由大量不同的实体组成。因此,要使应用程序正确地运行,它需要与各种组件进行互操作,即网络、操作系统,甚至是实现语言。

分布式系统设计者必须设计出一套系统,以保持所有之前的要点。除此之外,解决的下一个棘手问题是让参与的计算实体,或者独立的程序,协调他们的活动。通常,开发人员和设计人员在实现这种协调逻辑时陷入困境;这导致系统设计不正确,效率低下。正是基于这个动机,Apache
ZooKeeper被设计和开发出来,使得分布式协调非常可靠。

2.为什么在分布式系统中协调如此具有挑战性

在介绍了Apache ZooKeeper以及它在分布式应用程序设计和开发中的角色之后,让我们深入探讨一下为什么分布式系统中的协调是一个难题。让我们以一个分布式应用程序的配置管理为例,它包含多个独立运行的软件组件,跨多个物理服务器。现在,有一个集群配置存储的主节点,以及从这个主节点下载它的其他工作节点,自动配置本身似乎是一个简单而优雅的解决方案。但是,这个解决方案遇到了主节点的一个潜在问题,它是一个单点故障。即使我们假定主节点被设计为容错,设计了一个系统,在这个系统中,配置中的更改被动态地传播到所有的工作节点,这并不简单。

分布式系统中的另一个协调问题是服务发现。通常,为了维持负载并增加应用程序的可用性,我们向系统添加了更多的物理服务器。但是,我们可以让客户机或工作节点知道集群成员身份的变化,以及在集群中托管不同服务的新机器的可用性。这需要在客户机应用程序本身中仔细地设计和实现逻辑。

可伸缩性提高了可用性,但它使协调变得复杂。一个横向可扩展的分布式系统,跨越了成百上千的物理机器,常常容易出现诸如硬件故障、系统崩溃、通信链路故障等故障。这些类型的失败并没有真正遵循任何模式,因此,在应用程序逻辑中处理此类故障,并设计系统是容错的,这确实是一个难题。

因此,到目前为止已经注意到的是,很明显,构建分布式系统并不是那么简单。进行正确、快速和可伸缩的集群协调非常困难,常常容易出现错误,从而导致集群的整体不一致性。这就是Apache
ZooKeeper在分布式系统的设计和开发中作为一个健壮的协调服务来拯救的地方。

3.Apache ZooKeeper介绍

Apache ZooKeeper是Apache软件基金会的软件项目;它为大型分布式系统中的各种协调问题提供了一个开源的解决方案。ZooKeeper最初是在Yahoo!公司开发的。

作为一个集中的协调服务,ZooKeeper是分布式且高度可靠的,运行在一个名为ZooKeeper集成的服务器集群上。分布式协商一致、组管理、存在协议和领导选举由服务实现,这样应用程序就不需要通过自己的实现来重新定义车轮。在这些之上,由ZooKeeper公开的原语可以被应用程序用来构建更强大的抽象来解决各种各样的问题。

Apache ZooKeeper是用Java实现的。它附带了C、Java、Perl和Python客户端绑定。社区提供的客户端库可以用于多种语言,如Go、Scala、Erlang等。


数据搬运工
8 声望3 粉丝