ZooKeeper-概览
什么是ZooKeeper?
ZooKeeper是一个集中的服务,用于维护配置信息(其他如Apollo)、命名、提供分布式同步(分布式锁其他如Redis)和提供组服务。
Zoo Keeper 动物园管理员
因为协调分布式系统是一个动物园,ZooKeeper是分布式应用的高性能协调服务,它提供服务例如命名、配置管理、同步和组服务。可以使用现成的去实现一致性,组管理,领导人选举,监测集群内各实例的生存状态
分布式应用程序的分布式协调服务
ZooKeeper is a distributed, open-source coordination service for distributed applications. ZooKeeper的目的是为了减轻分布式应用程序从头实现协调服务的工作。
1 设计目标
Simple
Zookeeper允许分布式进程共享层次命名空间。The name space called znodes,类似于文件系统的,但是znodes是存储于内存中,这也是Zookeeper为什么能实现高吞吐、低延迟的原因
Zookeeper注重高性能、高可靠性、严格的访问顺序。
高性能意味着Zookeeper可以应用在大型分布式系统中;
高可靠性意味着Zookeeper不会成为不会成为单点故障;
严格的访问顺序意味着复杂的同步原语可以在客户端实现;
Replicated ( 重复的 )
这些Server在内存中维护状态映像,以及持久存储中的事务日志和快照。他们中的大多数工作则Zookeeper工作
客户端连接到单个ZooKeeper服务器。客户端维护一个TCP连接,通过它发送请求、获取响应、获取监视事件和发送心跳。如果到服务器的TCP连接中断,客户机将连接到另一个服务器
Ordered
ZooKeeper用一个数字来标记每个更新,这个数字反映了所有ZooKeeper事务的顺序。后续操作可以使用该顺序实现更高级别的抽象,比如同步原语。
Fast
在“以读取为主”的工作负载中,它的速度特别快。
2 数据模型和层次命名空间
命名空间类似于文件系统,名称是由一条斜线分隔的路径元素序列,ZooKeeper名称空间中的每个节点都由一个路径标识。
3 节点和临时节点
与标准的文件系统不同,ZooKeeper名称空间中的每个节点都可以拥有与其关联的数据和子节点。这就像一个文件系统允许一个文件同时也是一个目录。
Znodes维护一个stat结构,其中包含数据更改、ACL更改和时间戳的版本号,以允许缓存验证和协调更新。每当znode的数据发生变化,版本号就会增加。每当客户机检索数据时,它也接收数据的版本。
在名称空间中的每个znode中存储的数据的读写操作都是原子的。Reads get all the data bytes associated with ( 与…有关系 ) a znode and a write replaces all the data. Each node has an Access Control List (ACL) that restricts ( 约束 ) who can do what.
ZooKeeper也有临时节点的概念。只要创建znode的会话处于活动状态,这些临时znode就一直存在。当会话结束时,将删除这些临时znode。
4 条件更新和监控
Zookeeper支持监控,客户端可以设置一个监控在znode上,当节点发生变化时监控会触发并被移除,此时客户端会收到一个数据包。客户端和Zookeeper的server断开连接时会收到一个本地通知
5 保证
顺序一致性:来自客户端的更新操作会严格按照顺序执行
原子性:更新操作要么全部成功,要么全部失败
单一系统镜像:无论服务连接到哪个服务器,客户机都将看到相同的服务视图
可靠性:执行更新操作后将一直生效直到另一个客户端覆盖了本次更新操作
及时性:保证系统的客户端视图在一定的时间范围内是最新的
6 简单的API
create : creates a node at a location in the tree
delete : deletes a node
exists : tests if a node exists at a location
get data : reads the data from a node
set data : writes data to a node
get children : retrieves (检索) a list of children of a node
sync : waits for data to be propagated (传播)
7 实现
The replicated database ( 复制数据库 ) is an in-memory database containing the entire data tree ( 整个数据树 ) . 更新操作会记录日志到磁盘以防恢复数据,写入操作之前会序列化到磁盘
Every ZooKeeper server services clients. 客户端仅连接到一个Zookeeper server提交请求。读请求从每个服务器数据库的本地副本获得服务。写请求遵循一致性协议
作为一致性协议的一部分,所有来自客户端的写请求都被转发到一个名为leader的服务器上。其余的follower服务器接收来自leader服务器的消息就消息传递达成一致性。消息层负责在出现故障时替换领导者,并将追随者与领导者同步。
ZooKeeper使用自定义原子消息传递协议。因为消息层是原子的,所以ZooKeeper可以保证本地副本不会有不一致问题。当leader收到一个写请求时,它会计算将要应用的写时系统的状态,并将其转换为捕获这个新状态的事务。