¿Qué es un sistema distribuido?
Un sistema distribuido es un conjunto de equipos independientes que actúan de forma transparente actuando como un único equipo.
Su objetivo es descentralizar tanto el almacenamiento de la información como el procesamiento.
Esto lo vemos de cara al uso de Elasticsearch y cómo funciona.
¿Qué ventajas aporta?
Algunas de las ventajas que aporta un sistema distribuido son:
- Mayor eficacia.
- Mayor tolerancia a fallos: al estar distribuida la información en nodos, en caso de que se caiga un nodo, dicha información va a encontrarse replicada en otros nodos.
- Mayor velocidad y procesamiento distribuido: cuando se realiza una consulta, lo procesamientos se dividen entre todos los nodos que forman el sistema distribuido, en lugar de enviarlos a un único nodo y que el mismo tenga que hacer todo el trabajo.
- Escalabilidad: si, por ejemplo, se necesita más procesamiento o añadir más disco duro, en lugar de que los equipos crezcan de forma vertical añadiendo más almacenamiento, RAM o CPU, se añaden equipos de forma horizontal al clúster o sistema distribuido.
¿Qué aporta una base de datos distribuida?
Una base de datos distribuida aporta una serie de ventajas:
- La información se almacenaría físicamente en diferentes sitios de la red, aunque lógicamente, de cara a un usuario final es una única base de datos. Cuando queramos acceder a la información, vamos a lanzar una consulta e internamente ya sabrá dónde está almacenado cada uno de esos datos.
- Independencia respecto al sistema operativo, ya que si el servicio se puede instalar en sistemas operativos Linux o Windows, la base de datos es de forma distribuida y resulta completamente transparente el sistema operativo para el usuario final.
- La información queda fragmentada.
- Las réplicas aportan alta disponibilidad.
Distribución
A continuación veremos cómo se distribuye en Elasticsearch esta información distribuida.
- Suponemos que disponemos de un clúster distribuido de Elasticsearch, que está compuesto por tres nodos.
- A través de una entrada de datos, tenemos toda la información que vamos obteniendo.
- Elasticsearch paquetiza la información y la denomina shard.
- Estos shards que va generando los va a ir distribuyendo entre los distintos nodos.
- Por ejemplo, el primer shard lo coloca en el primer nodo, y para conseguir la alta disponibilidad, que comentábamos antes como una de las ventajas de un sistema distribuido, vamos a establecer que las réplicas sean 1. De esta forma, cuando se indexa la información, se crea la réplica en un nodo distinto. Nunca se va a crear la réplica en el mismo nodo, ya que si tenemos el shard primario y la réplica en el mismo, y éste se cae, perderíamos esa información. Por tanto, las réplicas se van a ir creando en nodos distintos en los cuales va entrando la información.
- Como se puede ver, van entrando los shards, los paquetes, y se van generando replicas en nodos distintos.
- Con todo lo anterior, si ocurre un error y perdemos un nodo de información, no pasará nada porque hay una réplica de todos sus paquetes distribuidas en los otros nodos.
- En este caso, Elasticsearch detectaría la pérdida de uno de los nodos, y hasta que éste se recupere, haría una réplica de los shards perdidos en el otro nodo correspondiente. De esta forma, al acabar, tendríamos un shard primario en un nodo y su réplica en el otro, así todos los shards que estaban asignados al nodo perdido quedarían recolocados en los otros nodos, y así no se pierde la información.
- Esta es las mayores ventajas de los sistemas distribuidos en cuanto a las bases de datos.
¿Qué es un clúster?
Este conjunto de nodos del que hemos hablado, forman lo que se conoce como clúster.
Cuando tenemos una instancia de Elasticsearch instalada, un servicio en un equipo se denomina nodo, y un conjunto de nodos de Elasticsearch se denomina clúster.
Cada nodo se encarga de peticiones HTTP y dispone de una REST API para contestar a las peticiones que se vayan realizando. Los nodos conocen el estado del resto y pueden reenviar las peticiones de los clientes al nodo indicado.
Tipos de nodos
Tenemos varios tipos de nodos disponibles:
Master node
Es el encargado de crear y borrar los índices. Al hablar de índices en Elasticsearch nos referimos a bases de datos. Además, gestiona los nodos conectados al clúster y toma decisiones de colocación de datos, es el encargado de repartir e indexar los shards entre los nodos. De la misma forma, cuando realizamos una búsqueda, se encarga de indicarnos dónde consultar la información solicitada.
Data node
Su objetivo es almacenar la información y procesarla. Podemos realizar consultas en la que únicamente se devuelva una información, pero también otras más complejas, en las que hagamos agregaciones. Por ejemplo, si tenemos la información de nuestros clientes y la cantidad que nos deben, podemos consultar el total que nos debe un cliente concreto, para ello el data node realizará una suma. Es un ejemplo muy básico, pero nos sirve para entender el procesamiento que emplean estos nodos.
Ingest node
Ejecutan una especie de pre-procesamiento de la información antes de almacenarla. Normalmente se realiza con Logstach instalado, pero si es un pre-procesamiento muy básico podemos hacerlo de esta forma. Lo que hace es recoger la información, aplicarle una serie de campos con unos filtros y después pasarla al master node para que pueda realizar el indexado de dichos datos.
Coordinating node
El último tipo de nodo, el que más queríamos destacar, es el nodo coordinador (Coordinating node). Es el nodo que encamina las peticiones y se instala en el cliente, en nuestro caso Kibana.
Cuando Kibana realiza las peticiones a Elasticsearch, si no se utiliza este tipo de nodo, las hará al master node, por lo que si el mismo está sobrecargado, lo vamos a sobre sobrecargar aún más.
Al utilizar un coordinating node, éste mantendrá una comunicación constante con el master node, actualizando toda la información del mismo para compartirla con él. De esta forma al conectar Kibana con el coordinating node, éste no necesita conectarse al master node para buscar la información solicitada, ya que también la conoce.
Es una forma de evitar sobrecargar más el clúster, a través del master, y poder realizar las consultas con la información que conoce el nodo coordinador.
Además de saber dónde escribir y leer la información, puede ayudar al procesamiento de datos, es decir, lo que sería un mapreduce, que se ve mucho en procesamiento escalado de Big Data.
De esta forma, cuando se realiza una consulta, se envía la misma a los data node, que harán la búsqueda y una especie de pre-procesamiento. Para obtener un único resultado de una única consulta, y uno un resultado de cada data node, entonces lo que se hace es que los mismos realizan ese pre-procesamiento, una especie de mapeo. Una vez que se ha realizado el mismo, es enviado al nodo coordinador, el cual realiza una unión o merge de los resultados obtenidos de todos los nodos, y es el que presenta el resultado final a Kibana.
De esta forma mejoramos la velocidad y no sobrecargamos el clúster.
Te esperamos en los siguientes artículos en donde hablaremos mas acerca de estos temas, los cuales hoy en día son de vital importancia en el mundo de la tecnología.