我不知道从哪里开始制定数据库扩展/优化策略。在阅读了以下文章后highscalability.com 的 Facebook 架构文章, 和这篇 Twitter 架构文章,我不确定他们说的 RAM 是否是指仅有的memcached 或者别的什么。
我的问题是:
- 整个 SQL 数据库可以存储在 RAM 中吗?我正在考虑分片和所有这些...只是学习(不是来自数据库背景)。
- SQL 数据库索引是否存储在 RAM 中?
- NOSQL 数据库存储在 RAM 中吗?可以吗?
- 或者 Memcached 是将内容存储在 RAM 中的标准?那么 99% 的请求都是从 RAM(Memcached)读取的,而数据库(磁盘)是备份?
只是寻找正确方向的点。
答案1
将数据库存储在 RAM 中的问题在于,RAM 有一个坏习惯,就是断电后会忘记所有东西,也就是说执着的也就是说,正确使用高流量网站的内存对于获得良好的性能是绝对必要的,因为您可以从中获得极好的 IO 速率,如果您的负载很高,这非常有用。
从内存来看,MySQL 有一个 MEMORY 表类型,它将数据存储在 RAM 中,而不是磁盘上(InnoDB 和 MyISAM 会这样做)。创造性地使用 RAMdisk 还可以让任何数据库使用 RAM 作为磁盘支持,但如上所述,这可能不是您想要做的。正如您所想到的,更有用的应用程序是使用 RAM 作为高性能缓存,使用 Memcached 之类的东西。我相信您知道,这提供了一个快速的键/值存储,但要求应用程序知道先在那里查找,然后在没有找到任何内容时返回到持久数据库。需要在整个关系数据库中具有高 IO 速率的站点可以选择将整个数据库转储到类似Fusion IO 驱动器。这不会像 RAM 那样快,但可以选择持久性,因此可以成为有用的中间立场。我相信 SO 在 Fusion IO 驱动器上运行其数据库(请参阅这篇关于他们发现的博客文章。
因此,总而言之,高容量网站会将其数据存储在持久存储(旋转磁盘、SSD 等)上,然后设置一系列更高性能的缓存层,以减少数据库的负载(通常是读取负载)。写入通常直接进入数据库,但如果有大量写入,则可以使用本地化写入缓存。
回答您的具体问题:
- 整个 SQL 数据库可以存储在 RAM 中,但这不一定是内置的,也不一定是您想要的。如果您想要基于 RAM 的数据库,那么可能有更好的选择。
- SQL 索引将由您使用的 SQL 引擎管理。不同的 SQL 服务器(MSSQL、MySQL、Postgres 等)可能具有不同的策略和调整选项来确定何时将索引转储到 RAM 中,具体取决于许多因素,例如索引的大小、索引被访问的频率、您有多少 RAM。
- 我不是 NOSQL 专家,所以在这里只能随便回答。但是,你能说 memcached 是基于内存的 NOSQL 数据库吗?也许吧。
- Memcached 的使用相当广泛,并且得到了各种库和软件堆栈的大量支持。
答案2
我不知道 Twitter 是如何具体做到这一点的,但可以回答你的一般问题:
X 是否可以存储在 RAM 中的问题:是的,如果数据库系统本身尚未将结构缓存在 RAM 中,那么想象一下 RAM 磁盘作为文件系统。那里的一切都在内存中。您从这些系统获得了巨大的带宽。缺点是:猜猜当有人拔掉插头时会发生什么……您的所有内存都会丢失。当然有解决方案,例如定期进行快照/将内容写入真实硬盘,或者您可以使用持久内存(不是闪存,它太慢且有限,但有(非常昂贵的)解决方案,如 MRAM。
答案3
是的,不过我认为 Twitter 使用多种技术,而不仅仅是 RDBMS。例如,MySQL 的引擎仅在内存中运行(如果我没记错的话,是集群 NDB)。
经常如此。
不是按定义,但有些是可以的。对于任何数据库来说,最好是最大限度地利用 RAM 并尽量减少缓慢的磁盘访问。
Memcached 无疑是许多数据库后端的一个常见前端缓存。我给了关于使用 memcached 和 Amazon simpleDB 的演示几年前可能有用,也可能没用。
在数据库前面使用 memcached 策略可能会非常有益,但你可以使用集群和协议兼容的解决方案,例如记忆库也。
答案4
是的,所有 SQL 数据库都可以存储在 RAM 中,这是此类高性能网站上非常标准的方法。
是的,SQL 索引很可能也存储在 RAM 中。
您可以将任何东西存储在 RAM 中,它只是一个存储区域。您必须考虑的是存储大小,以及哪些其他内容需要访问 RAM 以确保有足够的空间。