MySQL:5000核心用户,2GB表重写/读:如何防止崩溃

这是一个有争议的问题,因为很多人可能都想马上推荐一些简单的东西,比如:把桌子分开! 将读/写分解为主/从configuration! 放大服务器RAM! 等等….让我先解释一下这个问题:

我有一个有点强大的服务器:8GHz的,160GB的存储空间,8GB的RAM(16GB的灵活内存),RAID 10,16GB的Flexi-SSD。 运行mySQL,PHP,Apache,Debian

我目前的数据库包含大约16个表,其中特别包含1.7GB的信息,2300万行(索引)。

我运行的服务需要每天进行,有时每小时扫描一次我通过第三方收到的数据,并且每分钟产生大约100行到最多5000行(很less)的数据。 数据是通过抓取工具从API中获取的,这些抓取工具是自动运行的,计划的,有时是临时的,所以它们对于主机来说是重要的。

当人们使用这个网站的时候,会有刷新的查询可以显示他们最新的分析数据,所以当很多人login时,这个数据非常繁重(我使用慢速查询并试图减less索引我可以在哪里)。 我从数据库中快速生成这些分析数据(最长24小时),可以为每个用户总结多达500万条logging。 我不认为预渲染这些查询是有意义的,因为我必须考虑所有的切片/过滤,以及在预先呈现的HTML文件….不是吗? 或者人们这样做?

现在,有时候,我在手机上收到警告,只有login到服务器才能发现mySQL已closures。 我会做一个mysqlcheck和修复,这需要2个小时或更长的时间,最终退出一个工作的数据库。 我开始一切,一切都很开心。 我从来不知道为什么会发生这种情况 ,大多数情况下,当一个博客写关于该网站的时候就会发生这种情况 ,而人们只是通过注册来攻击网站。 但是没有详细logging坠毁的地方。

除了速率限制注册过程(等待线),有什么我可以做,以确保无论发生什么事情,MYSQL不应该崩溃? 我可以每小时运行一次自动修复并优化实时实例吗? 我认为这阻止了所有访问表,这将是可怕的?

我真的被这个压倒了。 我分裂了读/写,理论上可以将所有的读访问用户拆分成EC2实例上的从属服务器。 但是,然后我有使用尖峰急剧上升的问题,一旦我需要一个新的EC2实例,它需要我传输高达2GB的数据同步从属数据库…这从来没有通过mysql-bin日志如果我决定closures/启动一个EC2实例并停留多天。

我已经能够保持良好的状态,但是即使有了EC2和其他技术,我也不会受到我的理解和技术能力的限制。

我很乐意分享所有必要的信息,以便将来成为有用的线索/文档。 由于不是每个网站都是youtube / youporn / instagram / tumblrtypes的环境,我觉得我的网站types信息太less(高写入/读取,每个用户500到5Mlogging,在3000-10000个用户。

谢谢大家,请提出问题,我会提供更多信息。 我很乐意听到你的最佳做法。

我认为你的my.cnfconfiguration错误,你在评论中提供了什么。 你可能“给”MySQL更多的内存,你的系统可用。 thread_stack = 100M远大于推荐值。 我敢打赌,OOM杀手只是杀死你的MySQL,以防止内核的内存。

你应该先用mysqltuner检查你的mysqlconfiguration, 然后微调你的mysqlconfiguration以避免服务器崩溃。

运行REPAIR,ANALYZE,OPZIMIZE,…在某些cron的基础上进行生产环境,不build议您使用大数据,但是现在对FLUSH TABLES来说是一个很好的做法。