在MySql/PHP/CodeIgniter中如何实现多个读数据库的负载均衡?

3
我正在使用亚马逊的RDS。我有一个单一的数据库,我们的流量相当大。我已经扩展了我们的EC2实例而没有任何问题,它一直很好地工作着,但是我想通过创建以下内容来减轻数据库负载:
1 - 写入数据库 2 - 读取数据库
显然,我必须在我的脚本中进行多个连接,并从一个数据库读取和写入另一个数据库很容易,但是如何平衡多个读取数据库的逻辑?
在亚马逊上是否有一些设置可以做到这一点?像EC2的负载均衡一样?还是这是我必须在我的脚本中自动设置的内容?
从技术上讲,我现在可能不需要2个读取数据库实例,但这肯定是一件常见的事情,对吧?我认为这需要完成,并且我对架构很感兴趣。

你尝试过使用缓存来提高程序运行效率吗?CodeIgniter内置的缓存功能一般般,但Phil Sturgeon编写了另一个缓存插件,听起来更好(它可以让你缓存页面的某些部分而不是整个页面)。我很想知道其他人对此有什么看法。 - Christian D.
2个回答

3

很遗憾,没有简单的方法可以做到这一点。由于RDS自动管理的性质,您完全取决于Amazon和他们提供的服务。但是您有几个选项。

1. 继续使用RDS并设置轮询DNS。

通过route53最容易实现此目标。为每个读副本的端点创建多个CNAME记录。例如:db.mydomain.com -> somename.23ui23asdad4r.region.rds.amazonaws.com。确保启用加权路由策略,并将权重和“集ID”设置为相同。对于每个读副本都要重复此过程。

http://note.io/1agsSMB

注意1: 这不是真正的负载均衡器。这只是在你的RDS中掷骰子,并将每个请求指向其中一个。

注意2: 没有办法检查RDS实例的健康状况,也没有办法自动扩展实例。除非您使用CloudWatch触发脚本手动添加和删除RDS读副本并更新route53。

2. 在应用程序中使用随机选择。

您可以尝试一种非常便宜和卑鄙的方法,即在CodeIgniter中为每个读副本创建一个配置文件,并在连接到数据库时随机选择一个。

注意事项:与上述相同,但更糟糕,因为您需要每次添加或删除读副本时都更新CodeIgniter配置。

3. 将RDS迁移到EC2实例上并调整实例。

您可以将数据库移动到EC2实例。这可能是最困难的解决方案,因为您将需要自己管理所有数据库调整和优化。好处是,您将能够将它们放入VPC中的自动缩放组和内部负载均衡器后面。


0

RDS集群为您提供了读和写两个端点。如果您将读流量发送到读端点,AWS将为所有读副本管理负载平衡。您还可以为读副本应用扩展策略。

这些选项适用于AWS Aurora集群


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接