草庐IT

java - 我应该从 Redis Cluster slave 读取数据吗?

coder 2023-07-17 原文

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

这是我的用例

  • 大约最高 QPS:1000
  • 有效负载大小:最大 1 MB(压缩后)
  • 集群大小为 3 个主机,每个主机有 2 个从机(相当高规范的机器)
  • 可怕的部分:这个集群的实际网络带宽是 Max 1GB(1 GB 单独用于集群内通话)

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

  • 它(从 slave 读取)会以任何方式帮助我吗?
  • 是否有任何我应该避免的坑洞(任何特殊的服务器端配置)?
  • 狭窄的道路会成为问题吗?
  • 是否有标准的方法(库/客户端)可以正确地做到这一点

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

最佳答案

您对 slave reads 的期望是什么?

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

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

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

Normally slave nodes will redirect clients to the authoritative master for the hash slot involved in a given command, however, clients can use slaves in order to scale reads using the READONLY command.

READONLY tells a Redis Cluster slave node that the client is ok reading possibly stale data and is not interested in running write queries.

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

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

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

关于java - 我应该从 Redis Cluster slave 读取数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498293/

有关java - 我应该从 Redis Cluster slave 读取数据吗?的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐