sql >> Base de Datos >  >> NoSQL >> Redis

Zookeeper vs In-memory-data-grid vs Redis

https://zookeeper.apache.org/doc/current/zookeeperOver.html

De forma predeterminada, Zookeeper replica todos sus datos en cada nodo y permite que los clientes observen los datos en busca de cambios. Los cambios se envían muy rápidamente (dentro de un período de tiempo limitado) a los clientes. También puede crear "nodos efímeros", que se eliminan dentro de un tiempo específico si un cliente se desconecta. ZooKeeper está altamente optimizado para lecturas , mientras que las escrituras son muy lentas (ya que generalmente se envían a cada cliente tan pronto como se realiza la escritura). Finalmente, el tamaño máximo de un "archivo" (znode) en Zookeeper es de 1 MB, pero normalmente serán cadenas individuales.

En conjunto, esto significa que zookeeper no está destinado a almacenar muchos datos, y definitivamente no es un caché. En cambio, es para administrar los latidos del corazón/saber qué servidores están en línea, almacenar/actualizar la configuración y posiblemente pasar mensajes (aunque si tiene una gran cantidad de mensajes o demandas de alto rendimiento, algo como RabbitMQ será mucho mejor para esta tarea).

Básicamente, ZooKeeper (y Curator, que se basa en él) ayuda a manejar la mecánica de la agrupación:latidos, distribución de actualizaciones/configuración, bloqueos distribuidos, etc.

Realmente no es comparable a Redis, pero para las preguntas específicas...

  1. No admite ningún cálculo y, para la mayoría de los conjuntos de datos, no podrá almacenar los datos con ningún rendimiento.

  2. Se replica en todos los nodos del clúster (no hay nada como la agrupación en clústeres de Redis donde se pueden distribuir los datos). Todos los mensajes se procesan atómicamente en su totalidad y están secuenciados, por lo que no hay transacciones reales. Se puede UTILIZAR para implementar bloqueos en todo el clúster para sus servicios (de hecho, es muy bueno en eso), y hay muchas primitivas de bloqueo en los propios znodes para controlar qué nodos acceden a ellos.

  3. Claro, pero ZooKeeper llena un nicho. Es una herramienta para hacer que las aplicaciones distribuidas funcionen bien con múltiples instancias, no para almacenar/compartir grandes cantidades de datos. En comparación con el uso de un IMDG para este propósito, Zookeeper será más rápido, administrará los latidos del corazón y la sincronización de manera predecible (con muchas API para facilitar esta parte) y tiene un paradigma "push" en lugar de "pull", por lo que los nodos son notificado muy rápidamente de los cambios.

La cita de la pregunta vinculada...

Un ejemplo canónico del uso de Zookeeper es el cálculo de memoria distribuida

... es, en mi opinión, un poco engañoso. Lo usaría para orquestar el cálculo, no para proporcionar los datos. Por ejemplo, supongamos que tiene que procesar las filas 1-100 de una tabla. Puede colocar 10 nodos ZK, con nombres como "1-10", "11-20", "21-30", etc. ZK notificará automáticamente a las aplicaciones cliente sobre este cambio, y el primero tomará " 1-10" y establezca un nodo efímero clients/192.168.77.66/processing/rows_1_10

La siguiente aplicación vería esto e iría al próximo grupo a procesar. Los datos reales para calcular se almacenarían en otro lugar (es decir, Redis, base de datos SQL, etc.). Si el nodo falla a la mitad del cálculo, otro nodo podría ver esto (después de 30 a 60 segundos) y retomar el trabajo nuevamente.

Sin embargo, diría que el ejemplo canónico de ZooKeeper es la elección de líder. Digamos que tiene 3 nodos:uno es maestro y los otros 2 son esclavos. Si el maestro falla, un nodo esclavo debe convertirse en el nuevo líder. Este tipo de cosas son perfectas para ZK.