目前这些要求还很粗略,但欢迎大家提供任何见解。我们正在探索构建一个每天可以处理 5000 万个数据库查询的系统需要什么 - 特别是从编程语言和数据库选择方面
它不是一个典型的网站,而是一个通过互联网访问的 API/数据库。速度至关重要。应用程序将主要接收这些输入(每个大约几 kb),并且必须通过数据库查找来处理每个输入。只会返回几 kb。
服务器将通过 https/ssl 运行。
已添加:
* 是的,还会有几千个插入。对此尚无了解,但我们可以说每天 10-50,000 个。
* 可能还会有更新,但我们不要使问题复杂化
* 不,它不会在一天中均匀分布。通常,在办公/清醒时间,负载会更高?也许遵循正常曲线 - 尚不知道。
* 数据库大小将为 15 亿个条目。
* 客户端不会发送 SQL 查询,而是发送一个用于检索数据库条目的数字。
答案1
好吧,让我们来看看。
语言:无关紧要。真的。无论如何,您都会谈论集群前端,如果您正确构建它们,那么它几乎可以随心所欲地扩展。话虽如此,显然要远离解释语言(如“普通”PHP),而要使用至少是即时编译的语言(是否有适用于 PHP 的语言 - 不确定)。如果您希望 API 遵守标准,这意味着一些基于 SOAP / REST 的前端 - ASP.NET / C# 可能是不错的选择,因为系统对 Web 服务的支持非常强大。不仅仅是使用它们。您可能还想看看 OData(http://www.odata.org/) 来处理一些事情。我不确定其他系统对 Web 服务托管的支持有多好 - 但您可能需要一些要点,而 MS 正在大力推广 Web 服务。
数据库:看起来您的读取量很大。这很好,因为这意味着您可以在中心辐射型设置中工作,其中一个数据库集中处理所有写入并将更改复制到其他计算机。读取可以分布在这些计算机之间。话虽如此,您在这里谈论的是大规模设置。
现在谈谈负载。您说的峰值可能是每分钟 100,000 到 250,000 个查询(取决于峰值有多高 - 如果在工作开始时有很多人使用它,那么它将非常庞大)。这大约是每秒 4166 个查询。
我个人认为您正处于 SQL Server/Oracle 集群的空间中。无论如何,在 SQL Server 上,您可能会选择:
- 一个中央数据库集群(2 个企业版实例,可能是标准版,但需要更多详细信息 - 根据 SPLA 许可协议)镜像 + 一个小的作为见证)来处理主副本并执行写入。如果您使用主/从设置,则实际上应该是免费的许可。如果您设法使用标准版 - 价格不是那么昂贵。但是您需要一个维护窗口,以便在需要时重新排列索引。小型数据库(镜像见证)可以是 Web 服务器之一。它仅用作“第三投票”,在有疑问的情况下(例如网络部分出现故障)使用哪个数据库服务器。然后它决定关闭哪些服务器。
如果这还不足以处理负载 - 但如果您正确地进行数据库设计并获得一些高端系统(双六核 Opteron),那么它可能会足够。您可以将一个单元的整个硬件装入 2 个机架单元高的笼子中 - Supermicro 有一些可以容纳 24 个 2.5 英寸硬盘的空间。无需使用 SAS - WD Velociraptor 应该更高效,并获得快速 SSD 和适配的 RAID 控制器,您将获得 SSD 作为读取缓冲区 ;) 应该足以处理您的负载。
如果这在性能方面效果不够好,你基本上需要更多的关注。
- 数据库的复制副本集群。您可以在此处使用 Web 版本,它接受作为复制目标,并且使用起来非常便宜。它们不会获得任何更新/插入,并且是只读副本。您可以轻松地在这些副本前面使用负载平衡器(Windows 开箱即用)。
类似的设置应该可以实现 - 嗯...不确定。Oracle - 是的。MySQL - 有人可以介入并回答。
答案2
您的每秒平均查询率为 600。您对流量模式了解多少?所有查询都是在午餐时间进入的吗?还是仅在特定时区的办公时间内进入?)假设所有查询均匀分布在 8 小时的工作日内,您将计划每秒 2k 个查询的峰值。
数据库?如果必须的话。简单的键/值存储将具有更高的性能。1.5B 条记录(每条 4kB)是 6 TB。尝试以下架构:
5 个前端与一组重复的数据存储进行通信。也许可以使用 40 台服务器,每台存储 300 GB。这意味着您可以失去任何一台主机,但仍然可以继续提供服务。如果您大多数时候都要提供新颖的结果,我会将其增加一倍到 80 台服务器:您将为每个查询至少进行一次磁盘搜索,而且我不会如此乐观地希望每秒持续进行 50 次搜索。
编程语言无关紧要。
答案3
构建一个每天可以处理 5000 万次查询的数据库系统并非难事。借助大型 Cassandra 服务器,我们能够实现每核每秒约 100 次读取和每核每秒约 25 次写入。根据您的数字 50M,我建议使用 2 个 8 核系统。为了获得性能数据,您需要调整操作系统、磁盘设置和内存规格。
需要对每个列族进行内存预加载,并进行布局(无模式)调整。
大型关系集群领域中的其他选项不具备可扩展性,而且成本会高得离谱。
答案4
由于您没有提供很多细节,因此我也会简短地介绍一下。语言完全由您决定,尽管 C Sharp / ASP.NET 在这里很合适。我会使用 noSQL 数据库,例如 cassandra:http://en.wikipedia.org/wiki/Cassandra_%28database%29
最后,根据读取次数与写入次数,请务必相应地规划您的硬件(特别是您的驱动器速度)。