嗨朋友们,我正在为我的一个产品使用 MySQL DB,现在大约有 250 所学校正在使用它,它每小时大约 1500000 次插入,每天大约 12000000 次插入,我认为我目前的设置就像一个服务器可能会在几小时内崩溃,读也写一样,我怎样才能让它不崩溃的数据库服务器,我现在面临的主要问题是写入和读取数据都很慢我怎么能克服这个,我很难得到一个解决方案。伙计们请帮助我..哪个是解决问题的好模型?
3 回答
每秒约 500 次插入确实没什么好打喷嚏的。
对于灵活的解决方案,您可能希望实现某种分片。可能最简单的解决方案是预先将学校分成组,并将不同学校组的数据存储在不同的服务器上。例如,学校 1-10 的数据存储在服务器 A 上,学校 11-20 存储在服务器 B 上,等等。假设来自不同学校的数据之间几乎没有关系,这几乎是无限可扩展的。
您也可以尝试在问题上投入更多的精力并投资于 SSD 驱动器的 RAID,假设您有足够的处理能力,您应该没问题。当然,如果是庞大的数据库,SSD硬盘的容量可能不够用。
最后,看看是否可以减少插入次数,例如通过非规范化数据库。比如说,不是将每个学生的出勤率存储在单独的行中,而是将整个班级的出勤率作为向量放在一行中。当然,这样的更改会严重限制您的查询能力。
很难同时获得快速读取和写入。要获得快速读取,您需要添加索引。要获得快速写入,您需要很少的索引。为了让两者都快,它们不能互相锁定。
根据您的需要,一种解决方案是拥有两个数据库。将新数据写入您的实时数据库,并且每隔一段时间当它安静时,您可以将数据同步到另一个您可以执行查询的数据库。这种方法的缺点是你读取的数据会有点旧。这可能是也可能不是问题,具体取决于您需要做什么。
我悠闲的建议是:
- 构建您的应用程序轻量级。不要使用像 Active Record 这样的高级数据库抽象层。他们不擅长缩放。
- 了解很多关于 mysql 性能的知识。
- 了解 mysql 复制。
- 了解负载平衡。
- 了解内存缓存。(内存缓存)
- 聘请管理员(具有良好的 mysql 知识)或 Web 应用程序性能专家/顾问。
具体策略取决于您的应用程序及其使用方式。Mysql 复制,可能合适也可能不合适(同样适用于提到的分片策略)。但这是实现某些扩展的一种相当简单的方法,因为它不会过多地影响您的应用程序设计。内存中的缓存可以避免数据库的一些负载,但它们需要一些工作才能应用和一些权衡。最后,您需要全面了解如何在重负载下处理数据库驱动的应用程序。如果您的截止日期很紧,请增加外部人力,因为没有经验您不会在 6 周内完成这项工作。