【问题标题】:Should I read from a Redis Cluster slave?我应该从 Redis 集群从站读取吗?
【发布时间】:2016-09-26 16:01:42
【问题描述】:

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

这是我的用例

  • 大约最高 QPS:1000
  • 有效负载大小:最大 1 MB(压缩后)
  • 集群大小为 3 个主节点,每个主节点有 2 个从节点(相当高规格的机器)
  • Cring 部分:此集群的实际网络带宽最大为 1GB(集群内通话单独为 1GB)

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

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

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

【问题讨论】:

    标签: java redis jedis redis-cluster redisson


    【解决方案1】:

    您对从属读取的期望是什么?

    usual pattern 可以从从站读取,但它带有一组效果。

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

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

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

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

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

    Spring Data Redis 构建在 Jedis 和 lettuce 之上,但不提供从 slave 读取的通用特性。

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

    【讨论】:

      【解决方案2】:

      没有像 redisson 这样的 Redis 客户端(在 java 中)支持这个

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

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

      您需要使用SLAVE 值。

      配置示例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        相关资源
        最近更新 更多