聚类、分片或简单的分区/复制

17
我们创建了一个Facebook应用,并获得了很高的流行度。问题是我们的数据库开始变得非常满(某些表现在已经有超过2500万行)。它已经到达了这样的程度,应用程序因为有数千个写操作排队等待而停止工作。 我需要实现一个快速扩展该应用程序的解决方案,但我不确定是否应该追求分片或群集,因为我不知道每个方案的优缺点,并且我正在考虑采用分区/复制方法,但如果负载在写操作上,这种方法就没有帮助?

2
从基础开始 - 你是否已经建立了索引?它们是否适合应用程序? - Oded
是的,我确实有许多索引,并且它们肯定是正确的,我们没有看到慢查询,只是有大量的编写指令。 - albertosh
4个回答

2

2500万行是一个构建良好的关系型数据库完全可以接受的大小。但是需要注意的是,您拥有的索引越多(并且越全面),您的写入速度就会越慢。索引旨在提高查询性能,以牺牲写入速度。请确保您不是过度索引。

支持这个数据库的硬件是什么?您是否拥有足够的内存?更改这些属性比尝试实现复杂的RDBMS负载平衡技术要容易得多,特别是如果您时间紧迫。


嗨,亚当,我们在亚马逊使用了一个c1.xlarge实例,它大约有20个ECUS和8GB的RAM,请记住,这2500万行数据是在4天内插入的!:S 这就是为什么我认为即使我们现在尽可能地优化数据库架构(我们正在努力),我们也需要尽快找到一个处理如此多写入的解决方案。 - albertosh

2

当单个节点达到其硬件负载极限时,就需要进行集群/分片/分区。但是,如果您的硬件仍有扩展空间,则可以考虑这些解决方案。

这是我开始遇到此类问题时学到的第一课。


1

要理解这个,你需要了解MySQL如何处理集群。有两种主要的方法可以实现。你可以使用主-主复制或NDB(网络数据库)集群。

主-主复制对于写入负载是没有帮助的,因为两个主服务器都需要重放每个发出的写入操作(所以你不会得到任何好处)。

如果你大多数情况下只进行主键查找(因为只有在PK查找时,NDB才能比常规主-主设置更有效),那么NDB集群将非常适合你。所有数据都会自动分区到许多服务器上。就像我说的,如果你的查询绝大部分都只是PK查找,那么我才会考虑使用它。


那么现在只剩下两个选择。分片和远离MySQL。

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

但我认为最适合您需求的另一个选择是切换到MySQL之外的其他数据库。既然您无论如何都需要重写DB访问代码,那么切换到NoSQL数据库应该不会太难(取决于您当前的设置)。有很多NoSQL服务器可供选择,但我喜欢MongoDB。它应该能够轻松承受您的写入负载。只需注意,您真正需要64位服务器才能正确使用它(与您的数据量相对应)。


17
抱歉,你的“最佳”选择是完全远离关系型数据库?当你不知道他正在存储什么内容时,你怎么能做出这样的建议呢? - Adam Robinson
不需要为共享重新编写所有数据库访问代码。只需创建一个分发表,告诉您哪个用户在哪个服务器上,然后将它们发送到处理所有内容的服务器上。换句话说,只有在身份验证时才需要进行任何代码更改。 - Vincent

-2

复制是用于数据备份而不是性能,因此这是无法提出的问题。

嗯,8GB 的 RAM 还不算多,您可以拥有许多百 GB 的 RAM,配合相当大的硬盘空间,MySQL 仍将为您工作。

当单个节点已经达到其硬件无法承受的负载点时,就会出现集群 / 分片 / 分区。但是您的硬件还有扩展的余地。

如果您不想升级硬件,则需要提供更多关于数据库设计的信息,以及是否存在许多连结等,以便深入考虑上述命名选项。


2
复制是为了可靠性。 - Bhargav Nanekalva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接