【ZooKeeper】什么是ZooKeeper


ZooKeeper简介

  1. 官网:https://zookeeper.apache.org/
  2. 什么是 ZooKeeper?

官网解释:

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

翻译:

ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都被分布式应用程序以某种形式使用。每次实现它们时,都要做大量工作来修复不可避免的bug和竞争条件。由于实现这些类型的服务很困难,应用程序最初通常忽略它们,这使得它们在出现更改时很脆弱,难以管理。即使正确执行,这些服务的不同实现也会在部署应用程序时导致管理复杂性。

  1. 通俗的解释:
    大数据生态系统里的很多组件的命名都是某种动物或者昆虫,比如hadoop和hive。zookeeper即动物园管理者,顾名思义就是管理大数据生态系统各组件的管理员。

在这里插入图片描述

ZooKeeper的应用场景

zooKeeper是一个经典的分布式数据—致性解决方案,致力于为分布式应用提供一个高性能、高可用且具有严格顺序访问控制能力的分布式协调存储服务。

维护配置信息

  1. java编程经常会遇到配置项,比如数据库的urlschemauserpassword等。通常这些配置项我们会放置在配置文件中,再将配置文件放置在服务器上当需要更改配置项时,需要去服务器上修改对应的配置文件。
  2. 但是随着分布式系统的兴起,由于许多服务都需要使用到该配置文件,因此有必须保证该配置服务的高可用性(highavailability)和各台服务器上配置数据的一致性。
  3. 通常会将配置文件部署在一个集群上,然而一个集群动辄上千台服务器,此时如果再一台台服务器逐个修改配置文件那将是非常繁琐且危险的的操作,因此就需要一种服务能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每台服务器上的数据一致性。
  4. zookeeper就可以提供这样一种服务,其使用Zab这种一致性协议来保证一致性。现在有很多开源项目使用zookeeper来维护配置。

分布式锁服务

一个集群是一个分布式系统,由多台服务器组成。为了提高并发度和可靠性,多台服务器上运行着同一种服务。当多个服务在运行时就需要协调各服务的进度,有时候需要保证当某个服务在进行某个操作时,其他的服务都不能进行该操作,即对该操作进行加锁,如果当前机器挂掉后,释放锁并 fail over到其他的机器继续执行该服务

集群管理

一个集群有时会因为各种软硬件故障或者网络故障,出现棊些服务器挂掉而被移除集群,而某些服务器加入到集群中的情况,zookeeper会将这些服务器加入/移出的情况通知给集群中的其他正常工作的服务器,以及时调整存储和计算等任务的分配和执行等。此外zookeeper还会对故障的服务器做出诊断并尝试修复。

生成分布式唯一ID

  • 在过去的单库单表型系统中,通常可以使用数据库字段自带的auto_ increment属性来自动为每条记录生成一个唯一的ID。但是分库分表后,就无法在依靠数据库的auto_ Increment属性来唯一标识一条记录了。此时我们就可以用zookeeper在分布式环境下生成全局唯一ID
  • 做法如下:每次要生成一个新id时,创建一个持久顺序节点,创建操作返回的节点序号,即为新id,然后把比自己节点小的删除即可。

ZooKeeper的数据模型

  1. zookkeeper 提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称 key 由斜线 / 分割的一系列路径元素,zookeeper 名称空间中的每个节点都是由一个路径标识。
  2. zookeeper的数据结点可以视为树状结构(或目录),树中的各个结点被称为znode(即zookeeper node),一个znode可以由多个子结点。zookeeper结点在结构上表现为树状。
  3. 使用路径path来定位某个znode,比如:/app1/p_33在这里插入图片描述
  4. 如何描述一个znode
    一个znode大体上分为3个部分:
  • 结点的数据:即znode data(结点path,结点data)的关系就像是Java map中的 key value关系
  • 结点的子结点children
  • 结点的状态stat:用来描述当前结点的创建、修改记录,包括cZxidctime
  1. 节点状态stat的属性

(a)在zookeeper shell中使用 get命令查看指定路径结点的datastat信息(get+路径)
(b)使用get命令查看stat相关属性的含义:

  • cZxid:数据结点创建时的事务ID——针对于zookeeper数据结点的管理:我们对结点数据的一系列写操作(节点数据的创建、修改、删除)都会导致zookeeper自动地为我们去开启一个事务,并且自动地去为每一个事务维护一个事务ID。读取操作不会创建事务。
  • ctime:数据结点创建时的时间
  • mZxid:数据结点最后一次更新时的事务ID
  • mtime:数据结点最后一次更新时的时间
  • pZxid:数据节点最后一次修改此znode子节点更改的zxid
  • cversion:子结点的更改次数
  • dataVersion:结点数据的更改次数
  • aclVersion:结点的ACL更改次数——类似linux的权限列表,维护的是当前结点的权限列表被修改的次数
  • ephemeralOwner:如果结点是临时结点,则表示创建该结点的会话的SessionID;如果是持久结点,该属性值为0
  • dataLength:数据内容的长度
  • numChildren:数据结点当前的子结点个数
  1. 节点的类型
    zookeeper中的结点有两种,分别为临时结点永久结点。结点的类型在创建时被确定,并且不能改变
  • 临时节点:
    • 该节点的生命周期依赖于创建它们的会话。一旦会话( Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的 Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,Zookeeper的临时节点不允许拥有子节点
  • 持久化结点:
    • 该结点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,它们才能被删除

集群

两大关键特性-两大能力-两大技术

  1. 集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。与单一服务实体相比较,集群提供了以下两个关键特性:
    a)可扩展性:集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。

    b)高可用性:集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出 错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。

  2. 两个能力
    为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:

(1)负载均衡:负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。

(2)错误恢复:由于某种原因,执行某个任务的资源出现故障,另一服务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。

负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。

  1. 两大技术

实现集群务必要有以下两大技术:

(1)集群地址:集群由多个服务实体组成,集群客户端通过访问集群的集群地址获取集群内部各服务实体的功能。具有单一集群地址(也叫单一影像)是集群的一个基 本特征。维护集群地址的设置被称为负载均衡器。负载均衡器内部负责管理各个服务实体的加入和退出,外部负责集群地址向内部服务实体地址的转换。有的负载均 衡器实现真正的负载均衡算法,有的只支持任务的转换。只实现任务转换的负载均衡器适用于支持ACTIVE-STANDBY的集群环境,在那里,集群中只有 一个服务实体工作,当正在工作的服务实体发生故障时,负载均衡器把后来的任务转向另外一个服务实体。

(2)内部通信:为了能协同工作、实现负载均衡和错误恢复,集群各实体间必须时常通信,比如负载均衡器对服务实体心跳测试信息、服务实体间任务执行上下文信息的通信。

具有同一个集群地址使得客户端能访问集群提供的计算服务,一个集群地址下隐藏了各个服务实体的内部地址,使得客户要求的计算服务能在各个服务实体之间分布。内部通信是集群能正常运转的基础,它使得集群具有均衡负载和错误恢复的能力。

分布式

  1. 什么是分布式系统?

(1)为了解决传统单体服务架构带来的各种问题,代码数量庞大,迭代测试维护困难,可能因为一处改动测试不到位造成整个服务瘫痪等问题,分布式系统就是将一个大的服务拆分成几十个甚至上百个微小的服务。
(2)分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
(2)首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。
(3)通俗的理解:可以把分布式看成一种解决方案,目的在于解决单台机器的故障问题,单机计算和IO性能问题,以及单机存储空间不足的问题。就是将计算能力和数据存储能力分散在不同服务器上,通过网络连接组成的一个整体的服务,不同的服务器可能是物理机,也可能是虚拟机。

  1. 分布式系统的优点:

(a)系统可用性提升

传统的集中式计算或集中式存储在遇见单点故障时很容易造成整个服务不可用,分布式下的服务体系,单台机器有故障,不致于造成整个服务不可用。

(b)系统并发能力提升

请求通过 Nginx 负载均衡被分发到不同的服务器上,运行同样代码的服务器可以有 1 台或 N 台,通常情况下会根据实际用户访问量随时增加机器,无论是数据库或者服务,都可以做到随时水平扩展。

(c)系统容错能力提高

我们在不同的地区部署了同一组服务器,一个地方出错,并不会影响用户的使用,会分配到其他服务器上。

(d)延迟性
服务器会根据用户IP选择距离自己最近的机房,降低网络延迟。

  1. 分布式系统的缺点:

(1)分布式服务依赖网络
服务器间通讯依赖网络,不可靠网络包括网络延时,丢包、中断、异步,一个完整的服务请求依赖一连串服务调用,任意一个服务节点网络出现问题,都可能造成本次请求失败
(2)维护成本高
传统单体式服务只需要维护一个站点就可以。分布式服务系统被拆分成若干个小服务,服务从 1 变为几十个上百个服务后,增加运维成本。
(3)一致性,可用性,分区容错性(CAP定理)无法同时满足
在分布式系统中,这三种特性最多只能满足两种,无法同时满足,需要根据实际情况去调整牺牲掉其中哪个。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值