2500万行是一个构建良好的关系型数据库完全可以接受的大小。但是需要注意的是,您拥有的索引越多(并且越全面),您的写入速度就会越慢。索引旨在提高查询性能,以牺牲写入速度。请确保您不是过度索引。
支持这个数据库的硬件是什么?您是否拥有足够的内存?更改这些属性比尝试实现复杂的RDBMS负载平衡技术要容易得多,特别是如果您时间紧迫。
当单个节点达到其硬件负载极限时,就需要进行集群/分片/分区。但是,如果您的硬件仍有扩展空间,则可以考虑这些解决方案。
这是我开始遇到此类问题时学到的第一课。
要理解这个,你需要了解MySQL如何处理集群。有两种主要的方法可以实现。你可以使用主-主复制或NDB(网络数据库)集群。
主-主复制对于写入负载是没有帮助的,因为两个主服务器都需要重放每个发出的写入操作(所以你不会得到任何好处)。
如果你大多数情况下只进行主键查找(因为只有在PK查找时,NDB才能比常规主-主设置更有效),那么NDB集群将非常适合你。所有数据都会自动分区到许多服务器上。就像我说的,如果你的查询绝大部分都只是PK查找,那么我才会考虑使用它。
那么现在只剩下两个选择。分片和远离MySQL。
分片是处理这种情况的好选择。但是,要充分利用分片,应用程序需要完全意识到它。因此,您需要返回并重写所有数据库访问代码,以选择正确的服务器来处理每个查询。而且,根据您当前系统的设置方式,可能无法有效地进行分片...
但我认为最适合您需求的另一个选择是切换到MySQL之外的其他数据库。既然您无论如何都需要重写DB访问代码,那么切换到NoSQL数据库应该不会太难(取决于您当前的设置)。有很多NoSQL服务器可供选择,但我喜欢MongoDB。它应该能够轻松承受您的写入负载。只需注意,您真正需要64位服务器才能正确使用它(与您的数据量相对应)。
复制是用于数据备份而不是性能,因此这是无法提出的问题。
嗯,8GB 的 RAM 还不算多,您可以拥有许多百 GB 的 RAM,配合相当大的硬盘空间,MySQL 仍将为您工作。
当单个节点已经达到其硬件无法承受的负载点时,就会出现集群 / 分片 / 分区。但是您的硬件还有扩展的余地。
如果您不想升级硬件,则需要提供更多关于数据库设计的信息,以及是否存在许多连结等,以便深入考虑上述命名选项。