作用

Zookeeper作用包括存储数据(文件系统)和监听(监听通知机制)

优点

1)分布式协调过程简单

2)同步:zk高度同步,这意味着服务器进程之间既存在互斥又存在合作,同步有助于Apache HBase进行配置管理。

3)有序消息:zk跟踪一个数字,表示每个更新的顺序,保证消息有序

4)序列化:根据具体规则,zk对数据进行编码。 另外,它还可确保我们的应用程序始终如一地运行。 但是,在MapReduce中,我们使用此方法(序列化)来协调队列以执行正在运行的线程

5)速度:在读请求多的情况下,能以很快的速度运行

6)可扩展性:此外,可以通过部署更多机器来加强zk的性能

7)有序性有何优势?:众所周知,zk中的消息是有序的。所以,为了实现更高级别的抽象,需要有序性。 这就是有序性对我们有利的方式

8)快:在读多的情况下,zk会非常快

9)可靠性:zk非常可靠,因为一旦zk更新了,更新后的数据会一直保持,直到被覆盖更新

10)原子性:zk只有两种情况,要么全部成功,要么全部失败,没有中间状态的情况

11)实时性:zk保证在一定时间段内,客户端最终一定能从服务器上读到最新的数据状态

缺点

1)增加新的zk服务器时可能导致数据丢失

在现有服务器中,当新zk服务器数量超过zk服务中已存在的数量时数据会丢失。 同时,向zk服务发出Start命令,新服务器可能形成仲裁

2)不能迁移

在没有用户干预的情况下,zk服务器无法从版本3.4迁移到3.3,然后再迁移到3.4。

3)节点数(其实集群中只要存活数过半即对外可用,但是会有脑裂情况发生)

要求3或5个这样奇数个zk节点(要求奇数是为了保证选举的正常进行因为leader选举要求 可用节点数量 > 总节点数/2,防止脑裂造成集群不可用。同时在容错能力相同的情况下,奇数个节点更节省资源)

4)机架感知复制

目前,它不支持机架放置和感知

5)缩容

不支持减少pod的数量,以防止意外数据丢失

6)磁盘变更

不支持在初始部署后更改volume要求,以防止重新分配意外丢失数据

7)虚拟网络

当服务部署在虚拟网络上时,如果没有完全重新安装,服务可能无法切换到主机网络。 另外,对于尝试从主机切换到虚拟网络,它们是相同的情况

8)Kerberos

在虚拟网络上,它目前不支持启用Kerberos

9)支持有限

对跨群集方案的支持非常有限。 但是,没有CP系统会一直支持跨集群。 虽然我们可以说consul似乎在这方面做得更好

应用场景

1)数据的发布/订阅

数据的发布/订阅系统,通常也用作配置中心。在分布式系统中,你可能有成千上万个服务节点,如果想要对所有服务的某项配置进行更改,由于数据节点过多,你不可逐台进行修改,而应该在设计时采用统一的配置中心。之后发布者只需要将新的配置发送到配置中心,所有服务节点即可自动下载并进行更新,从而实现配置的集中管理和动态更新。 Zookeeper通过Watcher机制可以实现数据的发布和订阅。分布式系统的所有的服务节点可以对某个ZNode注册监听,之后只需要将新的配置写入该ZNode,所有服务节点都会收到该事件。

2)命名服务

在分布式系统中,通常需要一个全局唯一的名字,如生成全局唯一的订单号等,Zookeeper可以通过顺序节点的特性来生成全局唯一ID,从而可以对分布式系统提供命名服务。

3)Master选举

分布式系统一个重要的模式就是主从模式(Master/Salves),Zookeeper可以用于该模式下的Matser选举。可以让所有服务节点去竞争性地创建同一个ZNode,由于Zookeeper不能有路径相同的ZNode,必然只有一个服务节点能够创建成功,这样该服务节点就可以成为Master节点。

4)分布式锁

可以通过Zookeeper的临时节点和Watcher机制来实现分布式锁,这里以排它锁为例进行说明:分布式系统的所有服务节点可以竞争性地去创建同一个临时ZNode,由于Zookeeper不能有路径相同的ZNode,必然只有一个服务节点能够创建成功,此时可以认为该节点获得了锁。其他没有获得锁的服务节点通过在该ZNode上注册监听,从而当锁释放时再去竞争获得锁。锁的释放情况有以下两种: 当正常执行完业务逻辑后,客户端主动将临时ZNode删除,此时锁被释放; 当获得锁的客户端发生宕机时,临时ZNode会被自动删除,此时认为锁已经释放。 当锁被释放后,其他服务节点则再次去竞争性地进行创建,但每次都只有一个服务节点能够获取到锁,这就是排他锁。

5)集群管理

Zookeeper还能解决大多数分布式系统中的问题: 如可以通过创建临时节点来建立心跳检测机制。如果分布式系统的某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发。 分布式系统的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报。 通过数据的订阅和发布功能,Zookeeper还能对分布式系统进行模块的解耦和任务的调度。 通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而实现服务的动态扩容。

6)事务操作

在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。 对应每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用 ZXID 表示,通常是一个64位的数字。每一个 ZXID对应一次更新操作, 从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些事务操作请求的全局顺序。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐