写入密集型应用程序的数据库可扩展性

写入密集型应用程序的数据库可扩展性

我有一个需要大量编写的应用程序。该应用程序最适合用来做调查问卷 - 客户创建自定义问卷并将其保存到数据库中。大多数请求都来自提交这些表单的用户。之后,我们的客户会根据这些提交的内容制作复杂的报告和图表。

确保我们的应用程序服务器(PHP)和 Web 服务器(Nginx)扩展非常容易,问题在于将数据库服务器扩展到多台服务器上。

许多应用程序的读取量较大,因此通常需要设置主从复制,所有写入都发送到单个主服务器,但读取则分发到从服务器。对于我们来说,这行不通,因为我们大部分时间都在执行写入操作。

我曾见过有人提到主主设置,但这通常会遇到自动递增主键的问题。解决方案通常是让一台服务器处理奇数,另一台服务器处理偶数。我想避免这种情况。

在一些类似的问题中,我看到有人提到 Tungsten Replicator,以及它如何为您提供更多的复制灵活性。这对我有一点帮助吗?这会给我带来哪些 MySQL 内置复制无法提供的好处?

还有 MySQL Cluster,但这通常会在处理非常大的数据库和复杂查询(连接)时遇到问题。我需要能够运行复杂的报告,所以这可能不适合我。

我正在寻找冗余、自动故障转移、分配请求和数据完整性。

是否有其他 RDMS 可以提供适合网络的更好的解决方案?

答案1

不存在所谓的“大统一数据库布局”。如果有自定义问卷,那么确实需要自定义表格。否则,您将很快得到一个由 200 列 VARCHAR(128) 组成的、没有主键的怪异表格,该表格来自 thedailywtf.com,效率低下、无法支持,并且会在未来对您造成伤害。

toppledwagon 建议的分片可能是值得考虑的事情,但首先,请仔细检查您的数据库是否设计合理。如果数据库没有规范化,那么最好有测试支持,给出一个很好的理由来说明为什么没有规范化。如果它有数百个表,那可能是错误的。如果它只有一个表,那肯定是错误的。看看你可以将问题分成独立集的方法。你会在前期花费更多精力,但系统会因此变得更好。

假设每行有 2k 个数据(对于调查来说,这似乎很多字符),那么一百万行数据需要 2GB 内存。如果您能为您的问题投入更多硬件,也许您就能将数据集保存在 RAM 中?

这就引出了下一个问题:您的负载绝对数字是多少?每秒的客户请求数,转换为每秒的 I/O 数,分为每秒的读取和写入,有多少 GB 的数据,增长率是多少?您的负载如何随请求数而变化?线性增长?指数增长?您不必发布您的数据,只需将其写下来并思考即可。今天的情况如何,您认为一两年后会如何。

维基百科表示 15k rpm SAS 驱动器将为您提供 175-210 IOps。您需要多少个 RAID 10 才能满足当前和预计的负载?您的数据集有多大?您需要多少个驱动器来容纳您的数据集(可能比满足 IO 要求的驱动器少很多)。购买一对(或十几个)SSD 是否合理?本地存储是否就够了,还是您要将两个 8Gb 光纤链路连接到高端存储子系统?

如果您目前需要 1k IOps,但在 RAID 5 中拥有三个 10k rpm 硬盘,那么您的硬件就无法满足您的要求。另一方面,如果您的应用程序每秒有一个用户请求,并且让 32 核 256 GB RAM 的野兽(由企业级存储支持)无法运行,那么问题很可能不在硬件功能上。

答案2

主-主设置,但这通常会遇到自动递增主键的问题

不 - 你只需设置自动增加-增加自动增加偏移量避免碰撞

解决方案通常是让一台服务器处理奇数,另一台服务器处理偶数。我想避免这种情况。

为什么?代理键本质上与它们索引的数据无关。为这些值赋予意义是非常危险

快速浏览一下您提供的 Tungsten 链接,并没有发现太多关于它的功能的信息 - 它确实存在一些不准确之处(例如“您可以进行多主复制,这比使用 MySQL 本机复制所能做的要多得多”)。在同一段中,它说它无法处理冲突。我对这款产品的实用性没有信心。

假设主-主复制(无论是否联合来限制复制)不符合您的要求(但您需要重新审视对自动增量字段类型的想法),那么您可以使用 mysqlproxy 在本机集群之间分片数据或使用 nosql 数据库。

答案3

这听起来是个好例子分片。如果一项调查中的数据不需要立即访问另一项调查中的数据,那么对数据进行分片将很容易。您将设置一个数据库,该数据库基本上具有指向调查数据库的用户 ID 密钥。然后,您可以设置多个调查数据库。希望您也选择将它们设置为复制元组。您的应用程序需要进行一些重新设计。

运行报告并在软件中进行连接。如果这也是一种选择,那么分片就是最佳选择。

相关内容