我应该从Redis群集奴隶中读取吗?

时间:2016-05-28 11:15:58

标签: java redis jedis redis-cluster redisson

我们有一个用于Redis的集群配置用作缓存。 现在由于写入master和从slave(与其他数据库)读取的正常模式,我们正在尝试使用Redis集群执行相同的操作。
经过一番调查后,我们发现redis,jedis和Spring Data Redis都没有支持Redis客户端(在java中)。 我们似乎找到了一些解决方法,但它看起来很难看,现在我在想它是否值得呢?

这是我的用例

  • 最高QPS:1000
  • 有效载荷大小:最大1 MB(压缩后)
  • 群集大小3掌握每个2个从属(相当高规格的机器)
  • Cringe part:此群集的实际网络带宽为1GB(分别为群集内通话时为1 GB)

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

  • 它(从奴隶那里读书)会以任何方式帮助我吗?
  • 我应该避免任何坑洞(任何特殊的服务器端配置)?
  • 狭窄的道路会成为一个问题吗?
  • 是否有正确执行此操作的标准方式(库/客户端)

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

2 个答案:

答案 0 :(得分:6)

您对奴隶读物的期望是什么?

可以从奴隶那里读取usual pattern,但它带有一组效果。

  1. 从属读取引入陈旧的数据读取
  2. 从多个源读取允许控制读取源。这在处理可用性问题时非常有用(例如,主服务器已关闭,因此您可以进行从属读取以维护可用性)或延迟问题(例如,使用读取延迟最低的节点)
  3. 您可以使用从属读取来分配服务器负载。虽然这是可能的,但Redis需要过多的负载才能看到一些效果
  4. 引自http://redis.io/topics/cluster-spec#scaling-reads-using-slave-nodes

      

    通常,从节点会将客户端重定向到权威主节点   但是,对于给定命令中涉及的散列槽,客户端可以使用   奴隶以便使用READONLY命令扩展读取。

         

    READONLY告诉Redis群集从属节点客户端没问题   读取可能过时的数据并且对运行写入不感兴趣   查询。

    Jedis没有内置支持从主节点以外的其他节点读取。 Redissonlettuce为Master和Slave读取提供内置支持。 Redisson在内部使用平衡器(随机,循环,加权)来分配操作,生菜提供偏好驱动(仅限主,主要首选,从属,最近)方法。

    Spring Data Redis建立在Jedis和生菜之上,但不提供从奴隶那里读取的通用功能。

    一个好的经验法则是使用奴隶来获取可用性,而不是性能。

答案 1 :(得分:3)

  

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);