我们有一个基于PHP的Web服务器,托管在Amazon EC2上的AMI上。此Web服务器使用在另一个RDS Amazon实例上运行的MySQL服务器。两种设置都很完美。我们试图通过将它们置于负载均衡器后面来扩展设置,并在负载上下移动时启动新实例。
我们能够实现启动新的Web服务器实例。所有这些Web服务器都连接到一个数据库,因此一切似乎都运行良好。但是在此过程中,数据库服务器成为瓶颈。我们希望扩展数据库服务器。 Web服务器和数据库服务器将成对扩展,显然数据库服务器将同步。目前尚不清楚如何实现这一点,任何帮助或参考或教程都会有很大的帮助。
我在互联网上搜索并阅读亚马逊文档,但所有内容都空白。
坦率地说,我也不知道这是SO相关问题还是SU或ServerFault网站问题。如果不是,请宽容。
答案 0 :(得分:1)
扩展数据库服务器比扩展Web服务器要复杂得多。您需要创建只读副本实例,RDS非常容易。只读副本与主数据库实例保持同步。但是,顾名思义,read-replicas是只读数据库实例。任何插入/更新/删除命令都需要返回主数据库服务器。
这意味着您无法使用简单的负载平衡来分配负载。负载均衡器需要检查每个SQL请求并了解哪些命令可以转到哪些服务器。亚马逊的Elastic Load Balancer不具备此功能。如果您搜索" MySQL负载均衡器"您可以找到许多用于设置HAProxy等软件的文章和教程,以便在MySQL实例集群中智能地分配负载。
或者,您可以对应用程序进行编码,以了解可用的不同数据库服务器,并在向其中一个读取副本服务器发送查询时将更新发送到主服务器。在您的场景中,我可以看到一种情况,每次启动Web服务器时,您还会启动该Web服务器用于查询的MySQL读取副本。
作为旁注,由于您在Amazon RDS上使用MySQL,您应该真正了解一下亚马逊的Aurora数据库。它与MySQL兼容,因此您不必更改单行代码,并且它通常比MySQL执行得更好。如果您切换到Aurora,您可能会发现您的数据库不是瓶颈。
亚马逊也对Aurora提供recently added load balancing支持。使用此新功能,您仍然可以使用主数据库进行更新,但现在您只需跟踪单个读取副本端点,该端点将在所有只读副本实例中分配查询负载。