Se realiza el uso de una biblioteca de RAFT consensus en este caso el
repositorio de dragonboat, el objetivo de estos algoritmos es proporcionar tolerancia a fallos y permitiendo que el sistema continue funcionando mientras los servidores siguen funcionando.
1. Hello World
Se realiza la ejecución del algoritmo habilitando el uso de las terminales y
el uso de los nodos indicados en la página de referencia GitHub donde encontramos esta biblioteca Dragonboat.
Se puede evidenciar que en este caso el nodo N° 3 hace de servidor para
dicho algoritmo. Adicionalmente se puede notar que la comunicación se puede realizar entre los nodos y todos van a recibir las peticiones y contendrán de una instancia que realiza la actualización del conteo de las peticiones realizadas por los distintos nodos. En esta instancia se hace el reinicio de un nodo, en este mismo nodo indicamos la adición al cluster de un nuevo puerto de escucha para el algoritmo en proceso, una vez realizado el comando “add localhost:63100 4” nos dirigimos a abrir una terminal nueva que contendrá parámetros como “-join” para que así pueda comunicarse con el nodehost.
Realizamos pruebas de peticiones para evidenciar la interacción entre los
demás nodos del algoritmo. Finalmente realizamos le remoción de este nodo que se agregó al cluster, y hacemos la respectiva prueba de realizar una petición y que los demás nodos interpreten el mensaje enviado en determinada terminal en uso. 2. State Machine
Para este ejemplo es necesaria la interfaz StateMachine para administrar
datos de aplicaciones, instancia que fue utilizada en el ejemplo anterior de Helloworld.
Como primer paso implementamos los métodos Update y Lookup para
manejar las actualizaciones y consultas entrantes. En este ejemplo hay un único entero para representar el estado de StateMachine denominado Count, el cual se incrementa cada vez que se invoca Update.
En el método Update se van cargando las entradas con fines de
demostración, por otro lado, Lookup, es un método solo de lectura para consultar en que estado se encuentra StateMachine. En este ejemplo colocamos el valor Count en un segmento de byte y posteriormente se retornó.
SaveSnapshot es un método únicamente de lectura por lo que no interfiere
en que cambie el estado del StateMachine, de igual forma se utiliza para implementar operaciones de guardado y carga de instantáneas al igual que RecoverFromSnapshot. 3. Multiple Raft Groups Se inician tres instancias del programa de ejemplo en la misma máquina pero en tres terminales diferentes usando el comando: “./example- multigroup -nodeid 1”, se usa el mismo comando en los 3 ejemplos cambiando el nodo que se identifica por los valores de NodeID especificados en cada línea de comando. Al igual que el ejemplo anterior de helloworld, se puede mandar un mensaje en cada una de las terminales y dicho mensaje se retorna en los otros nodos. 4. On Disk State Machine
En este ejemplo del dragonboat se abren las tres instancias y cuando se
produce la conexión entre ellas se puede modificar el valor asignado en el cluster con el comando put key (value), para verificar que se haya modificado se puede obtener en los otros nodos la llave que esta almacenada con el comando get key.
La diferencia que se presenta entre este ejemplo y los anteriores es que
en este no se generan peticiones entre cada uno de los nodos, pero estos si pueden modificar el valor almacenado.