前段时间,我创建了一个并发性非常高的REST服务。
即使在SQL查询优化之后,它给了我一个更大的时间窗口来思考,我开始担心服务的MySQL DB服务器。
服务:- 多个Apache服务器,用于负载平衡,背后的NGINX反向代理处理高并发
- PHP操作码缓存和Memcached数据缓存
- 一个MySQL数据库服务器,在64位操作系统上使用InnoDB表模式
- SQL查询是存储过程
在相对较短的时间内我可能面临的问题是:
- MySQL数据库服务器达到其存储限制的数据数TB
- MySQL数据库服务器达到其最大并发查询数的专用CPU/RAM/TCP
我发现了什么解决方案,我正在考虑:
- MySQL集群,但看起来不支持完整性(FK?)
- 多个复制MySQL服务器用于负载平衡(缺点:存储过多)
- 分片(缺点:在这一点上,对我来说,当我需要尽快找到解决方案时,它看起来相当复杂)
- 切换到postgresql并对这个特定的SQL Server做更多的调查
你的建议是什么,你最好的选择,卸载MySQL服务器?如果我什么都不做,它最终会崩溃的。
提前感谢!
另一个你可以考虑的解决方案
你可以使用池服务,这是一些需要最高优先级的查询。例如,在stackoverflow这里,大多数想要使用他们的API的人都会问最新的问题。所以第一个人问最新的问题,他们可以从他们的数据库中得到。但是只要它是一个高优先级的查询,那么它就会被添加到池中,所以任何需要它的人都可以直接从池中检索它,而不会像从服务器请求它那样花费那么多时间。
关于池的实现,这是另一个要讨论的标准。
另一个解决方案是:如果你有一个非常大规模的数据集群,并且你的select语句增加了很多,那么你可以使用hadoop中的HDFS,并在任意多的服务器上应用hadoop。这个方法被Facebook, linkedIn和yahoo使用。