Instalar Graphite para HA
Vamos a explicar como montar un sistema de Graphite en HA , en esta entrada explicaba como hacer la instalación inicial de graphite , así que partimos de un escenario donde ya tenemos un Graphite instalado y lo que queremos es asegurarnos que en el caso que caiga no nos quedemos sin sistema de métricas.
Por último antes de empezar, el sistema de alta disponibilidad que vamos a montar es tipo mirror.
Pues vamos al lío…
Partes de Graphite
Graphite se compone de una serie de demonios que trabajan al unisono para poder generar las graphicas, vamos a explicar que papel tiene cada uno de ellos, ya que será interesante para entender como montar el sistema de alta disponibilidad.
Carbon-Relay: Es el encargado de tratar la métrica que recibimos en primera instancia, decidira a que carbon-cache enviara la metrica segun el tipo de balanceo que le hayamos dicho (consistent-hashing o relays-rules)
- Consistent-hashing : Este método se utiliza cuando las métricas siempre irán a los mismos carbón-caches y tenemos más de uno, básicamente lo que hacemos en un balanceo tipo Round-Robin
- Relays-rules: Dependiendo del patron de la metrica el relay enviará el dato a un o otro carbon-cache(o a otro relay).
/opt/graphite/conf/carbon.conf # Use relay-rules.conf to route metrics to destinations based on pattern rules #RELAY_METHOD = rules # # Use consistent-hashing for even distribution of metrics between destinations #RELAY_METHOD = consistent-hashing
Carbon Cache : Este demonio tiene dos funciones, por un lado es el encargado de escribir la métrica en disco y por otro lado es el encargado de recibir las peticiones de la webapp.
Whisper: Es el sistema de escritura que se utiliza por defecto, las métricas se grabaran en fichero wsp (whisper) de forma secuencial.
Webapp : Esta es la parte con la que veremos las metricas, es un django servido por un apache.
Arquitectura deseada.
Donde queremos llegar.
Vamos a explicar el flujo de datos que tendremos y después explicaremos como se configura esta arquitectura.
- Los servidores 1 y 2 serán iguales y los servidores 3-4 también.
- La estructura se compone de 4 servidores, los 4 tendrán configurado Graphite con la instalación normal (así resulta mas fácil)
- Tendremos un balanceador para que nos enviara las peticiones en round robin a los primeros Carbon-relays (Servidor 1 y 2)
Flujo de envío de datos.
- Enviaremos las métrias al balanceador
- El balanceador en RoundRobin enviara cada métrica a un Carbon-relays de los servidores 1 y 2
- Los servidores 1 y 2 enviaran la métrica recibida a los Carbon-relays de los servidores 3-4 a través, NO es roundrobin, tendremos factor de replicación 2 con dos servidores, así que la métrica se enviara dos veces.
- Los Carbon-relays de los sservidores 3 y 4 recibirán la métrica, estos se encargaran de enviarlos a los Carbon-cache, tendremos 2 por máquina (un Carbon-cache una Cpu), en este caso con factor de replicación 1, una métrica para cada Carbon-cache (RoundRobin).
- Carbon-Cache recibirá la métrica y la grabará en whisper.
Flujo de consulta de datos
- La peticiones las enviaremos a los servidores 3-4.
- La peticion llegará al balancedador, este por RoundRobin enviara a uno de los dos sevidores (3-4)
- La Webapp recibirá la petición, primero de todo irá al Memcache de los servidores 1-2 para comprobar que no tenga el dato. (Memcache no es necesario, pero aligera la carga)
- Si el dato no se encuentra lanzará la petición a los Carbon-cache del mismo servidor por los puertos 7102 y 7002.
- Carbon-cache ira a disco buscar el dato y lo entregará a la webapp
Como podemos ver lo que estamos haciendo es simplemente repartir el dato que recibimos entre dos sistemas, de esta manera tendremos un espejo de la arquitectura de Graphite, los servidor 1-3 y los servidores 2-4, pudiendo romper cualquier elemento sin perder servicio.
Configuración de la alta disponibilidad
Como hemos visto la arquitectura es simétrica, así pues la configuración de los servidores 1-3 será la misma que la de los servidor 2-4.
Configuración de carbon-relay (Servidores 1-2)
Estos servidores los configuraremos exclusivamente en la sección relay del fichero de configuración de carbon.conf
Le diremos configuraremos el puerto normal y el puerto donde enviaremos las métricas Pickle, (altamente recomendado enviar todo lo que podamos por Pickle)
/opt/graphite/conf/carbon.conf LINE_RECEIVER_INTERFACE = 0.0.0.0 LINE_RECEIVER_PORT = 2003 PICKLE_RECEIVER_INTERFACE = 0.0.0.0 PICKLE_RECEIVER_PORT = 2014
Seleccionaremos el método de balanceo que queramos, en nuestro caso como queremos un espejo tendremos que activar consistent-hashing
RELAY_METHOD = consistent-hashing
Ahora el factor de replicación, en estos Carbon-relays deberá ser 2, ya que queremos que cada métrica se envíe a ambos grupos de servidores (2-4)
REPLICATION_FACTOR = 2
Como es lógico le tendremos que decir donde están esos servidores, los puertos que ponemos serán los puertos Pickle, ya que todas las comunicaciones que se muevan en el sistema deberían ser Pickle
DESTINATIONS = Servidor3:2014, Servidor4:2014
Esta configuración sera igual en los servidores 1 y 3
Configuración de carbon-relay (Servidores 3-4)
La métrica que se envía desde los servidores 1-2 deberá ser recibida por los Carbon-relay de los servidores 3-4, en este caso ponemos un Carbon-relay por delante ya que vamos a tener mas de un Carbon-cache y nos interesa que podamos balancear entre ellos.
En el fichero carbon.conf de los servidores 3-4 en la seccion [relay], deberemos poner lo siguiente:
/opt/graphite/conf/carbon.conf PICKLE_RECEIVER_INTERFACE = 0.0.0.0 PICKLE_RECEIVER_PORT = 2014
Donde el PICKLE_RECEIVER_PORT deberá ser el mismo que hemos puesto en los destinos de los primeros Carbon-relay,
</pre> RELAY_METHOD = consistent-hashing
Ahora el factor de replicación, en estos Carbon-relays deberá ser 1, ya que queremos que cada métrica se envíe a solo un Carbon-cache de los que tenemos en la misma máquina, o sea que consiguiremos un RoundRobin.
REPLICATION_FACTOR = 1
Como es lógico le tendremos que decir donde están esos servidores, los puertos que ponemos serán los puertos Pickle, ya que todas las comunicaciones que se muevan en el sistema deberían ser Pickle
DESTINATIONS = 127.0.0.1:2004, 127.0.0.1:2014
Configuración de carbon-cache (Servidores 3-4)
Como vemos en el esquema por cada servidor tendremos dos Carbon-cache, deberemos estar atentos a este punto ya que cambia un poco la configuración estándar.
Deberemos localizar dentro de la sección [cache] en el fichero carbon.conf de los servidores 3 y 4 los siguientes valores.
[cache] PICKLE_RECEIVER_PORT = 2004 CACHE_QUERY_PORT = 7002
Podremos para el primer Carbon-cache los puertos donde podremos enviar las métricas PICKLE_RECEIVER_PORT, que deberá ser el mismo que hemos configurado en los Carbons-relay de los servidores 3-4.
Y el CACHE_QUERY_PORT que será el puerto por el que la Webapp enviará las consultas.
Con esto tendremos la configuración del primer Carbon-cache de un servidor, ahora deberemos configurar el segundo, tal que así.
[cache:b] PICKLE_RECEIVER_PORT = 2104 CACHE_QUERY_PORT = 7102
Con esto creamos un nuevo carbón cache b siguiendo la misma lógica que con el primero
Por ultimo deberemos decirle al sistema que levante los dos Carbon-cache.
Podemos tener un init.d tal que así
#!/bin/sh # !!! generated by puppet !!! ### BEGIN INIT INFO # chkconfig: 2345 99 80 # Provides: carbon-cache # Required-Start: $remote_fs $network $time # Required-Stop: $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/Stop carbon-cache # Description: Enables Graphites carbon-cache data collecting engine ### END INIT INFO case "$1" in start) python /opt/graphite/bin/carbon-cache.py --instance=a start python /opt/graphite/bin/carbon-cache.py --instance=b start ;; stop) python /opt/graphite/bin/carbon-cache.py --instance=a stop python /opt/graphite/bin/carbon-cache.py --instance=b stop ;; status) python /opt/graphite/bin/carbon-cache.py --instance=a status python /opt/graphite/bin/carbon-cache.py --instance=b status ;; restart) $0 stop ; sleep 3 ; $0 start RC=$? exit $RC ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit
Esta configuración será la misma para el servidor 4
Configuración de la Webapp
Ya solo nos queda la Webapp esta se configura en un fichero diferente
Deberemos tocar las siguientes opciones:
vim /opt/graphite/webapp/graphite/local_settings.py MEMCACHE_HOSTS = ['Servidor1:11211','Servidor2:11211',] CARBONLINK_HOSTS = ["127.0.0.1:7002:a", "127.0.0.1:7102:b"]
En el caso que utilicemos Memcache deberemos decirle donde esta y donde encontrara los carbon-query para hacer peticiones de datos, en nuestro esquema se encuentran en la misma máquina.
Esta configuración es la misma para servidor 4
Y con eso ya tendremos el sistema montado, si todo salio bien, en el momento que le enviemos un métrica al Carbon-relay servidor 1 o 2 esta se repartirá entre los servidores 3 y 4