2012-08-06 26 views
16

Recientemente configuré una réplica de lectura para quitar parte de la carga de lectura de mi instancia de Amazon multi-AZ RDS. La documentación de Amazon establece claramente que "depende de su aplicación determinar cómo se distribuye el tráfico de lectura entre sus réplicas de lectura".¿Alguien ha descubierto cómo escalar las réplicas de lectura de Amazon RDS?

Alguien ha encontrado una forma manejable a escala réplicas de lectura? No parece una solución muy extensible tener diferentes partes de mi aplicación codificadas para leer desde réplicas específicas. ¿Hay alguna manera de configurar esto que sea análogo a poner instancias EC2 detrás de un equilibrador de carga?

Respuesta

7

ingeniero Una AWS proporciona una idea de la cuestión here.

Aquí hay un fragmento de su respuesta:

, en general, se puede equilibrar la carga de tráfico en los siguientes 3 lugares lógicos:

  • capa de aplicación - crear varios grupos de conexión y enviar todas las lecturas a las réplicas de lectura. algunos marcos de soporte web se han incorporado en las bases de datos para múltiples [1] -
  • Web marco/middleware.
  • Proxy externo: puede usar un proxy externo como MySQLproxy [2].
[1]

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

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

6

Creo HAProxy sería una buena opción para equilibrar la carga entre múltiples réplicas de lectura. Usted puede tener una configuración algo como esto:

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 

donde x.x.x.x es el punto final de réplica.

3

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).

0

Me gustaría sugerir un enfoque más cómodo.
que es, DNS Round-robin con Amazon Route 53.

Como se puede ver en el presente article,
Amazon Route 53 puede hacer por turnos con múltiples CNAMEs.

Entonces todo lo que necesita hacer es

  1. "Creación de conjuntos de registros" en la Ruta 53.
  2. actualización de su archivo de configuración de la aplicación.

En mi caso, este enfoque funciona bien.

+0

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 –

+0

A menos que tenga varias instancias back-end que almacenarán en caché distintas direcciones. –

+0

@PauloMiguelAlmeida Gracias por la información! – turutosiya

Cuestiones relacionadas