Zookeeper vs 内存数据网格 vs Redis
Zookeeper vs In-memory-data-grid vs Redis
我在多个资源中发现了不同的 zookeeper 定义。可能其中有些是断章取义的,但是请看一下:
A canonical example of Zookeeper usage is distributed-memory computation...
我使用过 Redis 和 Hazelcast,通过与它们进行比较,我会更容易理解 Zookeeper。
能否将 Zookeeper 与内存数据网格和 Redis 进行比较?
- 如果是分布式内存计算,zookeeper 与内存数据网格有何不同?
- 如果跨集群同步,那么它与所有其他内存存储有何不同?同样的内存数据网格也提供集群范围的锁。 Redis也有某种事务。
- 如果它只是关于内存中一致的数据,那么还有其他选择。 Imdg 让你达到同样的效果,不是吗?
https://zookeeper.apache.org/doc/current/zookeeperOver.html
默认情况下,Zookeeper 将所有数据复制到每个节点并让客户端观察数据的变化。更改会非常快速地(在有限的时间内)发送给客户。您还可以创建 "ephemeral nodes",如果客户端断开连接,它们将在指定时间内删除。 ZooKeeper 针对 读取 进行了高度优化,而写入速度非常慢(因为它们通常在写入发生后立即发送到每个客户端)。最后,Zookeeper 中 "file" (znode) 的最大大小为 1MB,但通常它们是单个字符串。
综上所述,这意味着 zookeeper 不是用来存储大量数据的,而且绝对不是缓存。相反,它用于管理 heartbeats/knowing 哪些服务器在线,storing/updating 配置,以及可能的消息传递(尽管如果你有大量的消息或高吞吐量需求,像 RabbitMQ 这样的东西会更好任务)。
基本上,ZooKeeper(和建立在它之上的 Curator)有助于处理集群机制——心跳、分布式 updates/configuration、分布式锁等。
和Redis真没法比,但是针对具体问题...
它不支持任何计算,对于大多数数据集,将无法以任何性能存储数据。
它被复制到集群中的所有节点(没有像 Redis 集群那样可以分发数据的地方)。所有消息都以原子方式完整处理并排序,因此没有真正的事务。它可以用于为您的服务实现集群范围的锁(事实上它非常擅长),并且 znode 本身有很多锁定原语来控制哪些节点访问它们。
当然可以,但是 ZooKeeper 填补了一个空缺。它是一种使分布式应用程序能够很好地处理多个实例的工具,而不是 storing/sharing 大量数据。与为此目的使用 IMDG 相比,Zookeeper 会更快,以 predictable 方式管理心跳和同步(有很多 API 使这部分变得简单),并且有一个 "push" 范例"pull",因此节点会很快收到更改通知。
链接问题的引文...
A canonical example of Zookeeper usage is distributed-memory computation
... 是,IMO,有点误导。您将使用它来编排计算,而不是提供数据。例如,假设您必须处理 table 的第 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
一致性保证
ZooKeeper 是一种高性能、可扩展的服务。读取和写入操作都被设计成快速的,尽管读取比写入快。这样做的原因是在读取的情况下,ZooKeeper 可以提供较旧的数据,这又是由于 ZooKeeper 的一致性保证:
顺序一致性
来自客户端的更新将按发送顺序应用。
原子性
更新要么成功要么失败 -- 没有部分结果。
单一系统映像
无论连接到哪个服务器,客户端都将看到相同的服务视图。
可靠性
应用更新后,它将一直持续到客户端覆盖更新为止。此保证有两个推论:
如果客户端获得成功的 return 代码,则将应用更新。在某些故障(通信错误、超时等)下,客户端将不知道更新是否已应用。我们采取措施尽量减少失败,但唯一的保证是只有成功的 return 代码才会出现。 (这在 Paxos 中称为单调性条件。)
客户端通过读取请求或成功更新看到的任何更新,在从服务器故障中恢复时将永远不会回滚。
及时性
保证系统的客户端视图在特定时间范围内是最新的。 (大约几十秒。)在这个范围内,客户端将看到系统更改,或者客户端将检测到服务中断。
我在多个资源中发现了不同的 zookeeper 定义。可能其中有些是断章取义的,但是请看一下:
A canonical example of Zookeeper usage is distributed-memory computation...
我使用过 Redis 和 Hazelcast,通过与它们进行比较,我会更容易理解 Zookeeper。
能否将 Zookeeper 与内存数据网格和 Redis 进行比较?
- 如果是分布式内存计算,zookeeper 与内存数据网格有何不同?
- 如果跨集群同步,那么它与所有其他内存存储有何不同?同样的内存数据网格也提供集群范围的锁。 Redis也有某种事务。
- 如果它只是关于内存中一致的数据,那么还有其他选择。 Imdg 让你达到同样的效果,不是吗?
https://zookeeper.apache.org/doc/current/zookeeperOver.html
默认情况下,Zookeeper 将所有数据复制到每个节点并让客户端观察数据的变化。更改会非常快速地(在有限的时间内)发送给客户。您还可以创建 "ephemeral nodes",如果客户端断开连接,它们将在指定时间内删除。 ZooKeeper 针对 读取 进行了高度优化,而写入速度非常慢(因为它们通常在写入发生后立即发送到每个客户端)。最后,Zookeeper 中 "file" (znode) 的最大大小为 1MB,但通常它们是单个字符串。
综上所述,这意味着 zookeeper 不是用来存储大量数据的,而且绝对不是缓存。相反,它用于管理 heartbeats/knowing 哪些服务器在线,storing/updating 配置,以及可能的消息传递(尽管如果你有大量的消息或高吞吐量需求,像 RabbitMQ 这样的东西会更好任务)。
基本上,ZooKeeper(和建立在它之上的 Curator)有助于处理集群机制——心跳、分布式 updates/configuration、分布式锁等。
和Redis真没法比,但是针对具体问题...
它不支持任何计算,对于大多数数据集,将无法以任何性能存储数据。
它被复制到集群中的所有节点(没有像 Redis 集群那样可以分发数据的地方)。所有消息都以原子方式完整处理并排序,因此没有真正的事务。它可以用于为您的服务实现集群范围的锁(事实上它非常擅长),并且 znode 本身有很多锁定原语来控制哪些节点访问它们。
当然可以,但是 ZooKeeper 填补了一个空缺。它是一种使分布式应用程序能够很好地处理多个实例的工具,而不是 storing/sharing 大量数据。与为此目的使用 IMDG 相比,Zookeeper 会更快,以 predictable 方式管理心跳和同步(有很多 API 使这部分变得简单),并且有一个 "push" 范例"pull",因此节点会很快收到更改通知。
链接问题的引文...
A canonical example of Zookeeper usage is distributed-memory computation
... 是,IMO,有点误导。您将使用它来编排计算,而不是提供数据。例如,假设您必须处理 table 的第 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
一致性保证 ZooKeeper 是一种高性能、可扩展的服务。读取和写入操作都被设计成快速的,尽管读取比写入快。这样做的原因是在读取的情况下,ZooKeeper 可以提供较旧的数据,这又是由于 ZooKeeper 的一致性保证:
顺序一致性 来自客户端的更新将按发送顺序应用。
原子性 更新要么成功要么失败 -- 没有部分结果。
单一系统映像 无论连接到哪个服务器,客户端都将看到相同的服务视图。
可靠性 应用更新后,它将一直持续到客户端覆盖更新为止。此保证有两个推论:
如果客户端获得成功的 return 代码,则将应用更新。在某些故障(通信错误、超时等)下,客户端将不知道更新是否已应用。我们采取措施尽量减少失败,但唯一的保证是只有成功的 return 代码才会出现。 (这在 Paxos 中称为单调性条件。)
客户端通过读取请求或成功更新看到的任何更新,在从服务器故障中恢复时将永远不会回滚。
及时性 保证系统的客户端视图在特定时间范围内是最新的。 (大约几十秒。)在这个范围内,客户端将看到系统更改,或者客户端将检测到服务中断。