首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有人知道如何扩展Amazon RDS read副本?

有没有人知道如何扩展Amazon RDS read副本?
EN

Stack Overflow用户
提问于 2012-08-07 04:16:46
回答 2查看 8.9K关注 0票数 16

我最近设置了一个读取副本,以减轻我的Amazon多可用区RDS实例的一些读取负载。Amazon文档清楚地指出,“由您的应用程序决定如何在您的读取副本之间分配读取流量”。

有没有人想出了一种可管理的方法来扩展读取副本?将应用程序的不同部分硬编码为从特定副本读取,这似乎不是一个可扩展性很强的解决方案。有没有一种方法可以设置成类似于在负载均衡器后面放置EC2实例?

EN

回答 2

Stack Overflow用户

发布于 2012-11-30 19:26:21

我认为HAProxy将是在多个读取副本之间进行负载平衡的一个很好的选择。你可以有一个类似下面这样的配置:

代码语言:javascript
复制
 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

其中x.x是复制副本端点。

票数 6
EN

Stack Overflow用户

发布于 2014-09-01 03:37:59

我一直在使用Route 53加权CNAME对RDS读取副本(和源)进行负载均衡。我目前有3个readdb.example.com的CNAME记录集。

第一个指向db.example.com上的源数据库。这是为了防止出现复制错误。应用程序可以回退到原始数据库进行读取。或者,如果您愿意,您可以让源文件承载一定比例的读负载,这取决于您如何设置权重。路由策略设置为加权。我将源的权重设置为1,因此它承担了非常小的读取负载。TTL设置为低。我已经尝试了从1到10的值。我现在把它留在10。您还必须输入一个集合ID,它可以是任何唯一的字符串(“源数据库”)。

第二个记录集指向其中一个已读副本(readdb1.blahblah.rds.amazonaws.com)。路由策略是加权的,TTL和以前一样是10。它还需要一个唯一的集合ID。我将这个的权重设置在5-50之间,这取决于。这个,我确实与运行状况检查相关联,您必须提前创建它。您可能可以使用指向副本的简单健康检查,但我做了一些不同的事情。

我在我的每个应用服务器上都放了一个这样的文件(我使用的是PHP Elastic Beanstalk,但我假设您可以在其他设置/语言中做类似的事情):

代码语言:javascript
复制
<?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 ?>

此文件使用安装在Elastic Beanstalk应用程序上的AWS命令行界面,并且只需要提前指定AWS_ACCESS_KEY_ID、AWS_DEFAULT_REGION和AWS_SECRET_KEY的环境变量。然后,您进行指向http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb1的路由53运行状况检查。将搜索字符串设置为"GOOD!“我认为一个搜索字符串的费用是1美元/月/健康检查,这似乎是合理的。

如果您有第二个read副本,则可以创建另一个指向http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb2或其他名称的运行状况检查。

实际上,我现在只使用一个读取副本,但它比我的源数据库大得多。这对我来说更经济,因为我的源DB是多az的。我保留了第三个记录集和第二个健康检查,以防第一个副本给我带来问题。这样,我就不必等到第一个文件被删除后再重新启动它。相反,我会立即删除第一个记录,并使用第三个记录集中指定的名称启动第二个记录(以及第二个运行状况检查)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11835271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档