He estado jugando con el uso de la Ruta 53 CNAME ponderada para equilibrar la carga lectura RDS (réplicas y la fuente). Actualmente tengo 3 conjuntos de registros CNAME para readdb.example.com.
Los primeros puntos a la db fuente en db.example.com. Esto es en caso de que haya un error de replicación. La aplicación puede recurrir a la base de datos original para lecturas. O, si lo desea, puede hacer que la fuente cargue una cierta proporción de la carga de lectura, según cómo establezca el peso. La política de enrutamiento se establece en ponderada. Tengo el peso para la fuente establecida en 1, por lo que toma una carga muy pequeña de la carga de lectura. El TTL está bajo. Probé valores de 1 a 10. Lo dejé en 10 por ahora. También debe ingresar un ID de conjunto que es una cadena única ("Base de datos de origen").
el conjunto segundo registro de puntos a una de las réplicas de lectura (readdb1.blahblah.rds.amazonaws.com). La política de enrutamiento está ponderada, y TTL es 10 como antes. También necesita una identificación de conjunto única. Establecí el peso para este entre 5-50, dependiendo. Éste, sí lo asocio con un chequeo de salud, que debes crear antes de tiempo. Probablemente pueda usar un simple chequeo de salud que apunte a la réplica, pero hice algo un poco diferente.
pongo un archivo de este tipo en cada uno de mis servidores de aplicaciones (estoy usando PHP Elastic Beanstalk, pero se podría hacer algo similar en otras configuraciones/idiomas supongo):
<?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 ?>
utiliza este archivo la interfaz de línea de comandos de AWS que está instalada en las aplicaciones Elastic Beanstalk y solo requiere que las variables ambientales para AWS_ACCESS_KEY_ID, AWS_DEFAULT_REGION y AWS_SECRET_KEY se especifiquen con anticipación. Entonces haces un chequeo de salud de ruta 53 que apunta a http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb1. Estableces la cadena de búsqueda en "¡BUENO!" Creo que una cadena de búsqueda cuesta $ 1/mes/chequeo de salud, lo que parece razonable.
Si tiene una segunda réplica de lectura, puede crear otra revisión de seguridad que apunte a http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb2 o como se llame.
Actualmente solo uso una réplica de lectura en este momento, pero es significativamente más grande que mi fuente de base de datos. Fue más económico para mí, porque mi base de datos es multi-az. Mantengo el tercer conjunto de registros y el segundo chequeo de salud en caso de que la primera réplica me esté dando problemas. De esta forma, no tengo que esperar a que se elimine el primero antes de volver a iniciarlo. En su lugar, elimino inmediatamente el primero y ejecuto el segundo usando el nombre especificado en el tercer conjunto de registros (y el segundo chequeo).
Una cosa que me preocupa de este enfoque es que algunos lenguajes como Java almacena en caché de resolución de DNS para mejorar el rendimiento que puede conducir a no tener mi tráfico bien equilibrado para todos mis réplicas de lectura como se indica aquí: http://docs.aws. amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-jvm-ttl.html –
A menos que tenga varias instancias back-end que almacenarán en caché distintas direcciones. –
@PauloMiguelAlmeida Gracias por la información! – turutosiya