你需要知道的4个数据库扩展解决方案
你已经用一个直观的、用户友好的用户界面启动了你的应用程序。但是,如果你的应用程序遇到负载问题,这将使你的终端客户在使用它时感到沮丧。很有可能问题不在应用程序内部,而是在数据库。根据一项调查,38%的数据库专业人员报告说数据库停机是让他们夜不能寐的重要问题。停机可能是由于任何数量的问题,包括不当的数据库配置、不良的负载处理、数据库查询超时,等等。在这篇文章中,我们将讨论你是否需要扩展你的数据库以及如何解决数据库的可扩展性问题。让我们从最明显的问题开始--为什么要进行数据库扩展?
为什么要扩展你的数据库?
你的应用程序的数据库应该能够扩展或收缩其计算资源,以配合应用程序的动态需求。例如,你的数据库应该能够扩大规模以处理突然激增的流量。另外,当不在状态时,你的数据库应该能够收缩以节省资源。确保良好的数据库扩展性的最好方法之一是根据你的要求选择合适的数据库。对于物理服务器,数据库的扩展和收缩可能是一个令人头痛的问题。云数据库解决方案可以做到这一点。
数据库的可扩展性是一项资源密集型和挑战性的任务。因此,在开始项目之前,你需要确保你的产品需要一个可扩展的数据库。首先,确定你的产品在可预见的未来是否会出现流量激增的情况。如果没有,你仍然可以用你的旧数据库来做。
如果你的企业是一个初创企业,那么在获取可扩展数据库方面投入资源是没有意义的。你可以在你的应用程序达到临界质量并期待流量的良好激增时再这样做。
下面是一些需要数据库可扩展性的情况:
你的应用已经过时了,你想迁移到云系统上
你的应用程序经历高负荷
你的应用程序需要符合法规的要求
你希望有一个平衡的工作负载,可以为世界各地的用户提供服务
数据库扩展解决方案
1. 缓存数据库查询
提高数据库负载处理能力的最直接的方法之一是缓存数据库查询。通常情况下,一个应用程序只有少数几个查询构成了大部分的请求。你可以对这些查询进行缓存,这样在将来,这些请求就可以从缓存中读取。这样就不需要每次都从数据库中获取数据了。用户很快就能得到所需的数据。这样一来,缓存有助于提高数据库的性能。
亚马逊ElastiCache是一种缓存服务,可以帮助你缓存数据库。有了Amazon ElastiCache,你可以通过内存缓存进行扩展。Amazon ElastiCache支持实时用例。以下是Amazon ElastiCache的理想用例:
游戏排行榜
分析
流媒体
2. 数据库索引
扩展数据库并不总是意味着在现有设置中增加更多的数据库。有时,通过优化当前的数据库,你可以在一定程度上进行扩展。这就是数据库索引发挥作用的地方。使用数据库索引技术,你正在构建数据,以提高从数据库表中检索数据的速度。
3. 数据复制

数据复制是一种策略,用于制作相同的数据库副本以创建额外的机器。复制策略有利于解决峰值负载问题。由于数据被复制,查询可以分散在多个数据库中,这反过来会减少单个数据库的负载。此外,万一存储设备发生故障,复制的数据就会派上用场,系统仍然可以全面运作。
4. 分片
扩展数据库的主要瓶颈之一是设计不当的数据库。为了确保你不面临这个瓶颈,必须从为正确的业务应用选择正确的数据库开始。比如:
一家银行应该选择关系型DBMS,以确保其结构化数据的ACID(原子性、一致性、隔离性、耐久性)。
一个在线多人游戏可以依靠键值无SQL数据库
无论你选择哪个数据库,都要确保它有分片功能。分片是指将数据库的一个大块分割成较小的数据块,称为分片,可以跨多个数据库存储。有两种类型的分片:
水平分片
垂直分片
当你的数据库查询返回一个数据行的子集时,水平分片证明是有效的。这些行通常被分组。例如,数据被过滤的查询是基于短的日期范围。
当你的数据库查询返回数据的列的子集时,垂直分片证明是有效的。例如,如果一些数据库查询只要求名字,而另一些只想要城市,那么垂直分片在这种情况下证明是有效的。
分片有两个主要优势:
系统的整体存储容量与数据库分片的数量成正比。
如果一个分片脱机,你仍然可以依靠分片池来检索和存储你的数据。当一个分片脱机时,目前只有整体数据集的一部分不可用。因此,它不会对系统的运行产生重大影响。
结论
数据库是任何应用程序的一个重要元素。如果你想扩展你的应用程序,你不能不扩展数据库。幸运的是,由于近年来的技术进步,我们拥有所有需要的工具,使扩展过程无缝和毫不费力。人们可以利用云服务提供商,如Azure、AWS或谷歌云来扩展他们的应用程序。然而,在进入可扩展性之前,人们需要考虑某些因素。我希望这篇文章能让你很好地理解与扩展相关的基本问题以及如何解决它们。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我主要使用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
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
在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',
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用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
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
我正在尝试使用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_