我已经完成了一个应用程序,并且一直在为它的部署研究托pipe环境。 应用程序在查询上相当沉重,我的应用程序的大多数页面都有几个连接的查询以及大多数表上的触发器。 只要数据库有足够的内存的缓冲池,我猜测性能应该没问题,所以如果我用像Linode的VPS主机,我可以不断升级我的服务器,以便数据库有足够的内存。 我担心的是当我无法获得更多的内存时会发生什么,当数据库没有足够的内存时,性能会受到多大的影响? 我应该看看可用的空闲内存是否像定时炸弹? 数据库pipe理系统是否改变caching技术,以尽可能避免磁盘访问? 本质上我想知道如何聪明的数据库pipe理系统是如何处理分片或复制使用前。
一般来说,程序和程序一样聪明。 DBMS是程序。 所以不知道你使用的是什么DBMS,总的来说,不可能说会发生什么。 所以,对于你的问题唯一正确的答案是近距离投票“不是一个真正的问题”(我注意到有人已经做了)。 但是,我有一些空闲的时间,所以我会写一个关于数据库扩展和性能的总体求解,希望能够回答你应该问的问题。
既然你使用的不是真正的髋关节任何更多的术语“数据库pipe理系统”,我假设你正在使用一个不真正的髋关节任何更多的关系数据库,而且事情变得更加复杂。 我熟悉的引擎(MySQL和PostgreSQL)都有十亿个旋钮来告诉系统使用多less内存 – 各种事物的caching,工作集内存,caching……这一切都非常有趣。 对于工作负载和可用系统资源的适当调整主要是(尽pipe不是完全)减less磁盘I / O,因为通常(尽pipe也不总是)是最慢和最可能导致瓶颈物理系统中的组件。
因此,当你无法进一步增加RAM时,随着更多的查询需要更多的磁盘访问来完成,你的性能将开始受损(希望逐渐地)。 随着数据库大小的增加,性能下降将因磁盘I / O性能下降而恶化。
鉴于横向扩展关系数据库是多么的困难(这不是不可能的 ,但是这比横向扩展前端要困难得多),如果你打算做大规模的事情,你需要一个可以给你的提供者大型机器 – 大量的RAM,但也大量的CPU,磁盘空间和 IOPS。 Linode最大的VM似乎是20GB,这太小了。 AWS的实例有高达70GB左右的内存,这是更好的,但是当你可以得到一个TB(或更多)内存的物理机器…它仍然不是很聪明。
并不是虚拟机对于数据库服务器来说总是错误的,但是在某种程度上,当你超出可用的虚拟机选项时,你需要知道接下来要做什么。 人们越来越常见的是“走碎片,走碎片”的道路,因为如果你要大规模地在世上没有一台物理机器能够拯救你,那就意味着你可以在任何地方运行你喜欢的小玩意儿云。 尽pipe分片是一项很好的工作,但是在你对数据进行build模和交互的方式上,你的select有所限制,所以如果可以的话,我喜欢避免它。 事情是,物理硬件的移动速度相当稳定,而且还有很多空间可供您使用,所以当您拥有一个需要2TB内存和30TB存储的数据库时(大概是最大的规格单一的物理机器,我可以在这个时候购买),技术很可能已经改善到一台机器与4TB的RAM和100TB的存储成本低于你支付2TB的怪物。
(免责声明:我代表不同规模的客户在一家托pipe服务提供商工作,他们代表各种规模的客户进行大量的混合VPS /物理设置,我相信这是我对这个问题的判断)
让我joinWomble – 作为刚刚完成了一个大小为21000gb的非常规数据库项目的人员……你需要了解两个基本问题。
RAM是相对的。 一个适当的数据库的现代服务器有256和更多的千兆字节。 VPS甚至不会在这个世界上显示为“真正的数据库服务器”。
光盘速度也是相对的。 我在家里运行一个系统,你可能会认为它是非常强大的 – 2个SSD,8个Velociraptors只是为了获得适当的数据IO预算,但在我的世界,甚至没有出现 – 我工作的最后一个系统3个存储节点,每个存储节点带有768GB闪存到BUFFER IO,随机IO传输的数据量比顺序传输的要多。
基本上,内存可以比你想象的要多得多,然后你坐下来devise一个IO优化的数据库服务器。 有趣的是,今天虚拟的一件东西,虚拟化解决所有问题的所有东西都将被带入世界,数据库服务器将会受到IO的限制,这对于一个部件来说是一个解决的问题,只是希望得到大量的驱动器或者实际上SSD这些天。 没有什么是免费的,但这是一个不可避免的根本问题,它是一个解决的问题。 这就是你可以从SUPERMICRO获得漂亮的4U机架的主要原因之一。 这是SASdevise的一个原因。 这是SSD非常喜欢数据库的原因之一 – 每秒说IO的速度比硬盘快100倍(或更多)。
VPS只是不去那里;)
数据库pipe理系统是否改变caching技术,以尽可能避免磁盘访问?
不,不是的。 因为这是只有(!)明智的caching技术开始。 更大的世界中的任何适当的数据库(SQL Server,DB2,Oracle)尽可能地使用内存来避免IO。 阅读SQL博客和很多不太经验的人总是抱怨SQL Server开始使用太多的内存 – 当然,因为内存在那里,它尽可能caching。
这也是数据库使用事务日志的一个原因 – 这意味着对数据库的更改不必立即编写,但可以延迟写入,同时将更新保留在TX日志中,从而在发生崩溃时保存。
这又是一个“解决的问题”。 甲骨文有去那里的硬件 – 我们的21000GB设置使用Oracel ExaData,它是最小的安装它们卖。
另一个没有提到的选项是数据库即服务。 如果问题是单个数据库实例内存不足,请考虑使用支持自动扩展吞吐量的数据库服务。 这种types的服务将自动将数据库扩展到多个节点,即使是最大的机器,也不会超出RAM的限制,并以这种方式提供额外的吞吐量或连接。 我知道两个服务,它们提供自动扩展, Xeround (MySQL)和企业数据库 (PostgreSQL)。