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:
- Una instancia de la base de datos Cassandra para guardar las tablas de usuarios y mediciones. Para ejecutarla es necesario cumplir los requisitos mínimos, detallados en la documentación de Cassandra.
- Una API
- Con endpoints para utilización de los nodos de medición. Como pueden ser:
- Consulta de configuración actual
- Envío de nueva medición (tiempo, altura de agua, foto)
- (web) Con endpoints para utilización del panel de administración y vista de mediciones. Como pueden ser:
- Login de usuario
- Get de mediciones
- Post de configuración de medición
- Con endpoints para utilización de los nodos de medición. Como pueden ser:
- Un módulo que sirva como cliente del cluster de Cassandra, el cual pueda ser invocado desde las APIs para hacer queries a cualquier réplica del cluster de Cassandra.
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:
- Crear una Docker network:
docker network create hydromon-net
. - 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 corrersedocker start hydromon-cassandra
. También puede exponerse el puerto 9042 para poder conectarse con el servidor sin que esté corriendo en Docker. - Crear el keyspace en la base de datos:
- Conectarse a Cassandra a través de
cqlsh
:docker run -it --network hydromon-net --rm cassandra cqlsh hydromon-cassandra
. - Crear el keyspace:
CREATE KEYSPACE hydromon WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
- Conectarse a Cassandra a través de
- Compilar el servidor:
make web-api-linux
. - Ejecutar
docker build -t hydromon-server .
. - 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
- Iniciar un container de Cassandra:
docker run --name hydromon-cassandra-1 --net hydromon-net -d cassandra
. - Para agregar nuevos containers ejecutar:
docker run --name hydromon-cassandra-2 -d -net hydromon-net -e CASSANDRA_SEEDS=hydromon-cassandra-1 cassandra
- Si se desean agregar más nodos al cluster repetir el paso 2 cambiando el nombre de cada nodo.
- Crear el keyspace en la base de datos:
CREATE KEYSPACE hydromon WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
- Ingresar a algún nodo activo y ejecutar:
nodetool status
. Registrar la ip del nodo que falló. - Ejecutar
docker rm hydromon-cassandra-x
donde x es el número del nodo que falló. - 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>
- Crear una Docker network:
docker network create hydromon-net
. - Crear el o los directorios donde residirá toda la información de los nodos de Cassandra.
- Iniciar un container de Cassandra:
docker run -v /my/own/datadir:/var/lib/cassandra --name hydromon-cassandra-1 --net hydromon-net -d cassandra
. - 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
- Si se desean agregar más nodos al cluster repetir el paso 2 cambiando el nombre de cada nodo.
- Crear el keyspace en la base de datos:
CREATE KEYSPACE hydromon WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
Solo es necesario identificar el nodo que se detuvo y reiniciarlo con docker start hydromon-cassandra-<node-number>
.
- Identificar el nodo caído.
- Es probable que sea necesario eliminar el container previamente creado si se necesitan cambiar los parámetros del
docker run
. - 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>
.
Si todos los nodos de un cluster se detuvieron se deben reiniciar los mismos en el siguiente orden:
- Primero el o los nodos tipo SEED ya que si se reinicia alguno no seed no podrá conectarse al cluster.
- Reiniciar el resto de los nodos. El orden en estos no es importante.
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:
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
.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
.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
.
- Los nombres de containers son de carácter meramente ilustrativo. No son necesarios para el correcto funcionamiento del cluster.
- Las redes entre containers son distintas, por más de que tengan el mismo nombre, ya que se están ejecutando en instancias / máquinas virtuales diferentes. Se utilizan estas redes para facilitar la conexión entre el nodo y la Web API. Esto también explica por qué es necesario exponer el puerto 9042 que permite que cada Web API se conecte con el resto de los nodos.