群集,分片或简单分区/复制

alb*_*osh 10 mysql database-design partitioning sharding cluster-computing

关于这个问题,我需要您的专家建议.问题是我们几天前创建了一个Facebook应用程序,幸运的是它得到了大量的病毒式传播,问题是我们的数据库开始变得非常满(一些表现在有超过2500万行)并且它达到了这一点该应用程序刚停止工作,因为有一个成千上万的写入队列.

我需要实现一个快速扩展这个应用程序的解决方案,但是我不确定我是否应该进行Sharding或Clustering,因为我不确定每个人的专业版和内容是什么,我正在考虑进行分区/复制方法,但我认为如果负载在写入上,这没有帮助?

irc*_*ell 1

嗯,要理解这一点,您需要了解 MySQL 如何处理集群。有两种主要方法可以做到这一点。您可以进行主主复制,或 NDB(网络数据库)集群。

主-主复制对写入负载没有帮助,因为两个主服务器都需要重放发出的每个写入(因此您不会获得任何结果)。

当且仅当您主要进行主键查找时,NDB 集群才会非常适合您(因为只有使用 PK 查找,NDB 才能比常规主主设置更有效地运行)。所有数据都会自动在许多服务器之间分区。就像我说的,只有当您的绝大多数查询只不过是 PK 查找时,我才会考虑这一点。


这样就剩下两个选择。分片并远离 MySQL。

分片是处理这种情况的一个不错的选择。然而,要充分利用分片,应用程序需要充分了解它。因此,您需要返回并重写所有数据库访问代码,以便为每个查询选择正确的服务器。并且根据您的系统当前的设置方式,可能无法有效地进行分片......

但我认为最适合您需求的另一个选择是放弃 MySQL。由于无论如何您都需要重写数据库访问代码,因此切换到 NoSQL 数据库应该不会太难(同样,取决于您当前的设置)。市面上有大量的 NoSQL 服务器,但我喜欢MongoDB。它应该能够承受您的写入负载而无需担心。请注意,您确实需要 64 位服务器才能正确使用它(根据您的数据量)。

  • 抱歉...“最佳”选择是完全放弃关系数据库?当你对他存储的内容一无所知时,你怎么能做出这样的推荐呢? (18认同)