Zookeeper概述图文详解
什么是Zookeeper?
Zookeeper是一种开放源代码的分布式协同服务,其主要功能是维护同时多达数百个进程间的协同动作。
Zookeeper提供以下功能:
- 配置管理:save/update
- 命名服务:节点注册与查找
- 分布式锁
故而通常Zookeeper被作为实现其它分布式服务的基础服务,例如Hadoop、HBase等等。
Zookeeper的特点
- 高可用性
- 时效性——最终一致性
- 高性能——低延迟
- 可扩展性
Zookeeper的架构
Zookeeper的核心架构包括了两部分:
- Leader
- Follower
客户端可以去连接任何一个Zookeeper节点,它们都可以服务于客户端。但在有些场合,而我们希望只连接主节点,所以可以客户端只连接Leader节点,Leader节点负责同步所有的事务日志以确保所有节点的状态都是一致的。
Zookeeper的操作流程
当客户端通过Zookeeper API进行数据读取,以下是操作的流程说明:
- Client向Zookeeper Cluster中的某一节点发送请求。
- 接收请求的节点将请求转发给Leader。
- Leader接收到请求后进行具体处理。
- 处理结果由Leader同步给所有Follower,此过程中会形成一个快照文件,以便节点崩溃后进行恢复。
- Follower确认结果同步完成后通知Leader,告知合并最新的投票记录,投票记录包括了事务编号和节点的唯一标识(client_id),确保所有的记录都是有序的。
- Client收到操作成功的消息。
Zookeeper的使用场景示例
示例1:分布式锁
多个进程竞争一个临界资源,可使用分布式锁控制对该资源的访问。使用Zookeeper实现分布式锁的方法如下:
- 程序启动时调用create()创建一个持久化节点“/locks”,作为锁父节点。
- 进程请求锁时,在锁父节点下创建一个序列化节点,例如“/locks/lock-000000001”,保证锁的唯一性。
- 客户端调用getChildren()获取锁父节点下的所有子节点,并根据规则取得最小序列节点的数据。
- 判断该节点是否为“/locks/lock-000000001”,如果是则获取到锁;否则监听比该节点小的前面一个节点。
- 前一个节点释放锁后,当前节点收到通知,获取锁。
示例2:注册中心
在服务端集群中,若服务提供者的地址和端口或服务消费者的地址和端口发生改变,所有服务提供者和消费者都需要维护各种各样的服务列表。当服务集群规模比较大时,这种人工维护的方式难于管理,可使用Zookeeper实现服务注册和发现的方法如下:
- 服务端启动后使用create()创建一个持久化节点“/services”,作为所有服务的父节点。
- 每个服务在启动后使用create()在“/services”下创建一个临时节点,例如“/services/service-1”,作为服务本身的节点,保证节点的随机性,并设置节点数据为该服务的地址+
端口。 - 服务消费者启动后使用getChildren()获取“/services”下的所有服务子节点,从中取出服务提供者的地址和端口,从而实现消费者对服务提供者的自动发现。
结论
Zookeeper作为分布式应用组件,可以实现分布式锁、注册中心、命名服务等一系列分布式协同功能,具有高可用性、时效性、高性能和可扩展性等特点。其核心架构包括了Leader和Follower;当客户端通过Zookeeper API进行数据读取时,流程包括了Client请求、节点转发、Leader处理、Follower同步、Client收到消息。Zookeeper的使用场景非常广泛,例如分布式锁和注册中心等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:zookeeper概述图文详解 - Python技术站