Кто-нибудь понял, как масштабировать Amazon RDS, чтобы прочитать реплики? - программирование
Подтвердить что ты не робот

Кто-нибудь понял, как масштабировать Amazon RDS, чтобы прочитать реплики?

Недавно я установил прочитанную реплику, чтобы снять часть загружаемого файла с моего экземпляра Amazon multi-AZ RDS. В документации Amazon четко указано, что "ваше приложение может определить, как трафик чтения распространяется на ваши прочитанные реплики".

Кто-нибудь понял, какой способ масштабировать считываемые реплики? Это не похоже на очень расширяемое решение для того, чтобы разные части моего приложения были жестко закодированы для чтения из определенных реплик. Есть ли способ установить это, что аналогично размещению экземпляров EC2 за балансировщиком нагрузки?

4b9b3361

Ответ 1

Инженер AWS дал некоторое представление о вопросе здесь.

Вот фрагмент его ответа:

в общем случае вы можете отслеживать трафик в следующих трех логических местах:

  • Уровень приложения - создайте несколько пулов соединений и отправьте все чтения в файлы read-replicas.
  • Веб-среда/промежуточное ПО - некоторые веб-фреймворки имеют встроенную поддержку нескольких баз данных [1].
  • Внешний прокси - вы можете использовать внешний прокси, такой как MySQLproxy [2].

[1] - https://docs.djangoproject.com/en/dev/topics/db/multi-db/

[2] - https://launchpad.net/mysql-proxy

Ответ 2

Я думаю, 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

где x.x.x.x - конечная точка реплики.

Ответ 3

Я возился с использованием взвешенного CNAME с трассировкой 53, чтобы загрузить реплики RDS для чтения (и источник). В настоящее время у меня есть 3 набора записей CNAME для readdb.example.com.

Первое указывает на источник db на db.example.com. Это в случае ошибки репликации. Приложение может вернуться к исходной базе данных для чтения. Или, если хотите, вы можете иметь источник, несущий некоторую долю нагрузки на чтение, в зависимости от того, как вы устанавливаете вес. Для политики маршрутизации установлено значение Взвешенный. У меня есть вес для источника, установленного в 1, поэтому он берет на себя очень небольшое бремя нагрузки на чтение. TTL установлен на низком уровне. Я пробовал значения от 1 до 10. Я оставил его в 10 на данный момент. Вы также должны ввести Set ID, который представляет собой любую уникальную строку ( "Исходная база данных" ).

Второй набор записей указывает на одну из прочитанных реплик (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 some other stuff in here that is a little unrelated to the question */
?>
<?php endif ?>

Этот файл использует интерфейс командной строки AWS, который установлен на приложениях Elastic Beanstalk, и требует только того, чтобы переменные среды для 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 или что бы она там ни называла.

На данный момент я использую только одну прочитанную реплику, но она значительно больше, чем исходный db. Это было более экономично для меня, потому что моя исходная БД многозадачна. Я сохраняю третий набор записей и вторую проверку работоспособности в случае, если первая реплика дает мне проблемы. Таким образом, мне не нужно ждать, пока первый будет удален, прежде чем перезапускать его. Вместо этого я немедленно удаляю первый и запускаю второй, используя имя, указанное в третьем наборе записей (и вторую проверку работоспособности).

Ответ 4

Я хотел бы предложить более разумный подход.

Что означает DNS Round-robin с Amazon Route 53.

Как вы можете видеть в этой статье,
Amazon Route 53 может выполнять Round-robin с несколькими CNAME.

Тогда вам нужно всего лишь

  • "Создание наборов записей" на маршруте 53.
  • Обновите файл конфигурации вашего приложения.

В моем случае этот подход работает нормально.