Redis 集群是否需要 reads/writes 的分片知识?
Does Redis cluster require knowledge of sharding for reads/writes?
传统(常规)redis
根据我的阅读 here,当使用 memcached 时:
- 每个客户端都知道所有服务器
- 服务器不相互通信
- 如果客户端希望设置或读取某个键对应的值,客户端的库首先计算该键的哈希值以确定使用哪个服务器。
我的理解是Redis(不是Redis集群)强加了相同的要求和逻辑。也就是说,客户端需要知道他们需要将数据写入哪些服务器(例如,使用散列或等价物)。
Redis 集群
有了Redis集群,事情似乎就不一样了。看起来像:
- 高手谈心
- 主控与复制从属对话
这似乎使它更接近于例如etcd
或 Zookeeper
,除非它可能全部在内存中(因此缓存速度更快)。
也就是说,在 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?
客户端需要知道每个键位于哪个节点上。但是,客户端可以将请求发送到任何节点。如果请求的密钥不在该节点上,则该节点将使用密钥的位置信息进行响应。然后客户端可以向正确的节点发送另一个请求。
通常一个体面的客户端库会实现这个逻辑,最终用户不需要知道这些细节。
传统(常规)redis
根据我的阅读 here,当使用 memcached 时:
- 每个客户端都知道所有服务器
- 服务器不相互通信
- 如果客户端希望设置或读取某个键对应的值,客户端的库首先计算该键的哈希值以确定使用哪个服务器。
我的理解是Redis(不是Redis集群)强加了相同的要求和逻辑。也就是说,客户端需要知道他们需要将数据写入哪些服务器(例如,使用散列或等价物)。
Redis 集群
有了Redis集群,事情似乎就不一样了。看起来像:
- 高手谈心
- 主控与复制从属对话
这似乎使它更接近于例如etcd
或 Zookeeper
,除非它可能全部在内存中(因此缓存速度更快)。
也就是说,在 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?
客户端需要知道每个键位于哪个节点上。但是,客户端可以将请求发送到任何节点。如果请求的密钥不在该节点上,则该节点将使用密钥的位置信息进行响应。然后客户端可以向正确的节点发送另一个请求。
通常一个体面的客户端库会实现这个逻辑,最终用户不需要知道这些细节。