我应该从 Redis 集群的从节点读取数据吗?

9
我们有一个用作缓存的Redis集群配置。 由于写入主节点并从从节点(与其他数据库一起)读取的正常模式,现在我们正试图使用Redis集群进行同样的操作。
经过一些调查,我们发现没有Redis客户端(在Java中)支持这种情况,例如redisson、jedis和Spring Data Redis。 我们似乎已经找到了一些解决方法,但它看起来不太好,现在我在思考是否值得这么做?
以下是我的用例:
  • 最大QPS:约1000
  • 有效载荷大小:巨大1 MB max(经过压缩后)
  • 集群规模为3个主节点,每个节点都有2个从节点(相当高的规格机器)
  • 令人不爽的部分:实际网络带宽到该集群的最大值为1GB(独立用于集群内通信的1 GB)
考虑到上述情况,我有以下问题:
  • 从从节点中读取会对我有任何帮助吗?
  • 有什么坑需要避免(任何特殊的服务器端配置)?
  • 狭窄的路径会成为问题吗?
  • 有没有标准的方式(库/客户端)可以正确地执行此操作
非常感谢任何帮助(博客、案例研究、建议)。
2个回答

11

你对从节点读取有什么期望?

从节点读取是一种常见模式,但会带来一些影响。

  1. 从节点读取会引入过期数据读取
  2. 从多个来源读取允许控制读取来源。这在处理可用性问题(例如主节点宕机,因此可以进行从节点读取以保持可用性)或延迟问题(例如使用延迟最低的节点进行读取)时非常有用
  3. 你可以使用从节点读取来分发服务器负载。虽然这是可能的,但Redis需要承受过高的负载才能看到一些效果

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

通常情况下,从节点会将客户端重定向到涉及给定命令的哈希槽的权威主节点,但是,客户端可以使用READONLY命令来扩展读取从节点。 READONLY告诉Redis Cluster从节点,客户端可以读取可能过时的数据,并且不想运行写查询。
Jedis没有内置支持从主节点以外的节点读取数据。Redissonlettuce提供了Master和Slave读取的内置支持。Redisson在内部使用负载均衡器(随机、轮询、加权)来分发操作,lettuce提供了一种偏好驱动(仅主节点、主节点优先、从节点、最近节点)的方法。
Spring Data Redis建立在Jedis和lettuce之上,但不提供从从节点读取数据的通用功能。
一个好的经验法则是将从节点用于可用性而不是性能。

5

没有 Redis 客户端(Java 版)像 Redisson 一样支持此功能。

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

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

您需要使用 SLAVE 值。

配置示例:

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

Redisson redisson = Redisson.create(config);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接