miércoles, junio 01, 2016

Autoscalar RDS postgresql, más o menos.



Una de las cosas más difíciles de auto escalar son las bases de datos, aws amazon nos da la opción de escalar horizontalmente una base de datos mediante read replicas, lamentablemente en el caso de postgresql solo nos deja crear 5 y no hay opción de hacer read replicas de las read replicas (Esto se puede hacer en mysql).

Una forma de seguir creciendo es promover una read replica a master y crear sus otras 5 read replicas, pero hay que implementar un mecanismo de sincronización entre las dos master.

La otra es empezar con pocas read replicas he irlas creando de acuerdo a la demanda, esta opción es buena pero no es rápida, se basaría más en predecir el tráfico antes de que llegue, lo malo es que crear una read replica es  lento  aproximadamente unos 20 min.

Un escenario es tener creadas las 5 read replicas y escalarlas verticalmente cambiando el tipo de clase de instancias. Esta solución también es lenta, unos 7 u 8 min. Una ventaja de esta solución es que podemos jugar con los costos y por ejemplo tener solo 2 read replcias grandes y otras 3 micro.

Para que esta opción funcione necesitamos una arquitectura parecida a esta:



En nuestro ejemplo necesitaremos lo siguiente:
1. Tener creado un rds master con una read replica
2. Tener configurado 2 instancias con pgboucer uno para apuntar a master y otro a readreplica
3. Tener configurado un loadbalancer con esas dos instancias.

La modificación de las clase y encender el pgbouncer lo realizaremos a través de lambdas, las lambdas que usaremos son upgrade_db_instance_class y add_read_replica_to_elb.


Necesitaremos crear 2 topicos de SNS, para atacharlos a los eventos, uno de cloudwatch que disparará el aumento de la read replica y otro al finalizar la modificación de la read replica.



Y crearemos dos suscripciones, cada uno a su respectivo lambda:


Crearemos una alerta y mandaremos la notificación al topico 80_percent_rds


Y crearemos un Event Suscriptions en el rds para apuntarlo al topico upgrade_rds





Habiendo hecho todo eso ya podemos empezar con nuestra prueba.






Ocuparemos una instancia para lanzar las pruebas, estas se harán con pgbench y lo podemos instalar de la siguiente manera.

$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
$ wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install postgresql-contrib

Ahora meteremos datos a la instancia:
$ pgbench -h hgmigueldb.comvkfys9x22.us-east-1.rds.amazonaws.com -p 5432 -Uhgmiguel -i -s 300 hgmigueldb

Y así correremos las pruebas:
$pgbench -h internal-pgbouncer-elb-592002074.us-east-1.elb.amazonaws.com -p 6432 -Uhgmiguel -c 64 -j 4 -T 900 -C -S hgmigueldb

Como ven ocupamos muchas cosas del entorno de aws, SNS, Lambdas, RDS, ELB, y Cloudwatch para poder armar esta arquitectura. Llega a ser abrumante la cantidad de servicios que hay en amazon pero conocerlos todos nos ayuda a crear mejores soluciones.
Publicar un comentario