hydro-monitor / web-api

MIT License
0 stars 0 forks source link

Servidor

Build Status Go Report Card

Repositorio del servidor del sistema de medición y estudios de rios realizado como parte del trabajo profesional de los alumnos Agustina Barbetta y Manuel Porto.

Dentro del servidor se encuentra:

La replicación del servidor es invisible al usuario, lo que se expone es un load balancer. Tanto los nodos de medición como el panel harán requests contra el load balancer que este último redirigirá hacia algún servidor.

Para ejecutar el servidor se deben realizar los siguientes pasos:

  1. Crear una Docker network: docker network create hydromon-net.
  2. Iniciar un container con Cassandra: docker run --name hydromon-cassandra-1 --net hydromon-net -d cassandra. Esto solo es necesario la primera vez, luego puede simplemente correrse docker start hydromon-cassandra. También puede exponerse el puerto 9042 para poder conectarse con el servidor sin que esté corriendo en Docker.
  3. Crear el keyspace en la base de datos:
    1. Conectarse a Cassandra a través de cqlsh: docker run -it --network hydromon-net --rm cassandra cqlsh hydromon-cassandra.
    2. Crear el keyspace: CREATE KEYSPACE hydromon WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
  4. Compilar el servidor: make web-api-linux.
  5. Ejecutar docker build -t hydromon-server ..
  6. Iniciar el container: docker run --net hydromon-net -p 8080:8080 -d hydromon-server. sudo docker run --name hydromon-server-2 --net hydromon-net -p 443:443 -e SCOPE=prod -d hydromon-server

¿Cómo crear un cluster de Cassandra?

Levantar un cluster de Cassandra simple

  1. Iniciar un container de Cassandra: docker run --name hydromon-cassandra-1 --net hydromon-net -d cassandra.
  2. Para agregar nuevos containers ejecutar: docker run --name hydromon-cassandra-2 -d -net hydromon-net -e CASSANDRA_SEEDS=hydromon-cassandra-1 cassandra
  3. Si se desean agregar más nodos al cluster repetir el paso 2 cambiando el nombre de cada nodo.
  4. Crear el keyspace en la base de datos: CREATE KEYSPACE hydromon WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };

Reemplazar un nodo fallido del cluster

  1. Ingresar a algún nodo activo y ejecutar: nodetool status. Registrar la ip del nodo que falló.
  2. Ejecutar docker rm hydromon-cassandra-x donde x es el número del nodo que falló.
  3. Ejecutar docker run --name hydromon-cassandra-2 -d -net hydromon-net -e CASSANDRA_SEEDS=hydromon-cassandra-1 cassandra -Dcassandra.replace_address_first_boot=<dead_node_ip>

Levantar un cluster de Cassandra con volúmenes persistentes

  1. Crear una Docker network: docker network create hydromon-net.
  2. Crear el o los directorios donde residirá toda la información de los nodos de Cassandra.
  3. Iniciar un container de Cassandra: docker run -v /my/own/datadir:/var/lib/cassandra --name hydromon-cassandra-1 --net hydromon-net -d cassandra.
  4. Para agregar nuevos containers ejecutar: docker run -v /my/own/datadir-2:/var/lib/cassandra --name hydromon-cassandra-2 -d --net hydromon-net -e CASSANDRA_SEEDS=hydromon-cassandra-1 cassandra
  5. Si se desean agregar más nodos al cluster repetir el paso 2 cambiando el nombre de cada nodo.
  6. Crear el keyspace en la base de datos: CREATE KEYSPACE hydromon WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };

¿Cómo revivir un nodo caído con su volumen?

Solo es necesario identificar el nodo que se detuvo y reiniciarlo con docker start hydromon-cassandra-<node-number>.

¿Cómo revivir un nodo caído sin su volumen?

  1. Identificar el nodo caído.
  2. Es probable que sea necesario eliminar el container previamente creado si se necesitan cambiar los parámetros del docker run.
  3. Ejecutar Ejecutar docker run -v /my/own/datadir-<number>:/var/lib/cassandra --name hydromon-cassandra-<number> -d -net hydromon-net -e CASSANDRA_SEEDS=hydromon-cassandra-1 cassandra -Dcassandra.replace_address=<dead_node_ip>.

¿Cómo revivir tres nodos caídos con sus volúmenes?

Si todos los nodos de un cluster se detuvieron se deben reiniciar los mismos en el siguiente orden:

  1. Primero el o los nodos tipo SEED ya que si se reinicia alguno no seed no podrá conectarse al cluster.
  2. Reiniciar el resto de los nodos. El orden en estos no es importante.

Levantar un cluster de Cassandra en uno o más cloud providers

Este escenario tiene como requisito preliminar que todas las máquinas virtuales o instancias puedan comunicarse entre sí en todos los puertos que Cassandra necesita.

El cluster se inicia de forma similar a lo explicado en puntos anteriores con la salvedad de que ahora cada nodo del cluster deberá anunciar en que IP está escuchando. Esto es porque al correr en Docker tienen su dirección detrás del Docker bridge.

Suponiendo un cluster de tres nodos con las IPs 10.41.41.41, 10.42.42.42, 10.43.43.43, se deben seguir los pasos indicados a continuación:

  1. docker run --name hydromon-cassandra-1 --net hydromon-net -e CASSANDRA_BROADCAST_ADDRESS=10.41.41.41 -p 7000:7000 -p 9042:9042 -d cassandra.
  2. docker run --name hydromon-cassandra-2 --net hydromon-net -e CASSANDRA_BROADCAST_ADDRESS=10.42.42.42 -p 7000:7000 -p 9042:9042 -e CASSANDRA_SEEDS=10.41.41.41 -d cassandra.
  3. docker run --name hydromon-cassandra-3 --net hydromon-net -e CASSANDRA_BROADCAST_ADDRESS=10.43.43.43 -p 7000:7000 -p 9042:9042 -e CASSANDRA_SEEDS=10.41.41.41 -d cassandra.

Aclaraciones