我应该从 Redis Cluster slave 读取数据吗?

Should I read from a Redis Cluster slave?

我们有一个用作缓存的 Redis 集群配置。 现在,由于写入主从(与其他数据库)的正常模式,我们正在尝试对 Redis 集群做同样的事情。
经过一些调查,我们发现 none 的 Redis 客户端(在 java 中),如 redisson、jedis 和 Spring Data Redis 支持此功能。 我们似乎已经找到了一些解决方法,但它看起来很难看,现在我在想它是否值得?

这是我的用例

考虑到这一点,我有以下问题:

非常感谢任何帮助(博客、案例研究、建议)。

你对slave reads的期望是什么?

有可能 usual pattern 从奴隶读取数据,但它具有一系列效果。

  1. 从属读取引入陈旧数据读取
  2. 从多个来源读取允许控制读取源。这在处理可用性问题(例如,主服务器已关闭,因此您可以通过从属读取来维持可用性)或延迟问题(例如,使用延迟最低的节点进行读取)时很有用
  3. 您可以使用从读来分配服务器负载。虽然这是可能的,但 Redis 需要过载才能看到一些效果

引用自http://redis.io/topics/cluster-spec#scaling-reads-using-slave-nodes

Normally slave nodes will redirect clients to the authoritative master for the hash slot involved in a given command, however, clients can use slaves in order to scale reads using the READONLY command.

READONLY tells a Redis Cluster slave node that the client is ok reading possibly stale data and is not interested in running write queries.

Jedis 没有内置支持从主节点以外的其他节点读取数据。 Redisson and lettuce 提供对 Master 和 Slave 读取的内置支持。 Redisson 在内部使用平衡器(随机、循环、加权)来分配操作,lettuce 提供了一种偏好驱动(Master only、Master preferred、slave、nearest)的方法。

Spring Data Redis 建立在 Jedis 和 lettuce 之上,但不提供从 slave 读取的通用功能。

一个好的经验法则是使用从站是为了可用性,而不是为了性能。

none of the Redis clients (in java) like redisson support this

Redisson 提供可用于集群模式配置的 readMode 设置。可用值为:

SLAVE - 从从节点读取,
MASTER - 从主节点读取,
MASTER_SLAVE - 从主从节点读取

您需要使用 SLAVE 值。

配置示例:

Config config = new Config();
config.useClusterServers()
      .setReadMode(ReadMode.SLAVE)
      .addNodeAddress(...);

Redisson redisson = Redisson.create(config);