Redis 集群是否需要 reads/writes 的分片知识?

Does Redis cluster require knowledge of sharding for reads/writes?

传统(常规)redis

根据我的阅读 here,当使用 memcached 时:

我的理解是Redis(不是Redis集群)强加了相同的要求和逻辑。也就是说,客户端需要知道他们需要将数据写入哪些服务器(例如,使用散列或等价物)。

Redis 集群

有了Redis集群,事情似乎就不一样了。看起来像:

这似乎使它更接近于例如etcdZookeeper,除非它可能全部在内存中(因此缓存速度更快)。

也就是说,在 etcd 中,可以写入 任何 节点(跟随者或领导者),例如a 以 RR(循环)方式(即只要 etcd 节点响应),并且 not 必须 知道 如何当 reading/writing 到节点时,数据被 分片 。这是因为etcd使用共识算法(Raft)跨节点分发数据,并且etcd尝试将所有数据写入并存储在所有节点.

这是否也适用于 Redis 集群?或者当 reading/writing 到集群时,是否需要知道每个键所在的位置(以及要命中哪些节点)?

My understanding is that Redis (not Redis cluster) imposes the same requirements and logic. That is, clients need to know what servers they need to write data to (e.g. using a hash or equivalent).

不完全是。在这种情况下,只有一个主节点,客户端总是需要向主节点写入(当主节点与副本节点同步时,对副本节点的写入将被覆盖)。客户端可以从任何节点读取,除了从副本读取的数据可能是陈旧的。没有散​​列的东西,因为每个节点都有所有数据的完整副本。如果你也使用 Redis Sentinel,你可以从 Redis Sentinel 中动态获取主副本节点信息。 Sentinel 也会做主故障转移的事情。

Does this also apply to Redis cluster? Or does one need to know where each key lives (and thus what nodes to hit) when reading/writing to the cluster?

客户端需要知道每个键位于哪个节点上。但是,客户端可以将请求发送到任何节点。如果请求的密钥不在该节点上,则该节点将使用密钥的位置信息进行响应。然后客户端可以向正确的节点发送另一个请求。

通常一个体面的客户端库会实现这个逻辑,最终用户不需要知道这些细节。