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

may*_*ats 5 java redis jedis redisson redis-cluster

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

这是我的用例

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

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

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

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

mp9*_*1de 6

你对奴隶读书的期望是什么?

从奴隶那里读取它是可能的和通常的模式,但它带有一组效果.

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

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

通常,从节点会将客户端重定向到给定命令中涉及的散列槽的权威主节点,但是,客户端可以使用从属节点来使用该READONLY命令扩展读取.

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

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

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

一个好的经验法则是使用从属设备来获取可用性,而不是使用性能.


Nik*_*rov 5

像 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);
Run Code Online (Sandbox Code Playgroud)