我是zookeeper和分布式系统的新手,我自己也在学习它。
根据我的理解,似乎ZooKeeper只是一个键值存储,其键是路径,值是字符串,这与Redis没什么不同。 (显然我们也可以使用斜线分隔的路径作为redis中的键。)
所以我的问题是,ZooKeeper和其他分布式KV商店之间的本质区别是什么?为什么ZooKeeper使用所谓的"路径"作为键,而不是简单的字符串?
答案 0 :(得分:15)
您正在将ZooKeeper的高级数据模型与其他键值存储进行比较,但这不是使其独特的原因。从分布式系统的角度来看,ZooKeeper与许多其他密钥值存储(尤其是Redis)不同,因为它非常一致,并且可以在大多数集群连接时容忍故障。此外,虽然数据保存在内存中,但它的同步复制到群集的大部分并由磁盘支持,因此一旦写入成功,它就可以保证写入不会丢失(除非导弹袭击)。这使ZooKeeper非常适用于存储少量任务关键状态,如配置。
相反,Redis不是分布式系统,并且不提供ZooKeeper所做的相同种类的保证,并且分布的许多其他键值存储最终是一致的。换句话说,无法保证一旦写入值,分布式系统中的所有其他进程都可以看到该值。
最后,除了用于存储状态的接口等文件系统之外,ZooKeeper还提供了相当低级别的功能,可以解决更复杂的问题。有关Apache Curator的示例。策展人使用ZooKeeper的短暂节点(当创建它们的客户端断开连接时消失的节点)来构建锁和领导者选举等对协调分布式系统非常有用的东西。因此,从这个角度来看,ZooKeeper的数据模型和相关功能可以作为原语,在这些原语上可以构建用于分布式协调的更高级别的工具。
答案 1 :(得分:0)
您可以将zookeeper与其他分布式键值存储区(例如etcd和consul)进行比较。这些工具还提供了与Apache Zookeeper相同的优势。 Zookeeper的主要优点在于,它避免了分布式应用程序中的死锁和竞争情况。 Zookeeper不仅是键值存储,还可以用于服务发现和集中式服务,以维护分布式应用程序中的配置信息。
Zookeeper存储其键值对的方式与其他键值存储方式略有不同,Zookeeper使用z节点作为键。它看起来像unix文件系统树,并且以slash(/)开头。它可以是持久性的,也可以是短暂的。该键值是通过RAM提供的。每个节点都有自己的ACL。 Zookeeper存储事务日志和快照以在发生灾难时恢复节点,它被设计为可容错的分布式k-v存储,因此应将其部署为集群。一组Zookeeper服务器称为Zookeeper集成。这里有一个Zookeeper领导服务器,其余的是跟随者。这种领导者和跟随者的关系是从集群中zk服务器之间的领导者选举中得出的。
Zookeeper主要用于Hadoop Namenode和YARN Resource Manager的HA实现中,它负责提升这些守护程序的活动和备用状态,Kafka被设计为使用Zookeeper来存储主题和偏移量信息。
Zookeeper也可以在kubernetes控制平面中用作etcd的替代品。