【问题标题】: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 可以从从站读取,但它带有一组效果。
- 从属读取引入过时数据读取
- 从多个源读取允许控制读取源。这在处理可用性问题(例如,主服务器已关闭,因此您可以进行从设备读取以保持您的可用性)或延迟问题(例如,使用具有最低读取延迟的节点)时很有用
- 您可以使用从读取来分配服务器负载。虽然这是可能的,但 Redis 需要过大的负载才能看到一些效果
引用http://redis.io/topics/cluster-spec#scaling-reads-using-slave-nodes:
通常从节点会将客户端重定向到权威的主节点
但是,对于给定命令中涉及的哈希槽,客户端可以使用
slaves 以便使用READONLY 命令扩展读取。
READONLY 告诉 Redis Cluster 从节点客户端没问题
读取可能过时的数据并且对运行写入不感兴趣
查询。
Jedis 没有内置支持从主节点以外的其他节点读取数据。 Redisson 和 lettuce 提供对主从读取的内置支持。 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);