Luk*_*uke 4 mysql database mysql-replication scalability mysql-cluster
我有一个需要大量写入的应用程序。该应用程序最适合与调查相比 - 客户创建自定义问题并将其保存到数据库中。大多数请求来自提交这些表单的用户。稍后,我们的客户会对这些提交进行复杂的报告和图表。
确保我们的应用程序服务器 (PHP) 和 Web 服务器 (Nginx) 扩展非常容易,麻烦的是将数据库服务器扩展到多个服务器上。
许多应用程序的读取量更大,因此通常您会有一个主从复制设置,其中所有写入都发送到单个主服务器,但读取分配给从服务器。对我们来说这是行不通的,因为我们大部分时间都在写。
我已经看到提到主-主设置,但这通常会遇到自动递增主键的障碍。解决方案通常是让一台服务器处理奇数,而另一台处理偶数。我想避免这种情况。
在一些类似的问题上,我看到提到 Tungsten Replicator 以及它如何为您提供更多的复制灵活性。这对我有帮助吗?这会给我带来什么 MySQL 的内置复制无法提供的好处?
还有 MySQL Cluster,但这通常会遇到非常大的数据库和复杂查询(连接)的问题。我需要能够运行复杂的报告,所以这可能对我不起作用。
我正在寻找冗余、自动故障转移、分发请求和数据完整性。
是否有其他 RDMS 提供适用于 Web 的更好解决方案?
没有大统一数据库布局这样的东西。如果有自定义问题,那么确实需要自定义表格。否则,您将快速获得来自 thedailywtf.com 的 VARCHAR(128)-with-no-primary-keys 怪异的 200 列单表,这是低效、无法支持的,并且将来会伤害您.
toppledwagon 推荐的分片可能是需要考虑的事情,但首先,请仔细检查您的数据库是否设计合理。如果它没有规范化,那么有一个很好的,最好有测试支持的原因,为什么不是。如果它有数百张桌子,那很可能是错误的。如果它只有一个表,那肯定是错误的。看看可以将问题划分为独立集合的方法。您将在前期花费更多的精力,但系统会因此而更好。
百万行,假设每行有 2k 数据(这对于调查来说似乎是很多字符),是 2GB 的内存。如果您可以将更多硬件投入到您的问题中,也许您可以将数据集保存在 RAM 中?
这就引出了下一个问题:你的绝对负荷是多少?客户每秒请求数,转化为每秒I/O数,分为每秒读取和写入,有多少千兆字节的数据,以什么速度增长?您的负载如何随请求数量而变化?线性?指数级?您不必发布您的数据,只需将其写下来并考虑一下即可。今天是什么,你认为一两年后它会是什么样子。
维基百科说 15k rpm SAS 驱动器将为您提供 175-210 IOps。在 RAID 10 中需要多少个才能满足当前和预计的负载?你的数据集有多大?您需要多少个驱动器来适合您的数据集(可能比满足 IO 要求要少得多)。购买一对(或一打)SSD 是否合理?本地存储是否会正常,或者您是否要将两条 8Gb 光纤链路饱和到一个高端存储子系统?
如果当前您需要 1k IOps,但在 RAID 5 中有三个 10k rpm HDD,那么您的硬件将无法满足您的要求。OTOH 如果您的应用每秒有一个用户请求并带来 32 核 256 GB 的 RAM 野兽,并由企业级存储支持,那么问题很可能不在硬件能力范围内。