我最近成立了一个读取副本采取一些读负载了我的亚马逊多AZ RDS实例。 亚马逊的文件明确指出,这是“到你的应用程序,以确定在您读副本交通是如何读分布”。
有没有人想出了一个可管理的方式来扩展读副本? 它似乎并不像一个非常可扩展的解决方案有我的应用程序的硬编码从特定副本读的不同部分。 有没有一种方法来设置这是类似于将EC2实例背后负载平衡器?
我最近成立了一个读取副本采取一些读负载了我的亚马逊多AZ RDS实例。 亚马逊的文件明确指出,这是“到你的应用程序,以确定在您读副本交通是如何读分布”。
有没有人想出了一个可管理的方式来扩展读副本? 它似乎并不像一个非常可扩展的解决方案有我的应用程序的硬编码从特定副本读的不同部分。 有没有一种方法来设置这是类似于将EC2实例背后负载平衡器?
一个AWS工程师提供一些深入的问题在这里 。
这里是他响应的一个片段:
一般而言,您可以在以下3个逻辑地负载均衡流量:
- 应用层 - 创建多个连接池和发送所有读取到读副本。
- Web框架/中间件 - 多个数据库的一些Web框架已经内置支持[1]。
- 外部代理 - 您可以使用外部代理像MySQLproxy [2]。
[1] - https://docs.djangoproject.com/en/dev/topics/db/multi-db/
[2] - https://launchpad.net/mysql-proxy
我觉得HAProxy的将加载多个读取副本之间的平衡一个不错的选择。 你可以有一个配置是这样的:
listen mysql-cluster 0.0.0.0:3306
mode tcp
balance roundrobin
option mysql-check user root
server db01 x.x.x.x:3306 check
server db02 x.x.x.x:3306 check
server db03 x.x.x.x:3306 check
其中xxxx是副本终点。
我已经与搞乱使用路径53加权CNAME负载平衡RDS读副本(和源)。 我现在有3个CNAME记录集readdb.example.com。
第一点,在db.example.com源分贝。 这是在的情况下有一个复制错误。 应用程序可以回退到原来的数据库中读取。 或者,如果你愿意,你可以在源进行读取负载的一定比例,这取决于你如何设置权重。 路由策略设置为加权。 我有一个设置为1的源的重量,所以它需要在读取负载非常小的负担。 TTL设低。 我试图从1到10,我留在这10现在值。 您也可以输入一组ID是任何唯一的字符串(“源数据库”)。
第二个记录集点读副本(readdb1.blahblah.rds.amazonaws.com)之一。 路由策略进行加权,而TTL是10像以前一样。 它还需要一套独特的ID。 我的权重设置为这一个5-50之间,视。 这一次,我做一个健康检查,你必须创建提前关联。 你也许可以用一个简单的健康检查指向副本,但我做的东西有点不同。
我把这样的文件上我的每一个应用服务器(我使用PHP弹性魔豆,但你可以做其他设置/语言类似我承担的东西)的:
<?php if($instanceid = $_GET["id"]): ?>
<?php
exec("aws rds describe-db-instances --db-instance-identifier " . escapeshellarg($instanceid), $rdsinfo);
$rdsinfo = implode(' ',$rdsinfo);
$rdsinfo = json_decode($rdsinfo, true);
if($rdsinfo["DBInstances"][0]["StatusInfos"][0]["Normal"] && $rdsinfo["DBInstances"][0]["DBInstanceStatus"] === "available"){
echo "GOOD!";
}
else {
echo "BAD!";
};
/* Then there's some other stuff in here that is a little unrelated to the question */
?>
<?php endif ?>
此文件使用其安装在弹性青苗应用程序,只需要对于AWS_ACCESS_KEY_ID,AWS_DEFAULT_REGION和AWS_SECRET_KEY环境变量可以提前指定的AWS命令行界面。 所以,那么你犯了一个路线53健康检查指向http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb1 。 您可以设置搜索字符串“GOOD!” 我认为搜索字符串花费$ 1 /月/健康检查,这似乎是合理的。
如果你有一个第二读取副本,您可以创建另一个健康检查指向http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb2或管它叫什么。
我实际上只使用一个读取副本在这个时候,但它比我的源数据库显著较大。 这对我来说更经济,因为我的源DB是多AZ。 我把第三个记录集和第二健康检查周围的情况下,第一个副本是给我的问题。 这样一来,我就不必等待第一个重新发起之前删除。 相反,我立即删除了第一个并启动使用第三记录(和第二健康检查)指定的名称第二个。
我想建议更便于学习的方法。
这是, DNS循环与亚马逊路线53 。
正如你可以在此看到文章 ,
亚马逊路线53可以做循环赛多个CNAME记录。
然后,所有你需要做的是
在我的情况下,这种方法工作得很好。