Presentación para la asignatura de modelado, diseño e implementación de servicios Web, de un proyecto para la replicación y alta disponibilidad de aplicaciones utilizando como base el algoritmo Paxos.
2. ¿Qué es Paxos?
Replicación =>Alta Disponibilidad
•Consenso
Es un algoritmo que tiene los siguientes
objetivos
3. Paxos:Replicación
Varias máquinas han de alcanzar el mismo
estado en algún instante de tiempo.
Si tenemos n máquinas, todas ellas deberán
alcanzar un estado común.
4. Paxos:Replicación
Esto en un principio parece sencillo,pero...
Si hay varios usuarios conectados al mismo
tiempo... ¿Quién va primero?
6. Paxos:Replicación
No se puede asegurar que las dos máquinas
reciben las peticiones en el mismo orden.
La máquina 1 puede recibir la petición Naranja
y Azul.
La máquina 2 puede recibir la petición Azul y
Naranja.
¡Existe inconsistencia!
7. Paxos:Replicación
Para que todos los ordenadores reciban las
peticiones en el mismo orden se necesita algo
que elija dicho orden.
9. Paxos:Consenso
Todos los procesos han de llegar a un
acuerdo, para decidir que operación se
realiza.
Para esto se realiza una votación.
10. Paxos:Votación
Un proceso propone una operación para una
posición a unos procesos del sistema.
Estos procesos deciden si están a favor o no.
Si la mayoría está a favor se acepta la
operación.
13. Paxos:Réplicas
Endpoint de entrada para los clientes.
Sobre la misma se implementa la aplicación
que deseamos replicar.
Internamente recibe las peticiones, las ordena
en diferentes posiciones y las envía a
votación.
Una vez votada la operación , el programa la
procesa y se retorna al cliente.
15. Paxos:Réplicas
Al recibir las peticiones, observa la posición
más pequeña entre aceptadas y propuestas
que no tienen valor.
Introduce las operaciones para proponer en
dicha posición.
Se asegura que al menos una de las
propuestas en X será aceptada en X.
18. Paxos:Réplica
Cuando una operación es aceptada, se
proponen las operaciones pendientes en el
siguiente slot libre.
Se procesa la operación aceptada y se
retorna al cliente.
¡No tienen porque coincidir con el orden de
envío del cliente!
20. Paxos:Réplica
Una réplica recibe una operación aceptada
para una posición que no ha propuesto, y
posterior a las que propone.
La réplica ha de almacenar pero no ejecutar
dicha operación.
Cuando decida una operación, ejecutará
todas las operaciones en orden secuencial.
21. Paxos:Réplica
Se asegura que todas las operaciones se
ejecutan en el mismo orden.
¡¡Incluso si se reciben en orden desordenado!!
25. Paxos:Líderes
Son los encargados de inicializar las
votaciones de las peticiones.
Reciben mensajes de las réplicas. Si el
mensaje no ha sido decidido entonces inician
la votación.
28. Paxos:Líderes
Cada votación se realiza dentro de un espacio
llamado ballot.
Varias peticiones pueden pertenecer a un
mismo ballot.
Pero un ballot solamente pertenece a un líder.
¡Así se evitan colisiones!.
29. Paxos:Líderes
Cada líder posee un ballot.
El ballot se identifica por un número
secuencial y el nombre del líder.
Ante una votación se comparan los valores
del ballot.
Gana aquel que tiene un ballot mayor.
33. Paxos:Líderes
Un líder con un ballot inferior recibe de sus
votantes un PREEMPT.
Es decir, se le ofrece la posibilidad de
aumentar su ballot y tomar el control.
Simplemente ha de aumentar su ballot una
unidad por encima del ballot actual.
36. Paxos:Líderes
Al recibir el PREEMTED, el líder aumenta su
ballot y realiza de nuevo la votación.
¡¡Pero ha de votar con el mismo valor ya
adoptado!!
Así se asegura que todos los líderes votan el
mismo valor para la misma posición incluso en
diferentes ballots.
37. Paxos:Líderes
Esto conlleva otro problema.
Cada vez que hay una colisión, un líder
aumenta su ballot y realiza de nuevo la
petición.
¡El número de mensajes aumenta en función
del número de Líderes!
Más Líderes => Más mensajes => Menor rendimiento.
38. Paxos:Líderes
La duplicidad de los líderes se permite para
aumentar la disponibilidad del sistema.
Si hay un líder y este cae el sistema no
avanzaría.
Con varios líderes se resuelve.
Vale...muy bien,
¿pero el
rendimiento?
39. Paxos: Líderes
El mejor rendimiento se obtiene con un único
líder.
Para acercarse a este rendimiento sin perder
la disponibilidad...
Si un líder recibe PREEMPTED, se mantiene
dormido durante un intervalo T.
Al finalizar dicho intervalo toma el control.
40. Paxos:Líderes
De esta forma los líderes se van
intercambiando el control, y el número de
colisiones se ve disminuida.
41. Paxos:Líderes
Espera un momento... antes has dicho una
cosa...
Después de recibir un PREEMPTED el líder
aumenta su ballot y propone el valor ya
aceptado en la posición...
43. Paxos:Líderes
Es más... Si aparece un líder nuevo, este no
sabe que se ha votado y puede dar todo el
rato “palos de ciego”.
¿Como consigue conocer todo el estado del
sistema y así “estar al día”?
45. Paxos:Aceptores
Los aceptores tienen dos propósitos en
Paxos:
1.Votar las peticiones de los líderes.
2.Actuar como la memoria principal del sistema,
almacenando todas las peticiones aceptadas.
51. Paxos:Aceptores
Para evitar esta situación es necesario
realizar una replicación de los aceptores, para
asegurar que siempre estén disponibles.
Es necesario que existan siempre al menos
(f/2)+1 aceptores funcionando, donde f es el
número de fallos soportados.
54. Paxos:Aceptores
El líder envía su petición y el ballot a todos los
aceptores del sistema.
Los aceptores comparan los ballots:
Si el ballot es mayor acepta la petición y la
almacena.
Si es inferior manda un PREEMTED al
líder.
57. Paxos:Aceptores
Obligando a que la mayoría de los aceptores
respondan la petición se consiguen dos
objetivos:
Un consenso.
Asegurar que siempre hay un conjunto de
aceptores que conocen todas las
peticiones.
60. Paxos:Arquitectura
El sistema se ejecuta dentro de un clúster de
ordenadores.
En el clúster, al menos los aceptores deben
estar desplegados.
Los líderes y réplicas podrían encontrarse en
una red externa.
62. Paxos:Arquitectura
Se duplica la red y los puntos
de entrada.
Se soportan las caídas de red.
Se consiguen distintos dominios
de fallo: Ante el fallo de un
sistema el resto sigue
disponible.
63. Paxos:Arquitectura
Es necesario que exista un
balanceo de aceptores en cada
dominio.
Se deben de crear nuevos
procesos dinámicamente ,
según las necesidades.
67. Paxos
Conseguir alta disponibilidad.
Si un programa (réplica) cae, seguirá otro
funcionando con el mismo estado.
El sistema podría crear tantas réplicas como
sean necesarias en cada momento.
68. Paxos
Permite realizar un “balanceo” de las
peticiones.
Un número N de réplicas pueden conectarse a
un Líder L1.
Un número N’ de réplicas pueden conectarse
a un Líder L2.
Si ambos líderes tienen en común los
aceptores, ambos tendrán la misma
información.
71. Paxos
Todas las réplicas tienen un punto de entrada
al sistema.
Pero todos los puntos de entrada comparten
la misma memoria, por lo que tienen el mismo
estado.
73. Paxos:Demo
Se ha realizado una implementación del
algoritmo sobre CoffeeScript.
Se ha realizado una aplicación web que utiliza
dicha implementación para replicar su estado.
75. Paxos:Demo-Servidor
El servidor realiza dos acciones.
Contiene un servidor HTTPs, ofrece al
exterior un servicio REST con un conjunto
de aplicaciones.
Procesa las operaciones y guarda los datos
en una BBDD MongoDB.
80. Permite al usuario subir ficheros a la “nube”.
El usuario puede listar , subir y borrar los
ficheros.
Todos los ficheros son replicados en
diferentes servidores
Vale..es una copia descarada de DropBox.
81. El servicio REST que ofrece tiene las
siguientes acciones:
LIST => Obtiene una lista de todos los
ficheros. Realiza una petición GET.
UPLOAD => Sube un fichero al
sistema.Realiza una petición PUT.
82. DOWNLOAD => Descarga un fichero al
sistema. Realiza una petición GET.
DELETE => Elimina un fichero del
sistema.Realiza una petición DELETE.
83. El servidor utiliza HTTPs con el fin de
encriptar la comunicación.
Para asegurar que una petición se refiere a un
fichero de un usuario en concreto... Se puede
enviar el mensaje con un token vinculado a la
sesión del usuario. Si no coincide no tiene
derechos sobre el mismo.
86. app.get '/list', ( req , res ) =>
result = ( msg ) ->
res.set('Content-Type','application/json')
msg = JSON.parse msg
msg = {operation:'LIST',result:msg.body.result} res.send(msg)
Stub.sendOperation('READ',{type:'LIST'}).then result
Servicio REST: Listar Ficheros
87. app.get '/file', (req , res ) =>
result = ( msg ) ->
msg = JSON.parse msg
result = msg.body.result
res.set('Content-Type','application/json')
msg = {operation:'DOWNLOAD',result:result}
res.send(msg)
Stub.sendOperation('READ',{type:'DOWNLOAD',id:req.query.id}).then result
Servicio REST: Descargar Fichero
88. app.delete '/file' , ( req , res ) =>
result = ( msg ) ->
msg = JSON.parse msg
result = msg.body.result
res.set('Content-Type','application/json')
msg = {operation:'DELETE',result:result}
res.send(msg)
Stub.sendOperation('WRITE',{type:'DELETE',id:req.query.id}).then result
Servicio REST: Eliminar Fichero
89. En el cliente se utiliza Guzzle.
Un API sobre PHP que facilita la creación y
consumo de servicios web utilizando REST.
90. MyBox: Guzzle
$client = new Client("https://127.0.0.1:3000");
//crea el tipo de cliente y forma la query
$request = $client->delete("file");
$request->getQuery()->add("id", $id);
//utilizado para no comprobar el certificado SSL
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYHOST, false);
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, false);
//Se envía la petición y se procesa el resultado en JSON
$response = $request->send();
$data = $response->json();
$data = $data['result'];
$data = json_decode($data,true);