Red de conocimiento informático - Aprendizaje de programación - Introducción a Kafka: un sistema de mensajería distribuida de código abierto, liviano, de alto rendimiento y alta disponibilidad.

Introducción a Kafka: un sistema de mensajería distribuida de código abierto, liviano, de alto rendimiento y alta disponibilidad.

Con el rápido desarrollo de la tecnología de la información y el rápido crecimiento de los usuarios de Internet, la cantidad de información almacenada en las computadoras se ha disparado. En la actualidad, la cantidad de datos ha entrado en la era de los datos masivos a gran y ultra gran escala. Cómo almacenar, analizar, procesar y extraer datos masivos de manera eficiente se ha convertido en un tema candente y difícil en el campo de la investigación técnica. Cómo recopilar, operar, gestionar y analizar estos datos también es una parte crucial del procesamiento de big data y requiere la infraestructura correspondiente para respaldarlo. En respuesta a esta demanda, han surgido muchos sistemas de mensajería de código abierto en la industria. Kafka es, por supuesto, un sistema de mensajería muy popular.

Kafka es un sistema de mensajería de código abierto, ligero, distribuido, particionable y potente, basado en la gestión coordinada de ZooKeeper, con plataformas de replicación y streaming distribuido. Como plataforma de procesamiento de transmisiones, debe tener las siguientes tres características clave:

1) Puede permitir la publicación y suscripción de datos de transmisión.

2) Proporcione el mecanismo de tolerancia a fallas correspondiente al almacenar datos de transmisión.

3) Los datos de streaming se pueden procesar a tiempo cuando llegan.

La estructura básica del sistema de flujo de información de Kafka incluye productores y consumidores, así como grupos de Kafka.

Los productores son responsables de producir mensajes y escribirlos en el clúster de Kafka; los consumidores obtienen información del clúster de Kafka.

El mensaje es la unidad básica de la comunicación de Kafka y consta de un encabezado de mensaje de longitud fija y un cuerpo de mensaje de longitud variable.

Kafka abstrae un conjunto de información en un tema, es decir, un tema es una clasificación de información. El productor envía el tema especificado por el mensaje al clúster de Kafka y el consumidor se suscribe al tema o a determinadas particiones del tema para su consumo.

Kafka resume un conjunto de información en un tema y cada tema se divide en una o más particiones. Cada partición consta de una secuencia ordenada e inmutable de mensajes, que es una cola ordenada. En realidad, cada partición corresponde a una carpeta. La regla de nomenclatura para las particiones es el nombre del tema seguido de un conector "-" y luego el número de partición. Los números de partición comienzan desde 0 y el número máximo es el número total de particiones menos 1.

La partición hace que Kafka sea más fácil de procesar al mismo tiempo. En teoría, cuantas más particiones, mayor será el rendimiento, pero depende del entorno real y los escenarios comerciales del clúster. Al mismo tiempo, la partición también es la base de Kafka para garantizar el consumo secuencial de mensajes y equilibrar la carga de mensajes.

Preguntas y respuestas: ¿Cómo garantiza la partición que los mensajes se utilicen secuencialmente? Los mensajes en cada partición están en orden, pero ¿cómo garantizarlo entre diferentes particiones? La suposición es que el espacio de almacenamiento de la partición es relativamente grande y la cantidad de particiones es pequeña. El factor principal en el consumo secuencial son los mensajes dentro de las particiones, y los mensajes entre particiones pueden ignorarse. Las escrituras secuenciales en disco de alto rendimiento probablemente también sean la razón.

Kafka solo puede garantizar el orden de los mensajes dentro de una partición, pero no puede garantizar el orden de los mensajes entre particiones. Cada mensaje se adjunta a la partición correspondiente y se escribe en el disco en orden, por lo que la eficiencia es muy alta. Esta es una garantía importante para el alto rendimiento de Kafka. Al mismo tiempo, a diferencia de los sistemas de mensajería tradicionales, Kafka no elimina inmediatamente los mensajes consumidos y, debido a limitaciones del disco, los mensajes no siempre se almacenan. Por lo tanto, Kafka proporciona dos estrategias para eliminar datos antiguos, una se basa en el tiempo que se almacenan los mensajes y la otra en el tamaño de la partición. Ambas estrategias se pueden configurar a través de archivos de configuración.

Cada partición tiene una o más réplicas, y las réplicas de la partición se distribuyen en diferentes agentes del clúster para mejorar la disponibilidad.

Desde una perspectiva de almacenamiento, cada copia de una partición se abstrae lógicamente como un objeto de registro, es decir, existe una correspondencia uno a uno entre la copia de la partición y el objeto de registro. El número de particiones correspondientes a cada tema se puede configurar en el archivo de configuración cargado cuando se inicia Kafka, o especificarse al crear el tema. Por supuesto, el cliente también puede modificar el número de particiones del tema después de crear el tema.

¿Por qué el copywriting debería dividirse en líderes y seguidores? Si no hay una réplica de Leader, todas las réplicas deben ser responsables de las solicitudes de lectura/escritura al mismo tiempo y se debe garantizar la coherencia de los datos entre estas réplicas. Suponiendo que hay n copias, se necesitan n × n canales para sincronizar los datos y es difícil garantizar la coherencia y el orden de los datos.

Para resolver este problema, Kafka elige una copia de la partición como líder y las otras copias de la partición como seguidoras. Solo la réplica maestra es responsable de procesar las solicitudes de lectura/escritura del cliente, y la réplica esclava sincroniza los datos de la réplica maestra.

Una vez introducida la copia líder, el cliente solo necesita interactuar con la copia líder, garantizando así la coherencia y el orden de los datos. La copia seguidora sincroniza los mensajes de la copia líder. N copias solo requieren n-1 rutas, lo que hace que el sistema sea más simple y eficiente.

Los roles de imitadores y líderes no están fijos. Si el líder falla, se seleccionará una nueva copia del líder entre las otras copias de los seguidores mediante el algoritmo de elección correspondiente.

P: ¿Cómo se seleccionan las copias líder y seguidora? ¿El cuidador del zoológico lo eligió?

Kafka mantiene dinámicamente una ISR (réplica sincronizada) en ZooKeeper, que mantiene una lista de réplicas sincronizadas, que almacena los ID de los nodos del agente correspondientes a todas las réplicas que mantienen la sincronización de mensajes con la réplica líder. Si la réplica esclava está inactiva o se retrasa demasiado, el nodo de la réplica esclava se eliminará de la lista ISR. En este libro, el tiempo de inactividad se refiere a la falla del agente, incluido, entre otros, el cierre del agente, como el cierre manual del agente o una falla física, detección de latidos vencidos, retraso de la red, falla del proceso, etc.

Cualquier mensaje publicado en la partición se agregará directamente al final del archivo de registro (el archivo de datos con el nombre del archivo con el sufijo ".log" en el directorio de la partición) y cada mensaje en el registro archivo La posición corresponderá al desplazamiento incremental. El desplazamiento es un valor lógico estrictamente ordenado debajo de la partición y no representa la ubicación física del mensaje en el disco. Dado que Kafka apenas permite la lectura y escritura aleatoria de mensajes, Kafka no proporciona un mecanismo de indexación adicional para almacenar compensaciones.

Los consumidores pueden consumir mensajes controlando el desplazamiento del mensaje. Por ejemplo, el consumidor puede especificar el desplazamiento inicial del consumo. Para garantizar que los mensajes se consuman en orden, también es necesario guardar las compensaciones correspondientes a los mensajes que el consumidor ha consumido. Cabe señalar que las operaciones del consumidor en el desplazamiento del mensaje no afectarán el desplazamiento del mensaje en sí. Los antiguos consumidores guardan sus compensaciones de consumo en ZooKeeper y los nuevos consumidores guardan sus compensaciones de consumo en un tema dentro de Kafka. Por supuesto, los consumidores también pueden guardar sus compensaciones de consumo en un sistema externo en lugar de en Kafka.

Especulación: un tema tiene varias particiones y una partición tiene varias réplicas. Un tema (un tipo de mensaje) tiene múltiples particiones (el mensaje está fragmentado) y una partición (cada mensaje) tiene múltiples réplicas (el número de réplicas de cada mensaje). Una vez que se envía un mensaje a Kafka, se le asigna un desplazamiento que es el mismo en varias réplicas. De esta manera, cuando los consumidores consumen compensando, no hay diferencia entre múltiples porciones.

Un clúster de Kafka consta de una o más instancias de Kafka. Cada instancia de Kafka se denomina intermediario, a menudo también llamado KafkaServer. En un entorno de producción, un clúster de Kafka generalmente incluye uno o más servidores y podemos configurar uno o más intermediarios en un servidor. Cada agente tiene una identificación de identificación única, que es un número entero no negativo. En un clúster de Kafka, cada vez que agrega un intermediario, debe configurar una identificación que sea diferente de la de otros intermediarios en el clúster. El valor de ID puede ser cualquier número entero no negativo, siempre que sea único en todo el clúster de Kafka. Esta identificación, el nombre del corredor de identificación, corresponde al valor de broker.id configurado cuando se inicia el corredor.

El productor es responsable de enviar mensajes al broker, que es el cliente del broker Kafka.

Los consumidores extraen datos en modo pull y son los clientes consumidores. En Kafka, cada consumidor pertenece a un grupo de consumidores específico. Puede especificar un grupo de usuarios para cada usuario, utilizando groupId para representar el nombre del grupo de usuarios y configurar la configuración a través de group.id. Si no se especifica ningún grupo de usuarios, el usuario pertenece al grupo de usuarios predeterminado test- consumer-group. .

Cada consumidor tiene una identificación única global, especificada por el elemento de configuración client.id. Si el cliente no especifica la ID del consumidor, Kafka generará automáticamente una ID global única para el consumidor en el formato ${ groupID }-${ hostname }-${ timestamp }-${ los primeros 8 caracteres del UUID} . Los mensajes sobre el mismo tema solo pueden ser consumidos por un consumidor del mismo grupo de consumidores, pero los consumidores de diferentes grupos de consumidores pueden consumir el mensaje al mismo tiempo.

Los grupos de consumidores son el medio de Kafka para difundir y unidifundir información sobre un tema. Para implementar la transmisión de mensajes, solo necesita especificar que todos los consumidores pertenecen a diferentes grupos de consumidores, mientras que para la unidifusión de mensajes, todos los consumidores solo deben pertenecer al mismo grupo de consumidores.

Corolario: los mensajes de Kafka solo se pueden consumir una vez en un grupo de consumidores según el tipo de mensaje (tema). Es decir, un grupo de consumidores consume sólo un tipo de mensaje. Si un servicio quiere consumir un mensaje, debe ubicarse en diferentes grupos de consumidores.

Kafka utiliza ZooKeeper para guardar la información de metadatos correspondiente, incluida la información del nodo del agente, la información del clúster de Kafka, la información anterior del consumidor y su información de compensación de consumo, la información del tema, la información del estado de la partición y la información del plan de asignación de copias de la partición, y la configuración dinámica. información, etc. Kafka creará los nodos correspondientes en ZooKeeper para guardar la información de metadatos durante el inicio o el tiempo de ejecución. Kafka registrará los oyentes correspondientes en estos nodos a través del mecanismo de monitoreo para monitorear los cambios en los metadatos del nodo, por lo que ZooKeeper será responsable de administrar y mantener el clúster de Kafka. Al mismo tiempo, podemos escalar fácilmente el clúster de Kafka y migrar datos a través de ZooKeeper.