即使使用连接池后如何处理太多并发连接?

Kac*_*acy 8 mysql database postgresql concurrency database-connection

脚本

假设您有一个拥有大量流量的网站或应用.即使使用数据库连接池,性能也会受到重创(网站/应用甚至可能会崩溃),因为并发连接太多了.

处理这个问题的人有什么选择?

我的想法

我认为有这个问题的人可以创建多个数据库(可能在不同的机器上,虽然我不确定是否有必要),每个数据库都有相同的信息并同时更新,这将授予原始连接数的倍数单个数据库.但是,如果数据库很大,似乎不是一个非常可行的解决方案.

Meh*_*ran 10

词干的具体程度不足以给出一个坚定的建议,但可完成的完整列表如下:

  • 数据库集群:适用于您不想更改应用程序层和数据库的情况.您可以从数据库群集中获得多少限制.如果您的请求量不断增长,此解决方案最终也会失败.但好消息是,您已经拥有了普通单实例MySQL中已有的所有功能.
  • 拆分:由于您的问题被加上MySQL和它不支持分片自身,如果要使用此解决方案,您需要实现它在你的应用程序层.在此解决方案中,您将在逻辑上将数据分散到多个数据库(最好是在单独的硬件上的多个MySQL实例中).您有责任找到包含指定数据的相应数据库.它是有史以来最有效的解决方案之一,但并不总是可行的.其最大的缺陷是分散在两个或多个数据库中的数据不能包含在事务中.
  • 复制:根据您的方案,您可以合并数据库复制并在其上包含数据副本.这样您就可以连接到它们而不是master数据库并减少它的负载.默认复制定义是主/从方案,其中数据流是从主站到从站的一种方式.因此,您可能会对奴隶进行更改,同时将应用于药膏,它们不会影响主人.但是还有一个主/主复制配置,其中数据流是双向的.然而,您不能假设两个主服务器之间的并发数据更改的原子完整性.最后,如果您计划在主/从模式下使用它并使用从设备进行只读访问,则此解决方案最有效.
  • 缓存:也许这个解决方案不应该包含在这里,但是因为你的主干不拒绝它,所以它就是这样.减少数据库负载的方法之一是在提取后缓存其数据.如果提取数据很昂贵,这种解决方案尤其有用.有很多缓存服务器,如memcachedredis.这样,您可以省略这么多数据库连接,但仅用于提取数据.
  • 其他存储引擎:如果您当前的引擎无法满足您的需求,您可以随时切换到性能更高的引擎.当然,只有您的需求允许,这才是可行的.如今有NoSQL引擎,比RDBMS更高效,它本身支持分片,你可以用最小的努力线性扩展它们.还有基于Lucene的解决方案,具有强大的全文搜索功能,为您提供相同的自动分片.实际上,您应该使用传统RDBMS的唯一原因是事务的原子行为.但如果事务不是必须的,那么有比RDBMS更好的解决方案.