Explicando Apache ZooKeeper


376

Estoy tratando de entender ZooKeeper, cómo funciona y qué hace. ¿Hay alguna aplicación que sea comparable a ZooKeeper?

Si lo sabes, ¿cómo describirías ZooKeeper a un laico?

He intentado apache wiki, zookeeper sourceforge ... pero todavía no puedo relacionarme con él.

Acabo de leer a través de http://zookeeper.sourceforge.net/index.sf.shtml , entonces ¿no hay más servicios como este? ¿Es tan simple como replicar un servicio de servidor?


66
Similar pero no la respuesta exacta que está buscando: stackoverflow.com/questions/1479442/real-world-use-of-zookeeper
zengr


Puedes leer este artículo ZooKeeper: coordinación sin esperas para sistemas a escala de Internet Escrito por dos Yahoo! ingenieros
yaphet

Aquí hay una charla técnica que es una introducción a Apache ZooKeeper por Camille Fournier, quien es el CTO de RentTheRunway. Espero que sea útil.
Genadinik

@Luca Geretti ... Según mi opinión, Zookeper proporciona un conjunto de apis para que podamos usarlo para coordinar la aplicación distribuida. corrígeme si estoy equivocado.
user3797438

Respuestas:


434

En pocas palabras, ZooKeeper te ayuda a crear aplicaciones distribuidas.

Cómo funciona

Puede describir ZooKeeper como un servicio de sincronización replicado con consistencia eventual. Es robusto, ya que los datos persistentes se distribuyen entre múltiples nodos (este conjunto de nodos se denomina "conjunto") y un cliente se conecta a cualquiera de ellos (es decir, un "servidor" específico), migrando si falla un nodo; Mientras la mayoría estricta de los nodos esté funcionando, el conjunto de nodos ZooKeeper está vivo. En particular, un nodo maestro se elige dinámicamente por consenso dentro del conjunto; Si el nodo maestro falla, la función de maestro migra a otro nodo.

Cómo se manejan las escrituras

El maestro es la autoridad para las escrituras: de esta manera se puede garantizar que las escrituras persistan en orden, es decir, las escrituras son lineales . Cada vez que un cliente escribe en el conjunto, la mayoría de los nodos conservan la información: estos nodos incluyen el servidor para el cliente y, obviamente, el maestro. Esto significa que cada escritura actualiza el servidor con el maestro. Sin embargo, también significa que no puede tener escrituras concurrentes.

La garantía de las escrituras lineales es la razón del hecho de que ZooKeeper no funciona bien para las cargas de trabajo dominantes de escritura. En particular, no debe usarse para el intercambio de datos de gran tamaño, como los medios. Siempre que su comunicación implique datos compartidos, ZooKeeper lo ayudará. Cuando los datos se pueden escribir simultáneamente, ZooKeeper realmente se interpone en el camino, porque impone un orden estricto de las operaciones, incluso si no es estrictamente necesario desde la perspectiva de los escritores. Su uso ideal es para la coordinación, donde se intercambian mensajes entre los clientes.

Cómo se manejan las lecturas

Aquí es donde sobresale ZooKeeper: las lecturas son concurrentes ya que son atendidas por el servidor específico al que se conecta el cliente. Sin embargo, esta es también la razón de la consistencia eventual: la "vista" de un cliente puede estar desactualizada, ya que el maestro actualiza el servidor correspondiente con un retraso limitado pero indefinido.

En detalle

La base de datos replicada de ZooKeeper comprende un árbol de znodes , que son entidades que representan aproximadamente nodos del sistema de archivos (piense en ellos como directorios). Cada znode puede enriquecerse con una matriz de bytes, que almacena datos. Además, cada znode puede tener otros znodes debajo, formando prácticamente un sistema de directorio interno.

Znodes secuenciales

Curiosamente, el nombre de un znode puede ser secuencial , lo que significa que el nombre que proporciona el cliente al crear el znode es solo un prefijo: el nombre completo también viene dado por un número secuencial elegido por el conjunto. Esto es útil, por ejemplo, para fines de sincronización: si varios clientes desean bloquear un recurso, cada uno puede crear simultáneamente un znode secuencial en una ubicación: el que obtenga el número más bajo tiene derecho al bloqueo.

Znodes efímeros

Además, un znode puede ser efímero : esto significa que se destruye tan pronto como el cliente que lo creó se desconecta. Esto es principalmente útil para saber cuándo falla un cliente, lo que puede ser relevante cuando el cliente mismo tiene responsabilidades que debe asumir un nuevo cliente. Tomando el ejemplo del bloqueo, tan pronto como el cliente que tiene el bloqueo se desconecta, los otros clientes pueden verificar si tienen derecho al bloqueo.

Relojes

El ejemplo relacionado con la desconexión del cliente puede ser problemático si necesitáramos sondear periódicamente el estado de znodes. Afortunadamente, ZooKeeper ofrece un sistema de eventos donde se puede configurar un reloj en un znode. Estos relojes pueden configurarse para desencadenar un evento si el znode se cambia o elimina específicamente o si se crean nuevos niños debajo de él. Esto es claramente útil en combinación con las opciones secuenciales y efímeras para znodes.

Dónde y cómo usarlo

Un ejemplo canónico del uso de Zookeeper es el cálculo de memoria distribuida, donde algunos datos se comparten entre los nodos del cliente y se debe acceder / actualizar de una manera muy cuidadosa para tener en cuenta la sincronización.

ZooKeeper ofrece la biblioteca para construir sus primitivas de sincronización, mientras que la capacidad de ejecutar un servidor distribuido evita el problema de punto único de falla que tiene cuando usa un repositorio de mensajes centralizado (similar a un intermediario).

ZooKeeper es una característica de la luz, lo que significa que los mecanismos como la elección del líder, cerraduras, barreras, etc., todavía no están presentes, pero se pueden escribir por encima de las primitivas ZooKeeper. Si la API de C / Java es demasiado difícil de manejar para sus propósitos, debe confiar en las bibliotecas creadas en ZooKeeper, como las jaulas y especialmente el curador .

Donde leer mas

Aparte de la documentación oficial, que es bastante buena, sugiero leer el Capítulo 14 de Hadoop: La guía definitiva que tiene ~ 35 páginas que explican esencialmente lo que hace ZooKeeper, seguido de un ejemplo de un servicio de configuración.


2
No estoy seguro de entender el esquema de comunicación que sugiere, pero puede usar ZooKeeper para "publicar" información de un productor y hacer que varios consumidores la lean. Si, por otro lado, solo existe una instancia de cada tipo de servidor, hay poco beneficio en el uso de ZK.
Luca Geretti

57
En mi opinión, esto no explica qué es ZooKeeper para un laico. ¿Cuándo necesitaría ZooKeeper? ¿Qué le escribiría? ¿Qué problema soluciona? ¿Es una tienda de valor clave? ¿Un motor de busqueda? ¿Una cerradura distribuida? ¿Por qué elegiría ZooKeeper, por ejemplo, Redis o un archivo o JIRA o notas post-it? Claramente sabes mucho sobre ZooKeeper, pero ¿puedes explicarlo menos técnicamente?
Dan Passaro

1
Como Zookeeper tiene escrituras lineales, ¿eso no me impide usar API asincrónicas para crear nodos y tomar la respuesta en una devolución de llamada? Aunque internamente puede no permitir escrituras concurrentes, ¿o me estoy perdiendo algo?
jdk2588

1
"Cada vez que un cliente escribe en el conjunto, la mayoría de los nodos conservan la información: estos nodos incluyen el servidor para el cliente y, obviamente, el maestro" => ¿podría indicarme un documento? o algo donde esto se explica? Me pregunto si es posible que se haya realizado un cambio de estado con éxito, excluyendo el servidor al que está conectado el cliente (en cuyo caso, el cliente puede experimentar el extraño comportamiento de no poder leer su propia escritura por un momento)
senseiwu

2
Completamente y completamente antitético a la pregunta formulada. Si se tratara de un reloj, estaría buscando un "dispositivo para mantener el tiempo", no una descripción del resorte principal, el tren de ruedas, el escape y su interacción basada en el período de oscilación, el momento de inercia y el impacto de los cristales de zafiro artificial.
Rick O'Shea

10

Zookeeper es uno de los mejores servidores y servicios de código abierto que ayuda a coordinar de manera confiable los procesos distribuidos. Zookeeper es un sistema CP (consulte el teorema CAP) que proporciona consistencia y tolerancia de partición. La replicación del estado de Zookeeper en todos los nodos lo convierte en un servicio distribuido eventualmente consistente.

Además, cualquier líder recién elegido actualizará a sus seguidores con propuestas faltantes o con una instantánea del estado, si los seguidores tienen muchas propuestas faltantes.

Zookeeper también proporciona una API que es muy fácil de usar. Esta publicación de blog, ejemplos de la API Java de Zookeeper , tiene algunos ejemplos si está buscando ejemplos.

Entonces, ¿dónde usamos esto? Si su servicio distribuido necesita una administración de configuración centralizada, confiable y consistente, bloqueos, colas, etc., encontrará que Zookeeper es una opción confiable.


44
"Zookeeper es un sistema de CP (consulte el teorema CAP) que proporciona consistencia y tolerancia de partición", creo que Zookeeper tiene maestro y seguidores, cuando el maestro caiga, uno de los seguidores sería elegido como Líder, por lo que Zookeeper debería proporcionar el AP, sin embargo, la C es eventualmente consistente.
YuFeng Shen

55
En términos del teorema CAP, "C" en realidad significa linealización. De hecho, ZooKeeper proporciona "consistencia secuencial" y significa que las actualizaciones de los clientes se aplicarán en el orden en que fueron recibidas. Esto es más débil que la linealización pero aún es muy fuerte, mucho más fuerte que la "consistencia eventual". Zookeeper no es A y esto se debe a que si el líder no puede ser elegido (sin quórum), entonces zookeeper fallará en las solicitudes. Es por eso que no está altamente disponible.
Binu George

7

Entiendo el ZooKeeper en general, pero tuve problemas con los términos "quórum" y "cerebro dividido", así que tal vez pueda compartir mis hallazgos con usted (me considero también un laico).

Digamos que tenemos un clúster ZooKeeper de 5 servidores. Uno de los servidores se convertirá en el líder y los demás se convertirán en seguidores.

  • Estos 5 servidores forman un quórum. Quórum simplemente significa "estos servidores pueden votar sobre quién debería ser el líder".

  • Entonces la votación se basa en la mayoría. Mayoría simplemente significa "más de la mitad", por lo que más de la mitad del número de servidores debe aceptar que un servidor específico se convierta en el líder.

  • Entonces, hay algo malo que puede ocurrir llamado "cerebro dividido". Por lo que yo entiendo, un cerebro dividido es simplemente esto: el grupo de 5 servidores se divide en dos partes, o llamémoslo "equipos de servidores", con quizás una parte de 2 y la otra de 3 servidores. Esta es realmente una mala situación, ya que si ambos "equipos de servidores" deben ejecutar un orden específico, ¿cómo decidirían qué equipo debería preferirse? Es posible que hayan recibido información diferente de los clientes. Por lo tanto, es realmente importante saber qué "equipo de servidor" sigue siendo relevante y cuál puede / debe ignorarse.

  • La mayoría es también la razón por la que debe usar un número impar de servidores. Si tiene 4 servidores y un cerebro dividido donde 2 servidores se separan, entonces ambos "equipos de servidores" podrían decir "¡oye, queremos decidir quién es el líder!" pero ¿cómo debe decidir qué 2 servidores debe elegir? Con 5 servidores es simple: el equipo de servidores con 3 servidores tiene la mayoría y se le permite seleccionar al nuevo líder.

  • Incluso si solo tiene 3 servidores y uno de ellos falla, los otros 2 siguen formando la mayoría y pueden aceptar que uno de ellos se convertirá en el nuevo líder.

Me doy cuenta una vez que lo piensas un poco y entiendes los términos, ya no es tan complicado. Espero que esto también ayude a cualquiera a comprender estos términos.


1

Zookeeper es un servidor de código abierto centralizado para mantener y administrar información de configuración, convenciones de nombres y sincronización para el entorno de clúster distribuido. Zookeeper ayuda a los sistemas distribuidos a reducir su complejidad de gestión al proporcionar baja latencia y alta disponibilidad. Zookeeper fue inicialmente un subproyecto para Hadoop, pero ahora es un proyecto independiente de alto nivel de Apache Software Foundation.

Más información


2
¿Qué te hace decir que el cuidador del zoológico está centralizado? Zookeeper puede y debe ejecutarse distribuido.
Benjamin Hammer Nørgaard

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.