草庐IT

java - 如何在Jedis中启用负载平衡?

coder 2023-07-18 原文

我想将Jedis用于Redis集群或仅用于Redis服务器。我想知道如何启用Round Robin的读取操作。没关系,我将Redis集群或Redis服务器与Sentinel一起使用。我将有几个主人,每个主人将有自己的奴隶。如何在一个特定的哈希槽(或一个特定的分片)的所有从属之间分配读取操作?

最佳答案

在分布式系统中,负载平衡是一个非常重要的问题。一个考虑因素是定义负载平衡的含义。

如果仅考虑不均匀负载分布的内在因素,则可以从以下三个方面来检查IMKVS中的负载平衡机制:

基于密钥受欢迎程度的

  • 负载平衡:调用特定项目的频率似乎与IMKVS节点和系统的性能有关。
  • 基于密钥分发的
  • 负载均衡:在许多系统中,可用节点中密钥的分发本质上对负载均衡构成了挑战。将问题与先前的问题以及与基础节点的能力孤立地进行检查可能会很冒险,但是,即使仅基于统计信息,也要在实现方面简单得多。
  • 基于查询量的
  • 负载平衡:在某些负载平衡部署中,从IMKVS部署并发因此从节点并发请求的密钥数量似乎是一个重要指标。

  • 综上所述,调查负载平衡问题至少需要检查以下因素:
  • 传入查询的频率
  • 传入查询量
  • 密钥在系统中的分配方式
  • 密钥长度和值长度

  • 实验

    根据我的实验:
  • 获取一个特定键的响应时间(RT)几乎不变,因为
    节点中更改的键数。
  • RT增长迅速,密钥长度增加。
  • 值量之间的响应时间差为
    无关紧要,因此值的大小不会影响RT。
  • RT的增长率与客户 call 次数成正比。

  • 密钥的分布在负载均衡因素中起着重要作用。因此,在上一个实验中,我的目的是观察Redis集群中键从一个节点迁移到另一个节点后响应时间如何变化。为了我的实验需要,我在一个主节点(M1)节点中加载了33000,在另一个主节点(M2)中加载了03000。我在M1中进行了4个并发客户端调用,并在时间7开始迁移,并在时间36停止。



    我观察到4个并发客户端调用的RT平均为25毫秒。在迁移过程的开始,响应时间突然增加,而在过程结束时,我们注意到减少了9ms的数量级。这种改进表明速度提高了3倍。尖峰是由于
    迁移命令的开销。该命令实际上执行DUMP + DEL
    源实例中的操作,目标实例中的RESTORE操作。因此,很明显,随着密钥从一个负载较重的节点迁移到
    另一个响应时间大大减少了。

    从上面可以明显看出,随着节点之间读取请求的分布,不确定Redis中的负载分配(平衡),因为结果表明:
  • 因素(例如关键受欢迎程度和值(value)量)似乎较小
    效果
  • 密钥分布和密钥长度是造成负载的因素
    平衡问题并影响集群的实时响应
  • 可以通过将密钥从一个节点迁移到另一个节点来减少
  • RT,
    这样集群中的每个节点都具有相同数量的键

  • 因此,您需要创建一种机制结合所有这些因素。您可以从在节点之间分配密钥的算法开始。

    该算法的步骤如下:
  • 寻找大师的人群
  • 获取他们持有的密钥总数
  • 为每个主节点存储主机名,端口和密钥数
  • 计算每个主节点必须持有的密钥,以便平衡密钥的分布(群集的总密钥/主节点的数量)
  • 查找必须使用或提供密钥的主节点,以及它们必须提供/采用的密钥总数
  • 根据主机是接收还是分发密钥,将主机表征为源或目标节点
  • 开始从源节点迁移到目标节点,首先是哈希槽,然后是相关密钥,然后进行迭代,直到所有主节点都具有相同数量的密钥

  • 然后,您可以创建下一个算法,以创建提供LB以便最小化RT的机制。

    注意:我将在论文中添加半个月的更多信息,以及我的算法实现与Github的链接。

    链接到论文:
    https://www.researchgate.net/publication/309732099_Load_Balancing_in_In-Memory_Key-Value_Stores_for_Response_Time_Minimization

    关于java - 如何在Jedis中启用负载平衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40311125/

    有关java - 如何在Jedis中启用负载平衡?的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    4. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    5. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    6. ruby - 匹配未转义的平衡定界符对 - 2

      如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

    7. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

      我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

    8. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

      我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

    9. 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/

    10. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

      这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

    随机推荐