草庐IT

Redis模仿MASTER/MASTER?或者是其他东西?

coder 2023-07-17 原文

我在这里阅读了很多帖子并上网冲浪,但也许我问的问题不对。我知道 Redis 目前是主/从,直到 Cluster 可用。但是,我想知道是否有人可以告诉我如何从逻辑上配置 Redis 以满足我的需求(或者它是否不是正确的工具)。

场景:

我们在美国的两端有 2 个站点。我们希望客户能够在每个网站上大量写作。然后我们希望每个客户端也能够在他们的站点上执行读取。但是,我们希望数据能够在 < 50="" 毫秒内从姐妹站点的写入中获得。鉴于我们有足够的带宽。有没有办法配置redis来满足我们的需求呢?我们的写入最大大小约为="" 5k,通常要少得多。要点是即使默认情况下不支持,我怎么能有="" 2="" 个相互同步的主控。="">

最佳答案

汤姆回答的要点是你没有运行任何类型的集群,你只是在写两台服务器。如果您想确保它们之间的一致性,这是一个问题。考虑一下当您的客户端无法写入远程服务器时会发生什么。你撤消对本地的写入吗?当您无法写入远程服务器时,应用程序会发生什么情况?当您无法从本地读取时会发生什么?

第二个问题是约书亚提出的基础物理学问题。对于往返行程,您说的是理论最小值 38 毫秒,在(三个系统的)两端留下理论上的最大处理时间 12 毫秒。我会说期望有点过高,带宽与这种情况下的延迟无关。你可以有一个 10GB 的管道,而这些时间仍然存在。也就是说,在 12 毫秒内在整个大陆传输 5k 也要求很高。您确定您的连接容量可以在 50 毫秒内传输 5k 数据,更不用说 12 毫秒了吗?我一直在整个大陆的私有(private)非使用电路上看到 ping 时间超过 50 毫秒 - 而且 ping 没有传输 5k 数据。

您将如何使两个不相关的服务器保持同步?如果您真的需要整个大陆低于 50 毫秒的延迟,上述理论上的最佳情况意味着您有 12 毫秒的时间来运行同步算法。即使是检查另一台服务器上的数据的查询也意味着您在 50 毫秒窗口之外。如果数据不同步,您将如何解决?考虑到上述时间,我看不出如何在 50 毫秒内同步。

我建议重新审视基本设计要求。具体来说,为什么有这个要求?跨大陆 50 毫秒往返的延迟要求通常是营销或缺乏对细节的关注的标志。我敢打赌,如果您分析需求,您会发现这个 50 毫秒的窗口过多且不必要。如果不是,并且数据同步实际上很重要(可能),那么有人将需要确定编写同步代码的大量额外工作是否值得,或者是否有可能将其保持在 50 毫秒的窗口内。跨大陆低于 50 毫秒延迟的数据同步不是一个简单的问题。

如果不需要同步,为什么不只运行一台服务器呢?您可以将大陆另一端的奴隶用于仅用于恢复目的。当然,这仍然意味着最好的情况是您有 12 毫秒的时间来回获取数据。我不会指望 50ms 往返操作+延迟+跨大陆 5k/10k 数据传输。

关于Redis模仿MASTER/MASTER?或者是其他东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7519971/

有关Redis模仿MASTER/MASTER?或者是其他东西?的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

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

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

  3. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  4. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  5. 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)我

  6. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

    Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

  7. ruby block 并从 block 中返回一些东西 - 2

    我正在使用ruby​​1.8.7。p=lambda{return10;}deflab(block)puts'before'putsblock.callputs'after'endlabp以上代码输出为before10after我将相同的代码重构到这里deflab(&block)puts'before'putsblock.callputs'after'endlab{return10;}现在我收到LocalJumpError:意外返回。对我来说,这两个代码都在做同样的事情。是的,在第一种情况下我传递了一个过程,在第二种情况下我传递了一个block。但是&block将该block转换为pro

  8. ruby - 如何让 GitHub 页面使用 master 分支? - 2

    我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere

  9. ruby-on-rails - ruby数组奇怪的东西(无限数组) - 2

    当我写下面的代码时:x=[1,2,3]x我得到这个输出:[1,2,3,[...]][1,2,3,[...]][1,2,3,[...]]我不应该只得到[1,2,3,[1,2,3]]吗?解释是什么? 最佳答案 这没什么奇怪的。数组的第四个元素就是数组本身,所以当你求第四个元素时,你得到的是数组,当你求第四个元素的第四个元素时,你得到的是数组,当你求第四个元素时,你得到的是数组。第四个元素的第四个元素的第四个元素的元素......你得到了数组。就这么简单。唯一有点不寻常的是Array#to_s检测到这样的递归,而不是进入无限循环,而是返回

  10. ruby - 如果键存在,向散列值添加一些东西? - 2

    我在Ruby中有一个哈希:hash=Hash.new里面有一些键值对,比如说:hash[1]="One"hash[2]="Two"如果散列包含键2,那么我想将“Bananas”添加到它的值中。如果散列没有键2,我想创建一个新的键值对2=>"Bananas"。我知道我可以通过首先使用has_key?检查散列是否具有key2来做到这一点,然后采取相应的行动。但这需要一个if语句和不止一行。那么是否有一种简单、优雅的单行代码可以实现这一目标? 最佳答案 这个有效:hash[2]=(hash[2]||'')+'Bananas'如果您希望所有

随机推荐