ZooKeeper和任何分布式键值存储之间有什么区别?

21

我刚接触zookeeper和分布式系统,正在自学。

目前我所理解的是,ZooKeeper只是一个键值存储器,其键为路径,值为字符串,这与Redis等其他键值存储器没有什么不同。(显然,在Redis中我们也可以使用斜杠分隔的路径作为键。)

那么我的问题是,ZooKeeper和其他分布式键值存储器之间的本质区别是什么?为什么ZooKeeper要将所谓的“路径”用作键,而不是简单的字符串?


太棒了的问题! - Eugene
2个回答

25

你正在将ZooKeeper的高级数据模型与其他键值存储进行比较,但这并不是它独特的地方。从分布式系统角度来看,ZooKeeper与许多其他键值存储(特别是Redis)不同,因为它具有强一致性并且可以容忍大多数群集连接的故障。此外,虽然数据保存在内存中,但它会被同步复制到大多数集群并备份到磁盘,因此一旦写入成功,就保证不会丢失该写入(除非遭受导弹攻击)。这使得ZooKeeper非常适合存储像配置之类的关键状态的少量信息。

相反,Redis不是分布式系统,也没有提供与ZooKeeper相同类型的保证。许多其他分布式键值存储都是“最终一致”的。换句话说,没有保证一旦写入一个值,所有分布式系统中的其他进程都可以看到那个值。

最后,除了用于存储状态的类似文件系统的接口外,ZooKeeper还提供了相当低级别的功能,可以解决更复杂的问题。例如Apache Curator。Curator使用ZooKeeper的临时节点(由创建它们的客户端断开连接时消失的节点)构建锁和领导者选举等东西,这对于协调分布式系统非常有用。因此,从那个角度来看,ZooKeeper的数据模型和相关功能可以作为构建分布式协调的更高级别工具的原语。


6
你可以将zookeeper与其他分布式键值存储比较,如etcd和consul。这些工具也提供了与apache zookeeper相同的好处。Zookeeper的主要优势在于它能够避免分布式应用程序中的死锁和竞态条件。Zookeeper不仅是一个键值存储,还可用于服务发现和维护分布式应用程序中的配置信息的集中式服务。
Zookeeper存储其键值对的方式与其他键值存储有所不同,Zookeeper使用z-node作为键。它看起来像一个Unix文件系统树,以斜杠(/)开头。它可能是持久的或临时的。该键值通过RAM提供。每个节点都有自己的ACL。Zookeeper存储事务日志和快照,以便在灾难情况下恢复节点,它被设计成一个容错和分布式的k-v存储,因此应该部署为一个集群。一组zookeeper服务器称为zookeeper集合。这里有一个zookeeper领导服务器和其余的是跟随者。这种领导者和跟随者的关系是从群集中zk服务器之间的领导选举中派生出来的。
Zookeeper主要用于Hadoop Namenode和YARN资源管理器的HA实现,在这里它负责推广这些守护程序的活动和待机状态,Kafka设计使用Zookeeper存储主题和偏移信息。
Zookeeper也可以作为kubernetes控制平面中etcd的替代方案。

1
你说:“Zookeeper不仅是一个键值存储,还可以用于服务发现和分布式应用程序中维护配置信息的集中服务。”但这与etcd有何区别?我的理解是etcd也可以做到这一点。 - Josh
你还说:“Zookeeper 存储事务日志和快照,以便在灾难情况下恢复节点。它被设计为容错和分布式 k-v 存储,因此应该部署为集群。”但是 etcd 不也是容错的吗?而且 etcd 也将数据(即日志)存储到磁盘上了吧? - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接