簡體   English   中英

有沒有人想出如何擴展亞馬遜RDS閱讀副本?

[英]Has anyone figured out how to scale Amazon RDS read replicas?

我最近設置了一個只讀副本,以便從我的Amazon多可用區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是副本端點。

我一直在使用Route 53加權CNAME來加載平衡RDS讀取副本(和源代碼)。 我目前為readdb.example.com提供了3個CNAME記錄集。

第一個指向db.example.com上的源數據庫。 這是因為存在復制錯誤。 應用程序可以回退到原始數據庫以進行讀取。 或者如果您願意,您可以讓源攜帶一定比例的讀取負載,具體取決於您設置重量的方式。 路由策略設置為加權。 我將源的權重設置為1,因此讀取負載的負擔非常小。 TTL設置為低。 我已經嘗試過從1到10的值。我現在已經把它保留在10。 您還必須輸入Set ID,它是任何唯一的字符串(“Source Database”)。

第二個記錄集指向其中一個只讀副本(readdb1.blahblah.rds.amazonaws.com)。 路由策略是加權的,TTL與之前一樣是10。 它還需要一個唯一的Set ID。 我將這個重量設置在5-50之間,具體取決於。 這個,我確實與健康檢查相關聯,您必須提前創建健康檢查。 您可以使用指向副本的簡單健康檢查,但我做了一些不同的事情。

我在每個應用程序服務器上放了這樣的文件(我使用的是PHP Elastic Beanstalk,但你可以在我假設的其他設置/語言中做類似的事情):

<?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的環境變量。 然后,您進行Route 53運行狀況檢查,指向http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb1 您將搜索字符串設置為“GOOD!” 我認為搜索字符串每月花費1美元/健康檢查,這似乎是合理的。

如果您有第二個只讀副本,則可以創建另一個指向http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb2或其所謂的健康檢查。

實際上我此時只使用一個只讀副本,但它比我的源數據庫大得多。 這對我來說更經濟,因為我的源數據庫是多重的。 我保留了第三個記錄集和第二個健康檢查,以防第一個副本給我帶來問題。 這樣,在重新啟動它之前,我不必等待第一個刪除。 相反,我立即刪除第一個,並使用第三個記錄集中指定的名稱(和第二個健康檢查)啟動第二個。

我想建議更多的方便。
這是使用Amazon Route 53的 DNS循環法

正如您在本文中所看到的,
Amazon Route 53可以使用多個CNAME進行循環。

那么你需要做的就是

  1. 53號公路的“創建記錄集”。
  2. 更新應用程序的配置文件。

就我而言,這種方法很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM