🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶 🐱🐶🐱🐶🐱🐶
We know you love our work, and we are proud you use it as help, but please be good people and dont copy our font code
🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶🐱🐶 🐱🐶🐱🐶🐱🐶
See you, the team 😏
- Video Introductorio
- Fase 1
- Fase 2
- Diagrama de Navegacion
- Diagrama de Entidad-Relacion
- Diagrama UML de Entidades
- Diagrama de clases
- Fase 3
- Fase 4
- Instalacion de Vagrant
- Instrucciones para la instalacion de HAProxy para Servicio Web
- Instrucciones para la instalacion de HAProxy para Servicio Interno
- Instrucciones para la instalacion de Bases de datos
- Instalacion e Implementacion de Hazelcast
- Fichero Batch de Arranque
- Diagrama de la Infraestructura desplegada
- Fase 5
- Integrantes
Este proyecto está dirigido a usuarios aficionados a los videojuegos. Se trata de una web donde encontrarás información relativa a cualquier juegos como puede ser su trama, la compañía o la puntuación que les ha otorgado los usuarios. Además podrás ojear los eventos de videojuegos que se celebrarán próximamente y hacerte tus propias listas en tu perfil con los juegos que te interesen.
-
Parte pública: El usuario podrá navegar por las entidades de Juego, Compañía, Evento o Artículo.
-
Parte privada: Para acceder a esta parte, primero se creará una cuenta del que se recibirá una notificación por el servicio de correo electrónico para confirmar el registro. Una vez iniciada la sesión, el usuario tendrá dispopnible la parte privada para poder puntuar o comentar los juegos/compañías/eventos/artículo, así como ojear o modificar sus listas de juegos. También tendrá el usuario su perfil en el que podrá cambiar de correo electrónico o contraseña. En cuanto al administrador, podrá crear fichas de juegos, compañías, eventos o artículos.
- Usuario: Se distinguirá entre usuario registrado, no registrado y administrador. Éste portará un Id, un Correo, un Nombre de usuario, una Contraseña, una Fecha de Nacimiento, una Foto de perfil y su Rol. Cada usuario registrado tendrá sus propias listas de juegos.
- Juego: Portará un Id, Nombre, Género, Fecha de Salida, Descripción, Compañía, Puntuación, Imagen y Url de la web oficial. También contendrá su correspondiente lista de comentarios.
- Compañía: Información de la compañía encargada de desarrollar juegos, ya sea indie o empresa grande. Contiene Id, País, Fecha de Fundación y Descripción. Tiene su propia lista de juegos y comentarios.
- Evento: Contendrá un Id, Fecha, Lugar, Precio, Descripción y una Imagen. Puede contener comentarios realizados por los usuarios.
- Comentario: Cada usuario podrá aportar su opinión sobre cualquier juego, compañía, evento o artículo. Éste portará un Id, Usuario y el propio Texto.
- Artículo: Éste portará un Id, Usuario, Título, Copete, Cuerpo e Imagen. Todos los usuarios registrados podrán comentar en ellas, y los administradores podrán crear artículos.
- Lista: Contiene una serie de juegos al gusto del usuario. Éste portará un Id, Nombre y Lista de juegos.
El servicio interno implementado consiste en que nuestra aplicación web se comunique con nuestro servicio de correos interno mediante API REST. Su función es simplemente enviar un correo de bienvenida y confirmación a los nuevos usuarios registrados.
En el siguiente diagrama se puede visualizar la accesibilidad entre las distintas páginas:
En esta fase no se ha diferenciado las partes privada y pública. Sin embargo, el funcionamiento de la parte privada, será la posibilidad de visualizar las listas propias, creadas por el usuario, así como el acceso a su propio perfil para configurarlo o visualizar ciertos detalles de él.
A continuación se dispone de la captura de las distintas pantallas citadas en el diagrama:
Pantalla principal donde se muestra por medio de un carousel imagénes de los juegos más destacados de la actualidad. Debajo del carousel podremos visualizar los últimos artículos escritos y los juegos más populares de la web. Y en el Navbar están las distintas páginas donde podemos navegar así como los placeholders para hacer login y búsqueda.
En caso de que hayamos introducido correctamente los datos de un usuario existente entonces saldrá el nombre del usuario en el Navbar y podremos desplegarlo para acceder a mi perfil para modificar mis datos personales. También podremos acceder a mi lista de juegos o hacer logout para cerrar sesión.
Si quisieramos crear un nuevo usuario simplemente tendríamos que rellenar el formulario para registrar un nuevo usuario dentro de la base de datos.
Para los eventos de videojuegos hemos implementado un calendario del que nos marcará todos los eventos disponibles en la base de datos.
La ficha de evento donde contiene la información esencial de cada evento. En caso de que hayamos iniciado sesión también podremos comentar nuestra opinión sobre dicho evento.
La lista de juegos muestra todos los juegos registrados y gracias al uso de las consultas en repositorio podremos ordenarlos de distintas maneras.
La ficha de juego contiene la información esencial de cada juego. En caso de que hayamos iniciado sesión también podremos comentar nuestra opinión sobre dicho juego o agregarlo a nuestra propia lista.
La lista de compañías muestra todas las compañias que han desarollado los juegos expuestos en la página, y gracias al uso de las consultas en repositorio podremos ordenarlos de distintas maneras.
La ficha de compañía contiene la información esencial de cada compañia. En caso de que hayamos iniciado sesión también podremos comentar nuestra opinión sobre dicha compañía.
Aporta la información correspodiente al usuario, siendo su nickname, su contraseña, su cumpleaños y su email.
La información del usuario puede ser modificada, pulsando el boton "change" correspondiente al atributo deseado, e insertando la nueva información.
Esta sección del usuario muestra las distintas listas de juegos que ha creado personalmente a su interés.
Para poder crear una nueva colección de juegos, será necesario crear una nueva lista, insertándole un nombre para identificarla.
Para añadir un juego a una lista, el usuario registrado, deberá dirigirse al juego en sí, seleccionar la opción de añadir a lista, y especificar en que lista guardar el juego.
Desde la página principal se puede acceder a uno de los artículos expuestos, ampliando la información de la noticia. Podrá comentar en caso de haber iniciado sesión.
Si el administrador inicia sesión en su cuenta, en la sección desplegable de su usuario tiene la opción Admin Features donde se le dirige a la pantalla expuesta en la imagen. En esta página mediante un formulario puede añadir un juego, compañía, evento, artículo o eliminar un elemento del tipo de entidad expuesto ya existente.
En el siguiente diagrama se puede visualizar un modelo de datos donde se representan las entidades de un sistema de información así como sus interrelaciones y propiedades.
En el siguiente diagrama UML se puede visualizar los distintos atributos de las entidades y cómo están relacionados entre sí.
Mediante ObjectAid UML Diagram,se ha adquirido un esquema inicial, que posteriormente ha sido simplificado y complementado con los templates. Su leyenda sería la siguiente:
- ____Controller: clase de tipo @Controller
- ____Configuration: clase de tipo @Configuration
- ____Repository: clase de tipo @Repository
- UserRepositoryAuthenticationProvider: clase de tipo @Component
- Event, Company, Article, Comment, User, MyList & Comment: clase de tipo @Entity
Para poder desplegar la aplicación, es necesaria la instalación previa de una máquina virtual VMWare con el Sistema Operativo Ubuntu 14.04
Tras su instalación, se le ha de añadir mediante consola
-
Java
sudo apt-get update
sudo apt-get install default-jre
sudo apt-get install default-jdk
-
mySQL
sudo apt-get update
sudo apt-get install mysql-server mysql-client
- como contraseña se le colocará:
gugus
sudo mysql_secure_installation
- Tras su correcta instalación, se instalará mySQL Workbench
sudo apt-get install mysql-workbench
-
Base de Datos
- se inicia mySQLWorkbench y se crea una nueva conexión con nombre 'gamesinfo_db'
- se crea un nuevo schema con nombre 'gamesinfo_db' aplicando los cambios
Para crear los ficheros jar, se ha de iniciar Spring Tool Suite abriendo los proyectos determinados. En él, nos dirigimos en cada proyecto a Run As > Maven built...
apareciendo la siguiente ventana:
En dicha ventana, en la seccion Goals se ha escribir: clear package
y acto seguido, pulsar en run. Tras la notificación por consola, de la correcta compilación y construcción del 'jar', se puede recoger dentro de la carpeta target (situada en la propia carpeta del proyecto):
Los ficheros jar se pasan a la máquina virtual, mediante un dispositivo de almacenamiento USB, especificando a la máquina virtual (tras introducir los ficheros en el dispositivo) la detección del dispositivo en el entorno: VM > Removable Devices > USB > Connect (Disconnect from Host)
.
Acto seguido, vía terminales, se arrancan el servicio de mensajería y la propia aplicación mediante el comando java -jar fichero.jar
:
Tras comprobar el correcto inicio de ambas aplicaciones, nos dirigimos al icono de internet de la barra de tareas, y mediante click derecho a él, seleccionamos Connection Information
, apareciendo la siguiente ventana:
Finalmente nos dirigimos a un navegador web (fuera de la máquina virtual) e insertamos la dirección IPv4 de la máquina virtual seguido del puerto de conexión. En nuestro caso: https://192.168.42.131:8443/
En esta sección inicializamos tanto el MailService como la propia aplicación web siguiendo los pasos indicados en el apartado anterior. Tras arrancar la página web en el navegador, si uno se dirige a Register nos llevará al html new_user y rellenamos los datos.
Se rellenan los datos del usuario que se desea registrar, empleando en este caso un correo electrónico generado por Fake Mail Generator para realizar la demostración.
Tras el correcto registro, se puede observar, que efectivamente se ha creado el usuario y además se ha recibido un correo.
En caso de que el nombre de usuario o el correo ya existan previamente, te redirigirá de nuevo a la página de nuevo usuario sin completar el registro previo.
Para poder duplicar y separar los distintos servicios de la aplicación web (servicio web, servicio interno y bases de datos), fue necesaria la instalación de Vagrant. Para ello fue necesaria la descarga de Vagrant, así como la descarga e instalación de Virtual Box, todo ello en el Sistema Operativo Host. Tras la ejecución del ejecutable .msi de la propia página de vagrant, se han de realizar los siguientes pasos:
Lo primero a realizar será crear una carpeta con nombre vagrant
en un directorio escogido (en nuestro caso Documents), donde más adelante se creará el vagrant file. A continuación, nos ponemos a instalar Ubuntu 14.04, para ello ejecutamos el siguiente comando desde una ventana de comandos (Ejecutar > cmd
):
vagrant box add ubuntu/trusty64
Tras la correcta instalación se ejecuta el siguiente comando:
vagrant init ubuntu/trusty64
Y finalmente, tras completar la iniciación, se realiza:
vagrant up
Creando el vagrantfile, siendo notificado por consola.
Para declarar una IP privada, es necesario descomentar la línea del fichero vagrantfile, para ello nos dirigimos a la carpeta vagrant
anteriormente creada y abrimos el fichero con un editor de texto como notepad++
:
# config.vm.network "private_network", ip: "192.168.33.10�
Tras guardar el fichero, se puede comprobar su correcto funcionamiento mediante el comando:
ping 192.168.33.10
A continuación, nos dispondremos a configurar el Sistema Operativo creado para tener los programas necesarios para la correcta ejecución de los servicios:
-
Arrancamos el sistema operativo mediante el siguiente comando
-
vagrant ssh
-
Java
sudo apt-get update
sudo apt-get install default-jre
sudo apt-get install default-jdk
-
mySQL
sudo apt-get update
sudo apt-get install mysql-server mysql-client
- como contraseña se le colocará:
gugus
sudo mysql_secure_installation
- Tras su correcta instalación, se instalará mySQL Workbench
sudo apt-get install mysql-workbench
Para poder realizar la división de servicios en distintas máquinas virtuales, es necesario repetir el anterior proceso ocho veces, teniendo una máquina para cada servicio, y en el fichero vagrantfile
declarando distintas direcciones IP, en nuestro caso se han declarado las siguientes direcciones:
-
Servicio Web 1:
192.168.33.10
-
Servicio Interno 1:
192.168.33.11
-
Base de Datos 1:
192.168.33.12
-
Servicio Web 2:
192.168.33.13
-
Servicio Interno 2:
192.168.33.14
-
Base de Datos 2:
192.168.33.15
-
Balanceador Servidor Web:
192.168.33.16
-
Balanceador Servicio Interno:
192.168.33.17
-
Balanceador Servicio Base de Datos:
192.168.33.18
Una vez creadas las nueve máquinas virtuales, es necesario configurar ciertas funcionalidades en las distintas máquinas virtuales.
Debido a que se ha separado la base de datos de la aplicación web, se ha de configurarla para que sea accesible mediante su dirección IP privada, y permitiendo al servicio web acceder a ella. Para ello accedemos inicialmente al archivo my.cnf
localizado en /vagrant/etc/mysql/
permitiendo cualquier tipo de modificación en el fichero:
sudo chmod +rwx my.cnf
Y accediendo mediante el editor:
sudo nano my.cnf
Cambiamos la línea bind address
por la IP privada de la propia máquina virtual, en nuestro caso 192.168.33.12
, quedando como en la siguiente imagen:
Tras su correcto guardado mediante Ctrl + X
y asegurando el guardado y sobreescribiedolo, reiniciamos el servicio mediante:
sudo service mysql service
Una vez el servicio se ha reiniciado, accedemos a la consola de mysql mediante el siguiente comando:
- mysql -u root -p
Y una vez tenemos como path mysql>
se dispone a crear el usuario, recomendamos que sea el mismo que se tiene declarado en el fichero properties del proyecto del servicio web, en nuestro caso root
con contraseña gugus
:
Para ello colocamos en la consola el siguiente comando:
create user usuario@direccion_ip_privada_maquina_servicio_web identified by 'contraseña'
En nuestro caso el comando sería el siguiente:
create user [email protected] identified by 'gugus';
Tras ello, se crea la base de datos (con el mismo nombre que la primera vez que se hizo) con el comando:
create database gamesinfo_db;
Se le aporta todos los permisos posibles al servicio web, sobre dicha base de datos con los comandos:
grant all privileges on gamesinfo_db.* to [email protected];
flush privileges;
Y por si se desea comprobar la correcta creación del usuario, se puede ejecutar el siguiente comando:
select user, host, password from mysql.user;
Saliendo la siguiente información por consola:
Finalmente salimos de la consola de mysql con el siguiente comando:
exit
A diferencia de la máquina de bases de datos, aquí simplemente se tiene que realizar el archivo jar para ello se pueden seguir los pasos indicados en el punto 2 de la Fase 3: Elaboracion del jar.
Una vez creado el fichero .jar
se copia y se pega en el mismo directorio en el que se encuentra el archivo 'vagrantfile' de esta máquina virtual, y se procede a su ejecución. Para ello nos dirigimos al directorio principal mediante el comando:
cd /vagrant
Y en el ejecutamos el .jar con el comando:
java -jar mailService-0.0.1-SNAPSHOT.jar
Lo primero que debemos realizar puesto que la base de datos se encuentra en una máquina virtual distinta a la del servicio web, es cambiar en el fichero properties del proyecto, la línea:
spring.jpa.hibernate.ddl-auto=update
A none
:
spring.jpa.hibernate.ddl-auto=none
Y construir como en el anterior apartado el debido fichero .jar. Tras su construcción se copia y pega en el mismo directorio que el archvo vagrantfile
de esta máquina virtual y se procede a su ejecución con el siguiente comando donde se detallan ciertas propiedades de la aplicación (recordemos que el usuario declarado en la base de datos fue root
y su contraseña gugus
, que la dirección IP de la máquina virtual de la base de datos fue 192.168.33.12
y que la base de datos creada se llama gamesinfo_db
):
java -jar prueba_servidor-0.0.1-SNAPSHOT.jar --spring.datasource.url="jdbc:mysql://192.168.33.12:3306/gamesinfo_db?verifyServerCertificate=false&useSSL=true" --spring.datasource.username="root" --spring.datasource.password="gugus" --spring.jpa.hibernate.ddl-auto="update"
Debido a que Ubuntu 14.04 no soporta la versión estable de HAProxy (v 1.5), se emplea una PPA (Personal Package Archives) para poder realizar la instalación con apt-get
:
add-apt-repository ppa:vbernat/haproxy-1.5
El siguiente paso es actualizar el sistema:
apt-get update
apt-get dist-upgrade
Tras la correcta actualización, se instala HAProxy:
apt-get install haproxy
Debido a que nuestros servidores web emplean certificado y por tanto protocolo https, es necesario generar un certificado para que haproxy permita la redirección a dichos servidores. Para ello lo primero que se hará es crear un directorio donde guardar las claves y certificados:
sudo mkdir /etc/ssl/xip.io
A continuación nos dirigimos a dicho directorio creado para ello realizamos esta serie de comandos:
cd
cd /vagrant
cd /etc
cd ssl
cd xip.io
Y creamos el fichero que contiene la clave privada:
sudo openssl genrsa -out xip.io.key 1024
Tras su creación, se crea el primer certificado con el siguiente comando:
sudo openssl req -new -key xip.io.key \-out xip.io.csr
El cual nos mostrará un formulario que se completará como se ve a continuación:
> Country Name (2 letter code) [AU]:US
> State or Province Name (full name) [Some-State]:Connecticut
> Locality Name (eg, city) []:New Haven
> Organization Name (eg, company) [Internet Widgits Pty Ltd]:SFH
> Organizational Unit Name (eg, section) []:
> Common Name (e.g. server FQDN or YOUR name) []:*.xip.io
> Email Address []:gamesinfourjc@gmail-com
> Please enter the following 'extra' attributes to be sent with your certificate request
> A challenge password []:gugus
> An optional company name []:URJC
Tras ello, creamos el segundo certificado:
sudo openssl x509 -req -days 365 -in xip.io.csr \-signkey xip.io.key \-out xip.io.crt
Tras su finalización se podrá comprobar mediante el comando 'dir' que se tienen los siguientes ficheros en el directorio:
xip.io.key
xip.io.csr
xip.io.crt
Finalmente se crea el certificado necesario para haproxy, creado a partir de xip.io.key
y xip.io.crt
, mediante el comando:
sudo -s cat xip.io.crt xip.io.key \ | sudo tee xip.io.pem
Completando este último comando, se puede comprobar que además de contener los tres ficheros anteriores, ahora también se contiene a xip.io.pem
.
En el caso de que se haya perdido un paso, tiene más información en este enlace y en este enlace.
Una vez se ha notificado la correcta instalación, nos disponemos a configurar HAProxy. Para ello nos dirigimos a /etc/haproxy
y allí, se aprueban los permisos del archivo haproxy.cfg
:
chmod +rwx haproxy.cfg
Y se procede a editarlo:
sudo nano haproxy.cfg
En él se añaden las siguientes líneas:
-
Debajo de daemon:
maxconn 3072
-
En la sección defaults:
option forwardfor
option http-server-close
-
Y se crea una nueva sección añadiendo:
listen haproxy
bind 0.0.0.0:443 ssl crt /etc/ssl/xip.io/xip.io.pem
mode http
stats enable
stats uri /haproxy?stats
balance roundrobin
option http-server-close
option forwardfor
reqadd X-Forwarded-Proto:\ https
reqadd X-Forwarded-Port:\ 443
option forwardfor if-none
option abortclose
server nombre1 direccionIP:Puerto
server nombre2 direccionIP:Puerto
...
HAProxy ofrece principalmente tres algoritmos de balanceo:
- Basado en Round Robin: el balanceador selecciona a los distintos servidores por turnos
balance roundrobin
- Basado en el numero de conexiones: el balanceador selecciona el servidor con menor número de conexiones, empleando Round Robin en aquellos empatados
balance leastconn
- Basado en la IP origen y/o destino: el balanceador selecciona el servidor en función del seleccionado inicialmente a un usuario.
balance source
Puesto que en esta aplicación web se realiza el uso de tokens, para eviar la pérdida de ellos, se empleará el algoritmo basado en la IP origen y/o destino, sustituyendo por tanto el roundrobin
por source
.
El archivo debería quedar como se observa en la imagen de a continuación:
Finalmente se guarda el archivo mediante Ctrl + X
, afirmando que se está seguro de guardar, y sobreescribiendo el archivo. Y se reinicia el servicio:
sudo service haproxy restart
Tras la notificación del correcto reinicio, se procede a arrancar HAProxy:
sudo service haproxy start
Una vez el terminal notifica su inicio, ya se puede uno dirigir a un navegador y colocar la dirección local seguida de /haproxy?stats
en nuestro caso sería https://192.168.33.16:443/haproxy?stats
para poder observar los datos del balanceador:
Debido a que Ubuntu 14.04 no soporta la versión estable de HAProxy (v 1.5), se emplea una PPA (Personal Package Archives) para poder realizar la instalación con apt-get
:
add-apt-repository ppa:vbernat/haproxy-1.5
El siguiente paso es actualizar el sistema:
apt-get update
apt-get dist-upgrade
Tras la correcta actualización, se instala HAProxy:
apt-get install haproxy
Una vez se ha notificado la correcta instalación, nos disponemos a configurar HAProxy. Para ello nos dirigimos a /etc/haproxy
y allí, se aprueban los permisos del archivo haproxy.cfg
:
chmod +rwx haproxy.cfg
Y se procede a editarlo:
sudo nano haproxy.cfg
En él se añaden las siguientes líneas:
-
Debajo de daemon:
maxconn 3072
-
En la sección defaults:
option forwardfor
option http-server-close
-
Y se crea una nueva sección añadiendo:
listen haproxy
bind 0.0.0.0:80
mode http
stats enable
stats uri /haproxy?stats
balance source
option httpclose
option forwardfor
server nombre1 direccionIP:Puerto
server nombre2 direccionIP:Puerto
...
El archivo debería quedar como se observa en la imagen de a continuación:
Finalmente se guarda el archivo mediante Ctrl + X
, afirmando que se está seguro de guardar, y sobreescribiendo el archivo. Y se reinicia el servicio:
sudo service haproxy restart
Tras la notificación del correcto reinicio, se procede a arrancar HAProxy:
sudo service haproxy start
Una vez el terminal notifica su inicio, ya se puede uno dirigir a un navegador y colocar la dirección local seguida de /haproxy?stats
en nuestro caso sería http://192.168.33.17/haproxy?stats
para poder observar los datos del balanceador:
Debido a que ahora el mail service se accede desde el balanceador, en el código de la aplicación web en lugar de especificar la dirección IP del servicio interno determinado, especificamos la dirección IP de este balanceador.
Para poder tener consistencia en ambas bases de datos, necesitamos que una de las bases escuche a la otra, teniendo la jerarquía de Maestro-Servidor. En nuestro caso el Maestro será la máquina virtual con dirección IP 192.168.33.12
, y el Esclavo será la máquina virtual con dirección IP 192.168.33.15
.
Nos dirigimos al fichero my.cfg
situado en /vagrant/etc/mysql/
mediante el editor (sudo nano my.cfg
) habiendo habilitado los
permisos previamente (chmod +rwx my.cfg
). En él descomentamos, modificamos o añadimos las siguientes instrucciones:
server-id=1
log-bin=mysql-bin
sync_binlog=1
max-binlog-size=500M
expire_logs_days=4
innodb_flush_log_at_trx_commit=1
Y una vez guardado el fichero (Ctrl + X
), reiniciamos el servicio de mysql con:
sudo service mysql restart
Tras ello, nos dirigimos inicialmente al directorio principal (cd /vagrant
) y allí nos dirigimos a mysql (mysql -u root -p
) y
realizamos los siguiente comandos:
CREATE USER root IDENTIFIED BY 'gugus';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.33.15' IDENTIFIED BY 'gugus';
flush privileges;
Con ello creamos el usuario esclavo que pertenecerá al segundo servidor. Ahora toca realizar una copia de la base de datos, primero en mysql con:
use gamesinfo_db;
FLUSH TABLES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Con esta última instrucción debería de salir algo simmilar a la siguiente imagen, por consola:
Nos debemos quedar con los dos valores impresos, para emplearlos más adelante. A continuación salimos de mysql, retornando al
directorio vagrant (/vagrant
). Allí realizamos el siguiente comando, mediante el cual nos aparecerá en la carpeta de la máquina
virtual (en nuestro caso C:/Users/guille-hp/Documents/vagrant/base_de_datos_1
) el fichero '.sql':
mysqldump -u root -p gamesinfo_db >gamesinfo_db.sql
Dicho fichero '.sql' lo copiamos y pegamos en la carpeta de la segunda máquina con Base de Datos (en nuestro caso C:/Users/guille- hp/Documents/vagrant/base_de_datos_2
). Y nos trasladamos a la segunda máquina.
Nos dirigimos al fichero my.cfg
situado en /vagrant/etc/mysql/
mediante el editor (sudo nano my.cfg
) habiendo habilitado los
permisos previamente (chmod +rwx my.cfg
). En él descomentamos, modificamos o añadimos las siguientes instrucciones:
server-id=2
relay-log=mysqld-relay-bin
max-relay-log-size=500M
relay_log_purge=1
Y una vez guardado el fichero (Ctrl + X
), reiniciamos el servicio de mysql con:
sudo service mysql restart
Tras ello, nos dirigimos inicialmente al directorio principal (cd /vagrant
) y allí realizamos el siguiente comando que importará la base de datos:
mysql -u root -p gamesinfo_db < gamesinfo_db.sql
Tras ello, nos dirigimos a mysql (mysql -u root -p
) y realizamos los siguiente comandos:
CHANGE MASTER TO MASTER_HOST='192.168.33.12',
-> MASTER_USER='root',
-> MASTER_PASSWORD='gugus',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=727,
-> MASTER_PORT=3306;
En el comando anterior, debemos remarcar que en los campos MASTER_LOG_FILE y MASTER_LOG_POS se coloquen los dos datos
observados en el apartado anterior, al realizar el comando SHOW MASTER STATUS
sobre el terminal mysql de la primera máquina
virtual. El comando quedaría semejante al de la siguiente imagen:
Y tras dicho comando ejecutamos:
START SLAVE;
UNLOCK TABLES;
Si se desea comprobar el correcto funcionamiento del esclavo, se emplea el siguiente comando en mysql (mysql>
):
SHOW SLAVE STATUS\G
El cual mostrará un listado de datos. Se puede mirar el valor Seconds_Behind_Master que indica qué retraso tiene el servidor esclavo respecto al maestro (si es NULL se trata de mal funcionamiento. Revisando el Slave_IO_State y Last_Error).
Tras ello nos dirigimos al fichero properties de la aplicación web, dónde cambiamos la url de database al siguiente formato:
jdbc:mysql:replication://address=(protocol=tcp)(host=192.168.33.18)(port=3306)(type=master), address=(protocol=tcp)(host=192.168.33.18)(port=3307)(type=slave)/gamesinfo_db?verifyServerCertificate=false&useSSL=true
Haciendo que la aplicación escriba los nuevos elementos en el servidor maestro y que lea los datos desde el servidor esclavo.
Para evitar perder la sesión durante la caída de un servidor se emplea la replicación de sesión mediante Hazelcast, empleando una caché distribuida entre los servidores presentes en un balanceador:
Para poder emplear Hazelcast en nuestro proyecto de la aplicación web, es necesario insertar las siguientes dependencias en el fichero pom.xml
:
- Jackson Core:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
- Jackson Datatype:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.5.3</version>
</dependency>
- Springframework Session:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
- Hazelcast:
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>3.9.3</version>
</dependency>
- Hazelcast Spring:
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-spring</artifactId>
<version>${hazelcast.version}</version>
</dependency>
- Hazelcast WM
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-wm</artifactId>
<version>${hazelcast.version}</version>
</dependency>
Para hacer funcional Hazelcast en nuestro proyecto, despues de haberlo actualizado mediante Maven > Maven Update
, nos dirigimos a la clase principal del proyecto e insertamos el siguiente @Bean
, donde las dos direcciones IP presentes son las de los dos servidores que portarán esta aplicación:
@Bean
public Config config() {
Config config = new Config();
JoinConfig joinConfig = config.getNetworkConfig().getJoin();
joinConfig.getMulticastConfig().setEnabled(false);
joinConfig.getTcpIpConfig().addMember( "192.168.33.13" ).addMember( "168.192.33.10" ).setEnabled( true );
return config;
}
Para facilitar la creación de las 9 ventanas de comando, y su debido arranque se ha elaborado un script .bat
automatizando brevemente el arranque de las máquinas. Para ello, se crea un fichero .txt, al cual se le cambia la terminación a .bat en el Sistema Operativo Host, y se abre con un editor de texto (en nuestro caso notepad++
). Y en él se escribe la siguiente secuencia de comandos:
@echo off
title Initialization of GamesInfo Program
echo Welcome to GamesInfo! Don't be scared, we're gonna open some vm
rem ----- haproxy
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\haproxy_1 & mode 56, 10 & vagrant up & vagrant ssh"
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\haproxy_2 & mode 56, 10 & vagrant up & vagrant ssh"
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\haproxy_3 & mode 56, 10 & vagrant up & vagrant ssh"
rem ----- server
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\server_1 & mode 85, 10 & vagrant up & vagrant ssh"
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\server_2 & mode 85, 10 & vagrant up & vagrant ssh"
rem ----- mail service
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\servicio_interno_1 & mode 85, 10 & vagrant up & vagrant ssh"
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\servicio_interno_2 & mode 85, 10 & vagrant up & vagrant ssh"
rem ----- database
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\base_de_datos_1 & mode 85, 10 & vagrant up & vagrant ssh"
start cmd /k "cd C:\Users\guille-hp\Documents\vagrant\base_de_datos_2 & mode 85, 10 & vagrant up & vagrant ssh"
cls
echo Now we're gonna open some information's windows.
pause
start "" https://192.168.33.16/haproxy?stats
start "" http://192.168.33.17/haproxy?stats
start "" http://192.168.33.18/haproxy?stats
start "" https://192.168.33.16/
cls
echo Now wait until all the programs are ready, and put them 'vagrant ssh'
pause
exit
En el siguiente diagrama se puede visualizar la infraestructura desplegada de la Aplicación Web:
En esta fase se solicita automatizar el despliegue de la aplicación mediante el sistema de gestión de configuración Ansible. Para ello seguimos los siguientes pasos
Para evitar provocar fallos en el resto de máquinas virtuales, las cuales se encuentran en correcto funcionamiento, se crea una nueva máquina virtual a la que se ha apodado su directorio ansible
, y su dirección Ip ha sido ajustada a 192.168.33.19
(mediante la modificación del fichero Vagrantfile
). En caso de no acordarse de los pasos para crear una máquina virtual e iniciarla con Java y MySQL dirigete a esta seccion.
Una vez teniendo la máquina virtual instalada e inicializada (mediante vagrant up
y vagrant ssh
), procedemos a instalar Ansible. Para ello realizamos el siguiente comando:
sudo apt-add-repository -y ppa:ansible/ansible
sudo apt-get update
sudo apt-get install -y ansible
Finalizada su instalación, nos dirigimos al directorio /etc/ansible
y accedemos al fichero hosts
(sudo nano hosts
), habiendo habilitado previamente los permisos (chmod +rwx hosts
). En él añadimos los distintos servidores con las siguiente serie de instrucciones:
[webservers]
192.168.33.10
192.168.33.13
[internalservers]
192.168.33.11
192.168.33.14
[dbservers]
192.168.33.12
192.168.33.15
[haproxyservers]
192.168.33.16
192.168.33.17
192.168.33.18
[global]
192.168.33.19
Tras ello guardamos el fichero (Ctrl + X
). Y nos dirigimos al fichero ansible.cfg
del mismo directorio (sudo nano ansible.cfg
), habiendo habilitado previamente los permisos (chmod +rwx hosts
). En él descomentamos la línea:
host_key_checking = False
Y guardamos el fichero (Ctrl + X
).
Para poder operar con ansible, es necesario generar una clave privada, para ello nos dirigimos al directorio principal (cd /vagrant
) y comprobamos si tenemos el directorio .ssh
en él (ls -a
). En caso de no tenerlo, lo creamos con el comando:
sudo mkdir .ssh
Y accedemos a él (cd .ssh
). En él ejecutamos el siguiente comando:
ssh-keygen
En él se nos solicitará un nombre para la clave el cual se pondrá id_rsa. Y posteriormente una contraseña con la encriptarlo, en nuestro caso se ha puesto 'gugus' en ambas solicitudes de contraseña. Una vez generadas las claves podemos comprobar su existencia mediante el comando dir
.
A continuación, nos dirigimos al Sistema Operativo Host (en nuestro caso Windows
), y en él al directorio de la máquina (en nuestro caso /Documents/vagrant/ansible
y en él, a la carpeta .ssh
podiendo observar la presencia de las dos claves creadas (id_rsa
y id_rsa.pub
).
Copiamos la clave pública (id_rsa.pub
) y la pegamos en los directorios del resto de máquinas virtuales (los 2 servidores web, los 2 servicios internos, las 2 bases de datos y los 3 balanceadores), sin necesidad de crear carpetas adicionales (junto al VagrantFile
de la máquina determinada).
Para poder comprobar que las conexiones a los distintos servidores se encuentran operables, incialmente arrancamos los 9 servidores, no arrancando sus respectivos ficheros -jar
. Y una vez inicializados, nos dirigimos a la máquina virtual de ansible, en ella al directorio /vagrant/.ssh/
y ejecutamos el siguiente comando por cada servidor que tenemos:
ssh -i id_rsa direccionIPservidor_x
Por ejemplo en el caso de el servidor web 1:
ssh -i id_rsa 192.168.33.10
Tras ello nos solicitará la contraseña de dicha máquina virtual, en el caso de que no se haya modificado la contraseña, se debería insertar la contraseña por defecto de dicha máquina virtual: vagrant
(en nuestro caso se cambiaron todas las contraseñas de las máquinas virtuales mediante el comando passwd
a la contraseña password
). Obteniendo una imagen semejante a la siguiente como resultado:
Finalmente se pueden realizar comandos simples mediante el siguiente comando:
ansible _conjunto -m shell -a "comando_a_ejecutar_las_mv" --private-key id_rsa --ask-pas --ask-sudo-pass
Por ejemplo, si deseamos que todas las máquinas virtuales impriman el mensaje 'hi', realizamos el siguiente comando:
ansible all -m shell -a "/bin/echo hi" --private-key id_rsa --ask-pass --ask-sudo-pass
Mostrando el siguiente resultando:
En el caso de que se qusiese realizar un comando a solo un grupo de máquinas (por ejemplo webservers
) emplearíamos el siguiente comando:
ansible webservers -m shell -a "comando_a_ejecutar_las_mv" --private-key id_rsa --ask-pas --ask-sudo-pass
Y en el caso de que se quisiera realizar más de un comando se emplearía "comando_1 & comando_2 & etc."
.
Una vez comprobado mediante varias pruebas, su correcto funcionamiento, toca crear una seria de documentos llamados playbooks los cuales contienen una serie de instrucciones que inicializan una máquina virtual en caso de posible pérdida. Para ello inicialmente hemos de descargar una serie de paquetes provenientes de la página Ansible Galaxy siendo una biblioteca con playbooks configurados para instalar programas. Los paquetes a descargar e instalar en la máquina virtual de ansible son los siguientes:
Para poder instalar Java 7 y 8 en una máquina, tendremos que dirigirnos a la página de java con más relevancia de Ansible Galaxy mediante este enlace. Ahí el creador nos indica entre otras cosas, que lo hemos de instalar en la máquina virtual de ansible con el siguiente comando:
ansible-galaxy install kbrebanov.java
Tras terminar la instalación, nos indicará que ha creado un fichero en el directorio ./ansible/roles
nombrado kbrebanov.java
siendo un directorio. Debido a que en la aplicación web se tiene una base de datos maestra y una base de datos esclava, vamos a tener
que modificar dos veces ese directorio, para ello creamos dos copias del directorio en el mismo lugar (.ansible/roles
) mediante los
siguientes comandos.
cp -a kbrebanov.java/ ./java_8.java
cp -a kbrebanov.java/ ./java_7.java
Tras comprobar mediante el comando dir
que se han creado correctamente las dos copias del directorio, nos adentramos en
java_7.java (mediante el comando cd
), podiendo observar mediante el comando dir
la presencia de las siguientes carpetas en su
interior:
defaults
meta
README.md
tests
tasks
vars
LICENSE
Nos dirigimos a la carpeta defaults
y en ella, aportando los derechos de modificacion (sudo chmod +rwx main.yml
) procedemos a
la modificación del único fichero en su interior main.yml
(sudo nano main.yml
). En él se nos muestra una configuración de
ejemplo que se tendrá que modificar a nuestro gusto, apoyándonos de la información descrita en la página de su descarga. En dicho fichero introducimos y modificamos, obteniendo la siguiente configuración:
---
# defaults file for java
java_implementation: openjdk
java_openjdk_version: 7
java_openjdk_jre_only: false
java_openjdk_headless: false
java_openjdk_use_ppa: true
java_oracle_version: 7
java_oracle_install_jce_policy: false
Tras ello guardamos el fichero mediante Ctrl + X
.
Regresamos al directorio /vagrant/.ssh
(mediante el comando cd
) y allí creamos el fichero nombre_playbook.yml (mediante el
comando touch nombre_playbook.yml
). Y lo abrimos para editar (sudo nano nombre_playbook
). Este será nuestro fichero de ejecución
de los programas a instalar. Para ello seguiremos la siguiente estructura:
---
- hosts: grupo 1
sudo: yes
roles:
- programa_1
- programa_2
- programa_3
- hosts: grupo 2
sudo: yes
roles:
- programa_1
- programa_2
- programa_3
etc
Una vez tengamos realizado el playbook, lo guardamos (Ctrl + X
) y ejecutamos el siguiente comando el propio directorio:
ansible-playbook nombre_playbook.yml --ask-pass --ask-sudo-pass
En caso de que de un error indicando que no fue posible conectar al puerto 22 de dicha IP, debemos ejecutar el siguiente comando:
ssh-keygen -R ip_maquina_virtual
Y volver a efectuar el comando para ejecutar el playbook.
Doble Grado Diseño y Desarrollo de Videojuegos e Ingeniería de Computadores.
-
Agustín López Arribas:
- E-mail: [email protected]
- Github: Agustwin
-
Zhong Hao Lin Chen:
- E-mail: [email protected]
- Github: lalinlulelo
-
Guillermo Meléndez Morales:
- E-mail: [email protected]
- Github: guillemelmor