我在多个资源中找到了不同的zookeeper定义。也许其中一些是脱离背景,但看看它们:
A canonical example of Zookeeper usage is distributed-memory computation...
我曾与Redis和Hazelcast合作,通过与Zookeeper进行比较,我更容易理解Zookeeper。
你能否将Zookeeper与内存数据网格和Redis进行比较?
答案 0 :(得分:24)
https://zookeeper.apache.org/doc/current/zookeeperOver.html
默认情况下,Zookeeper会将所有数据复制到每个节点,并允许客户端监视数据以进行更改。变更会很快(在有限的时间内)发送给客户。您还可以创建"短暂节点",如果客户端断开连接,则会在指定时间内删除它们。 ZooKeeper针对读取进行了高度优化,而写入速度非常慢(因为它们通常在写入发生后立即发送到每个客户端)。最后,"文件的最大大小" Zookeeper中的(znode)是1MB,但通常它们是单个字符串。
总而言之,这意味着zookeeper并不意味着存储大量数据,而且绝对不是缓存。相反,它用于管理心跳/知道哪些服务器在线,存储/更新配置,以及可能的消息传递(尽管如果你有大量的消息或高吞吐量需求,像RabbitMQ这样的东西会更好任务)。
基本上,ZooKeeper(以及基于它构建的Curator)有助于处理集群的机制 - 心跳,分发更新/配置,分布式锁等。
它与Redis无法比拟,但针对具体问题......
它不支持任何计算,对于大多数数据集,无法以任何性能存储数据。
它被复制到集群中的所有节点(没有像Redis集群那样可以分发数据)。所有消息都以原子方式完整处理并按顺序排列,因此没有真正的事务。可以使用它来为您的服务实现集群范围的锁(事实上它非常擅长),并且在znode本身上有很多锁定原语来控制哪些节点访问它们。
当然,但ZooKeeper填补了一席之地。它是一种使分布式应用程序在多个实例中运行良好的工具,而不是用于存储/共享大量数据。与为此目的使用IMDG相比,Zookeeper将更快,以可预测的方式管理心跳和同步(有许多API使这部分变得简单),并且有一个" push"范式代替"拉"因此节点会很快得到通知。
来自关联问题的引文......
Zookeeper使用的典型示例是分布式内存计算
......是IMO,有点误导。您可以使用它来编排计算,而不是提供数据。例如,假设您必须处理表格的1-100行。您可以放置10个ZK节点,其名称类似于" 1-10"," 11-20"," 21-30"等等。客户端应用程序将是ZK自动通知此更改,第一个将抓住" 1-10"并设置一个短暂的节点clients/192.168.77.66/processing/rows_1_10
下一个应用程序会看到这个并转到下一个要处理的组。要计算的实际数据将存储在别处(即Redis,SQL数据库等)。如果节点在计算的中途失败,则另一个节点可以看到(30-60秒后)并再次获取作业。
我说ZooKeeper的典型例子是领导者选举。我们假设您有3个节点 - 一个是主节点,另外两个是从节点。如果主站关闭,则从站节点必须成为新的领导者。这种类型的东西非常适合ZK。
答案 1 :(得分:0)
一致性保证 ZooKeeper是一项高性能,可扩展的服务。读取和写入操作都被设计为快速,尽管读取比写入快。原因是在读取的情况下,ZooKeeper可以提供较旧的数据,这又是由于ZooKeeper的一致性保证所致:
顺序一致性 来自客户端的更新将按照发送的顺序进行应用。
原子性 更新成功或失败-没有部分结果。
单个系统映像 无论客户端连接到哪个服务器,客户端都将看到该服务的相同视图。
可靠性 一旦应用了更新,它将一直持续到客户端覆盖更新为止。此保证有两个推论:
如果客户端获得成功的返回码,则将应用此更新。在某些故障(通信错误,超时等)上,客户端将不知道更新是否已应用。我们采取了一些措施来最大程度地减少失败,但是唯一的保证只有成功的返回码。 (这在Paxos中称为单调性条件。)
从服务器故障中恢复后,客户端通过读取请求或成功更新看到的任何更新都不会回滚。
及时性 保证系统的客户视图在特定时间范围内是最新的。 (大约几十秒。)客户端将在此范围内看到系统更改,或者客户端将检测到服务中断。