草庐IT

caching - 支持分片、复制和低延迟的缓存系统的最佳解决方案

coder 2023-07-17 原文

我们正在部署一个高度动态的网站。在峰值容量下,每分钟处理和更新大约 20,000 个项目。每个项目的大小范围从 1kb 到 500kb。这些项目需要每分钟在缓存中检索、处理和更新。

我们预计前两三个月的用户流量将达到 1000 人。当每个用户登陆网站时,他们可能会请求一些受欢迎的内容,但其他人可能会请求不受欢迎的内容。所有内容都是持久存储中内容的更高级别处理形式。因此,绝对有必要将所有已处理的项目放在低延迟存储中,以提供卓越的用户体验,无论是受欢迎的还是不受欢迎的。

我们分别尝试了 Memcache、Redis 和 Couchbase。

Memcache 非常快,但我们遇到了某些 slab 内存不足和事件项目开始被逐出的问题。

Redis 比 Memcache 相对慢,如果您希望项目持久化,则它非常适合。

但很快我们就意识到我们需要分片和复制。

Couchbase 开箱即用。与 Couchbase 服务器接口(interface)的 Moxi 客户端有其自身的问题,无法处理繁重的并发进程。它会开始丢失集合并时不时地获取。移至与之交互的 Python SDK。它在集群中的一个节点出现故障时表现不佳,它根本无法发现新拓扑。最终在缓存中丢失了一些数据,并且站点在几个宝贵的小时内处于非事件状态。

此时我们意识到没有完美的产品可以满足我们的需求。您必须了解所有技术和您自己的需求。您必须预见您的数据将如何演变并相应地做好准备。最好的解决方案可能是多种技术的混合。但是,将其提出来是希望那里可能还有其他东西。 2012 年即将结束。开箱即用的解决方案以强大的硬件为后盾来满足我们的需求是多么困难啊。

任何想法和有见地的文章的链接将不胜感激。谢谢!

最佳答案

这里有一些关于您上面提到的一些技术的注释。

内存缓存:

Memcached 只是一个缓存系统,不会为您提供任何数据持久化。如果您选择使用 memcached,那么您将需要选择其他类型的持久存储来保存所有数据。 Memcached 也是一个非常简单的缓存系统,不提供复制功能,但它们是不同的项目(如 repcache),已将此类功能添加到 memcached。如果我想使用关系数据库作为我的持久层,我只会使用 memcached。

Redis:

Redis 是一种数据结构服务器,只能用于该目的。 Redis 的缺点是你只能在单个服务器上运行它,如果你想拥有多个 Redis 服务器,那么你需要进行应用程序分片。我见过的大多数 Redis 部署都伴随着另一种数据库技术。

沙发座:

Couchbase 2.0 将把产品变成文档数据库。该产品内置了 memcached 技术,因此您可以开箱即用 memcached,这意味着亚毫秒级延迟。除此之外,您还可以获得复制、跨数据中心复制和查询支持。另请注意,大多数 Couchbase SDK 不使用 moxi,并且 Python SDK 仍处于测试阶段。

可能对您有用的一件事是检查 YCSB 基准测试项目以及一些已经发布的结果。该项目将使您能够很好地了解这些数据库和其他数据库在负载下的性能。然后,一旦找到您喜欢的产品,您就可以查看它们的功能列表,并找出产品具有最适合您开发的应用程序的功能。

此外,如果我关于上述数据库的任何信息不正确,请告诉我。这些项目发展迅速,有时很难跟上。

编辑:我还应该提到 Couchbase 是所列数据库中唯一提供复制、分片和低延迟的数据库。我想 Redis 将允许您拥有一个副本服务器并因此进行复制,但是您所做的任何分片都必须在应用程序层完成。

关于caching - 支持分片、复制和低延迟的缓存系统的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13079333/

有关caching - 支持分片、复制和低延迟的缓存系统的最佳解决方案的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  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 - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  4. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  5. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  6. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  7. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  10. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

随机推荐