我应该从 Redis Cluster slave 读取数据吗?
Should I read from a Redis Cluster slave?
我们有一个用作缓存的 Redis 集群配置。
现在,由于写入主从(与其他数据库)的正常模式,我们正在尝试对 Redis 集群做同样的事情。
经过一些调查,我们发现 none 的 Redis 客户端(在 java 中),如 redisson、jedis 和 Spring Data Redis 支持此功能。
我们似乎已经找到了一些解决方法,但它看起来很难看,现在我在想它是否值得?
这是我的用例
- 大约最高 QPS:1000
- 有效负载大小:最大 1 MB(压缩后)
- 集群大小 3 master,每个 master 有 2 个 slaves(相当高规格的机器)
- 可怕的部分:这个集群的实际网络带宽是最大 1GB(1 GB 单独用于集群内通话)
考虑到这一点,我有以下问题:
- 它(从 slave 读取)会以任何方式帮助我吗?
- 是否有任何我应该避免的坑洞(任何特殊的服务器端配置)?
- 窄路会出问题吗?
- 是否有标准方法(library/client)可以正确地做到这一点
非常感谢任何帮助(博客、案例研究、建议)。
你对slave reads的期望是什么?
有可能 usual pattern 从奴隶读取数据,但它具有一系列效果。
- 从属读取引入陈旧数据读取
- 从多个来源读取允许控制读取源。这在处理可用性问题(例如,主服务器已关闭,因此您可以通过从属读取来维持可用性)或延迟问题(例如,使用延迟最低的节点进行读取)时很有用
- 您可以使用从读来分配服务器负载。虽然这是可能的,但 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);
我们有一个用作缓存的 Redis 集群配置。
现在,由于写入主从(与其他数据库)的正常模式,我们正在尝试对 Redis 集群做同样的事情。
经过一些调查,我们发现 none 的 Redis 客户端(在 java 中),如 redisson、jedis 和 Spring Data Redis 支持此功能。
我们似乎已经找到了一些解决方法,但它看起来很难看,现在我在想它是否值得?
这是我的用例
- 大约最高 QPS:1000
- 有效负载大小:最大 1 MB(压缩后)
- 集群大小 3 master,每个 master 有 2 个 slaves(相当高规格的机器)
- 可怕的部分:这个集群的实际网络带宽是最大 1GB(1 GB 单独用于集群内通话)
考虑到这一点,我有以下问题:
- 它(从 slave 读取)会以任何方式帮助我吗?
- 是否有任何我应该避免的坑洞(任何特殊的服务器端配置)?
- 窄路会出问题吗?
- 是否有标准方法(library/client)可以正确地做到这一点
非常感谢任何帮助(博客、案例研究、建议)。
你对slave reads的期望是什么?
有可能 usual pattern 从奴隶读取数据,但它具有一系列效果。
- 从属读取引入陈旧数据读取
- 从多个来源读取允许控制读取源。这在处理可用性问题(例如,主服务器已关闭,因此您可以通过从属读取来维持可用性)或延迟问题(例如,使用延迟最低的节点进行读取)时很有用
- 您可以使用从读来分配服务器负载。虽然这是可能的,但 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);