En qué sistemas se utiliza Zookeeper y cómo utilizarloZooKeeper como servicio de descubrimiento (Nota: ZooKeeper es un subproyecto del famoso Hadoop, diseñado para resolver la coordinación de servicios en sistemas distribuidos a gran escala). escenarios de aplicación y problemas de sincronización (servicio de coordenadas) que puede proporcionar como otros servicios en sistemas distribuidos: servicio de nombres unificado, gestión de configuración, servicio de bloqueo distribuido, gestión de clústeres y otras funciones) es un gran proyecto de código abierto, es muy maduro y tiene Una comunidad bastante grande. Servicio de nombres unificado, gestión de configuración, servicio de bloqueo distribuido, gestión de clústeres y otras funciones) es un gran proyecto de código abierto que es muy maduro, tiene una comunidad considerable para respaldar su desarrollo y se usa ampliamente en entornos de producción, pero se usa como un; La solución del servicio de descubrimiento de servicios es un error. Existe un famoso teorema CAP en el campo de los sistemas distribuidos (consistencia de datos C; disponibilidad del servicio A; tolerancia a fallas del servicio P ante fallas de partición de red). Estas tres características no se pueden satisfacer al mismo tiempo en ningún sistema distribuido. (A se pueden satisfacer un máximo de dos al mismo tiempo); ZooKeeper es un CP, es decir, los resultados de datos solicitados por ZooKeeper son consistentes en cualquier momento y el sistema es tolerante a fallas en las particiones de red. El sistema es tolerante a fallas para las particiones de red, pero no garantiza la disponibilidad de cada solicitud de servicio (nota: en entornos extremos, ZooKeeper puede abandonar algunas solicitudes y el programa de usuario debe volver a solicitar para obtener los resultados). Pero no olvide que ZooKeeper es un servicio de coordinación distribuido. Su responsabilidad es garantizar que los datos dentro de su jurisdicción (nota: datos de configuración, datos de estado) permanezcan sincronizados y consistentes entre todos los servicios, por lo que no es difícil entender por qué. Si ZooKeeper está diseñado como un AP con características de CP en lugar de AP, traerá consecuencias terribles (Nota: ZooKeeper es como un CP, no un AP), y también debe garantizar que el programa del consumidor deba volver a solicitar para obtener el resultado: ZooKeeper es como un semáforo en un cruce de caminos. ¿Te imaginas la situación en la que el semáforo falla repentinamente en una arteria de tráfico? ) y, como ZooKeeper, usarlo no es una buena idea. Además, la implementación principal de ZooKeeper, Zab, resuelve el problema de cómo mantener la sincronización de datos entre múltiples servicios en un sistema distribuido. Como servicio de colaboración distribuida, ZooKeeper es muy bueno, pero no es adecuado para un servicio de descubrimiento de servicios, incluso si los resultados que devuelve contienen información inexacta, es mejor que nada; para el servicio de descubrimiento de servicios, preferiría devolver información sobre qué servicios en el servidor estaban disponibles hace 5 minutos que devolver información sobre los servicios en el servidor que no estaban disponibles hace 5 minutos. En lo que respecta al servicio de descubrimiento de servicios, preferiría devolver información en qué servidores estaba disponible un servicio hace 5 minutos que no devolver ningún resultado porque una falla temporal de la red le impide encontrar un servidor disponible. Por lo tanto, usar ZooKeeper como servicio de descubrimiento de servicios es absolutamente incorrecto y, si lo haces, ¡estás jodido! Más importante aún, si lo usa como un servicio de descubrimiento de servicios, ZooKeeper en sí no puede manejar adecuadamente los problemas de segmentación de la red en la computación en la nube, los problemas de segmentación de la red ocurren como otros tipos de fallas, por lo que es mejor estar 100% preparado para esto; pregunta. Como dijo Jepson en una publicación de blog en el sitio web de ZooKeeper: En ZooKeeper, si el número de nodos en la misma partición de red (partición) no alcanza el "quórum" para que ZooKeeper elija un nodo líder, se eliminarán de ZooKeeper. . Por supuesto, se desconectarán de ZooKeeper y no podrán proporcionar servicios de descubrimiento de servicios. Si agrega un caché de cliente a ZooKeeper (nota: los nodos de ZooKeeper están equipados con caché local) u otras tecnologías similares, puede aliviar el problema de errores de sincronización de los nodos de ZooKeeper debido a fallas de red. Pinterest y Airbnb utilizan este enfoque para evitar fallos de ZooKeeper.
Este enfoque resuelve el problema en la superficie. Específicamente, cuando algunos o todos los nodos están desconectados de ZooKeeper, cada nodo aún puede obtener datos del caché local, pero aun así, no es posible que todos los nodos en ZooKeeper estén registrados. Se garantiza que se almacenará en caché en todo momento. Si todos los nodos de ZooKeeper están desconectados o se produce una falla de segmentación de red en el clúster (nota: una falla del conmutador hace que las subredes del conmutador no puedan acceder entre sí, entonces ZooKeeper las eliminará de su propio alcance de administración); El mundo exterior no será accesible a estos nodos, incluso si están "en buen estado" y pueden proporcionar servicios normales. Incluso si estos nodos están "en buen estado" y pueden proporcionar servicios normalmente, las solicitudes de servicio a estos nodos se perderán; Tenga en cuenta que esta es también la razón por la que ZooKeeper no cumple con el elemento A en CAP) La razón más profunda es que ZooKeeper está construido de acuerdo con el principio CP, es decir, puede garantizar que los datos de cada nodo sean consistentes y agregar almacenamiento en caché. a ZooKeeper para hacer que ZooKeeper sea más confiable (sin embargo, ZooKeeper no es un nodo confiable, sino un nodo al que ZooKeeper no puede acceder. Incluso si estos nodos en sí están "en buen estado", no pueden proporcionar servicios, por lo tanto, se envían solicitudes de servicio; Estos nodos se perderán. Sin embargo, el propósito de ZooKeeper es mantener la coherencia de los datos del nodo, es decir, mantener la coherencia de CP. Por lo tanto, en este caso, es posible que no pueda obtener un servicio de descubrimiento de servicios consistente (CP) o de alta disponibilidad (AP), porque esto equivale a forzar la instalación del sistema AP en el sistema CP existente, que es esencialmente; y ¡No tiene sentido! Esto inherentemente no funciona. ¡Los servicios de descubrimiento de servicios deben diseñarse para que estén altamente disponibles desde el principio! Si se deja de lado el principio CAP, es muy difícil configurar y mantener correctamente un servicio ZooKeeper. A menudo se producen errores, lo que da lugar a que se establezcan muchos proyectos sólo para simplificar el mantenimiento de ZooKeeper. Estos errores existen no sólo en el lado del cliente, sino también en el propio servidor ZooKeeper. Debido al uso inadecuado de ZooKeeper, se produjeron muchas fallas en la plataforma Knewton. Operaciones aparentemente simples, como reconstruir correctamente los observadores, manejar sesiones y excepciones de clientes, administrar la memoria en ventanas ZK, etc., pueden conducir fácilmente a una falla de ZooKeeper. Al mismo tiempo, también encontramos algunos errores clásicos de ZooKeeper: ZooKeeper-1159 y ZooKeeper-1576 en el entorno de producción, incluso encontramos que ZooKeeper no pudo elegir el nodo Líder; La razón de estos problemas es que ZooKeeper necesita administrar y proteger los recursos de sesión y conexión de red del grupo de servicios que administra (Nota: en un entorno de sistema distribuido, la administración de estos recursos es extremadamente difícil, sin embargo, no es responsable); para gestionar el descubrimiento de servicios, por lo tanto, no es rentable utilizar ZooKeeper como servicio de descubrimiento de servicios. La elección correcta: el éxito de Eureka Cambiamos nuestro servicio de descubrimiento de servicios de ZooKeeper a Eureka, una solución de descubrimiento de servicios de código abierto desarrollada por Netflix. (Nota: Eureka consta de dos partes: servidor Eureka (que actúa como un servidor de registro de servicios) y cliente Eureka (cliente JAVA, que simplifica la interacción con el servidor, actúa como un equilibrador de carga de sondeo y proporciona soporte de conmutación por error del servicio). Eureka from It fue diseñado desde cero para ser un servicio de descubrimiento de servicios escalable y de alta disponibilidad, dos características que Netflix ha desarrollado para todas sus plataformas (todos están hablando de Eureka) y hemos confiado en Eureka en nuestro entorno de producción desde que comenzó el cambio. No existe un registro de tiempo de inactividad por mantenimiento para ninguno de nuestros productos.