Zookeeper与In-memory-data-grid对比Redis

时间:2016-05-18 08:18:00

标签: redis apache-zookeeper distributed-computing hazelcast

我在多个资源中找到了不同的zookeeper定义。也许其中一些是脱离背景,但看看它们:

  1.   

    A canonical example of Zookeeper usage is distributed-memory computation...

  2.   

    ZooKeeper is an open source Apache™ project that provides a centralized infrastructure and services that enable synchronization across a cluster.

  3.   

    Apache ZooKeeper is an open source file application program interface (API) that allows distributed processes in large systems to synchronize with each other so that all clients making requests receive consistent data.

  4. 我曾与Redis和Hazelcast合作,通过与Zookeeper进行比较,我更容易理解Zookeeper。

    你能否将Zookeeper与内存数据网格和Redis进行比较?

    1. 如果分布式内存计算,zookeeper与内存数据网格有何不同?
    2. 如果跨群集同步,那么它与所有其他内存存储有何不同?相同的内存数据网格也提供了群集范围的锁。 Redis也有某种交易。
    3. 如果只是关于内存中的一致数据,那么还有其他选择。 Imdg让你实现同样的目标,不是吗?

2 个答案:

答案 0 :(得分:24)

https://zookeeper.apache.org/doc/current/zookeeperOver.html

默认情况下,Zookeeper会将所有数据复制到每个节点,并允许客户端监视数据以进行更改。变更会很快(在有限的时间内)发送给客户。您还可以创建"短暂节点",如果客户端断开连接,则会在指定时间内删除它们。 ZooKeeper针对读取进行了高度优化,而写入速度非常慢(因为它们通常在写入发生后立即发送到每个客户端)。最后,"文件的最大大小" Zookeeper中的(znode)是1MB,但通常它们是单个字符串。

总而言之,这意味着zookeeper并不意味着存储大量数据,而且绝对不是缓存。相反,它用于管理心跳/知道哪些服务器在线,存储/更新配置,以及可能的消息传递(尽管如果你有大量的消息或高吞吐量需求,像RabbitMQ这样的东西会更好任务)。

基本上,ZooKeeper(以及基于它构建的Curator)有助于处理集群的机制 - 心跳,分发更新/配置,分布式锁等。

它与Redis无法比拟,但针对具体问题......

  1. 它不支持任何计算,对于大多数数据集,无法以任何性能存储数据。

  2. 它被复制到集群中的所有节点(没有像Redis集群那样可以分发数据)。所有消息都以原子方式完整处理并按顺序排列,因此没有真正的事务。可以使用它来为您的服务实现集群范围的锁(事实上它非常擅长),并且在znode本身上有很多锁定原语来控制哪些节点访问它们。

  3. 当然,但ZooKeeper填补了一席之地。它是一种使分布式应用程序在多个实例中运行良好的工具,而不是用于存储/共享大量数据。与为此目的使用IMDG相比,Zookeeper将更快,以可预测的方式管理心跳和同步(有许多API使这部分变得简单),并且有一个" push"范式代替"拉"因此节点会很快得到通知。

  4. 来自关联问题的引文......

      

    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中称为单调性条件。)

从服务器故障中恢复后,客户端通过读取请求或成功更新看到的任何更新都不会回滚。

及时性 保证系统的客户视图在特定时间范围内是最新的。 (大约几十秒。)客户端将在此范围内看到系统更改,或者客户端将检测到服务中断。