Herramienta que brinda servicios que suelen necesitar las aplicaciones distribuidas, para coordinación o compartir data entre nodos.

 

Algunos usos comunes:

  • management de la configuración
  • elección de leader
  • lockeo

Qué es?

Zookeeper Internals

zNodes

Namespace jerárquico

  DATA

  - R/W atómicas

  - Límite 1Mb

   METADATA

   - Versión    - Timestamps

   - ACL           - Data length

[WATCHES]

   - one-shoot

   - over Data or Children

Tipos de zNodes

  • Persistent
  • Ephemeral
  • Sequence
  • Container
  • TTL

Zookeeper Ensemble

TCP

zxid

Namespace

tx logs +

snapshots

En prod mínimo 3 nodos

Para soportar la caída de N nodos, necesitas un ensemble con N*2 +1 nodos

Con más nodos, más throughput de lecturas pero menos de escrituras

Instalación y Configuración

Algunas config opcionales:

  - globalOutstandingLimit

  - snapCount

  - snapSizeLimitInKb

  - maxCnxns

  - autopurge.purgeInterval

  - autopurge.snapRetainCount

 

zkCli

   

        bin/zkServer.sh start     // Levantar el server

 

        ./zkCli.sh -server localhost:2181     // Conectarse a ZK

        ls /     // Listar zNodes de path /

        create /test testData     // Crear zNode

        ls -R /     // Listar zNodes recursivamente

        ls -w /test     // Agrega un childWatch al zNode /test

        create /test/childOne "Info child one"     // Crea el nodo y recibimos notificación

        create /test/childTwo     // Sólo lo crea. No recibimos notificación porque es one-shoot

        create -e /test/childThree     // -e Efímero (-s persistent-sequential, -e -s ephemeral-sequential, -t millis)

        get /test/childOne     // Ver data del nodo (-w agrega dataWatch)

        get -s /test     // Ver data + metadata

        stat /test/childOne     // Ver sólo metadata

        set /test/childOne algoDeInfo     // Update (-v CompareAndSet)

        delete /test/childOne     // Elimina el nodo

        deleteall /test     // Elimina el nodo y todos sus hijos

        sync /test     // Fuerza la sincronización con el leader => última versión de la data

        quit     // Salir de zkCli

 

Monitoreo - Herramientas

4 letter words:

  • ruok
  • conf
  • stat
  • mntr
  • srvr
  • cons
  • wchs

Correr con telnet o netcat

Configurar whitelist 

https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_4lw

Admin Server

Zk 3.5.0+

http://localhost:8080/commands

JMX

Levantar server habilitando JMX y con QuorumPeerMain

Restricción D! sin authenticación => conexión remota vía tunel ssh

Monitoreo - Qué mirar?

   Salud de ZK:

  • Request Avg/Max Latency                                                                   
  • Outstanding Requests
  • Received / Sent
  • Mode
  • Node count / watch count

Está ZK corriendo? -> 4lw: ruok, stat

   Salud del nodo:

  • RAM -> Ver heap usada y que no swapee -> NR, free -h, htop
  • CPU -> tunnear GC 
  • Red -> Munin y  netdata
  • Disco -> Está borrando snapshots y tx logs? Rota el log?

Conjunto de librerías java que hacen el uso de Zookeeper más fácil.

  • curator-client -> wrapper cliente ZK
  • curator-framework -> manejo de conexiones, política de reintentos, listener ConnectionStateListener, etc
  • curator-recipes -> Implementación de casos de uso comunes
  • curator-test → levanta un ZK embebido (o un ensemble)
  • ...

Pros & Cons

Nota: Artifacts en D! 

  • Madurez: estabilidad, mantenimiento, comunidad

  • Garantiza el orden

  • Atomicidad

  • Trabaja en memoria: alto throughput y baja latencia

  • Recipe lock distribuido

  • HA y failover automático

  • Monitoreo

  • Curator

  • Podes perder notificaciones

  • Solución multi-datacenter?

  • Bajo nivel -> Complejidad.  

  • Trabaja en memoria:

    • hay pausas de GC.

    • Warn! El set de datos tiene que entrar en memoria

Muchas gracias!

Zookeeper

By María Alejandra Holman