[Kafka de la entrada al abandono de la serie tres] Mecanismo de almacenamiento y flujo de trabajo en profundidad de la arquitectura Kafka

En el blog anterior, construí un clúster distribuido de Kafka [Kafka from entry to abandonment series 2] El clúster de Kafka se creó y envió y consumió mensajes con éxito, que inicialmente verificaron las funciones de Kafka. A continuación, estaré en el primer artículo [Kafka from Getting Started to Abandoning Series 1] Basándome en la breve teoría de la descripción general y la arquitectura básica y la práctica del segundo artículo, comencé a discutir la arquitectura de Kafka y algunas estrategias en profundidad. Este blog se centra en todo el proceso y el mecanismo de almacenamiento de archivos. Los próximos artículos Introducir la estrategia del productor, la estrategia del consumidor y algunas funciones avanzadas por separado

Flujo de trabajo de Kafka

A través del aprendizaje de los conceptos básicos, podemos saber que los mensajes de Kafka se dividen en Topic, y el Topic se puede dividir lógicamente en Partion. Se deben tener en cuenta los siguientes puntos sobre Topic & Partion:

  • Un tema se puede considerar como un tipo de mensaje. Cada tema se dividirá en varias particiones, y cada partición es un archivo de registro adjunto en el nivel de almacenamiento.
  • Cualquier mensaje publicado en la partición se agregará al final del archivo de registro. La posición de cada mensaje en el archivo se denomina desplazamiento (desplazamiento). El desplazamiento es un número largo que marca un mensaje de forma única .

Inserte la descripción de la imagen aquí

  • En el mecanismo de Kafka, el mensaje del empuje del productor se agrega a la partición. Este es un mecanismo de disco de escritura secuencial , que es mucho más eficiente que la memoria de escritura aleatoria.
  • Cada consumidor del grupo de consumidores registrará en tiempo real qué offset ha consumido , para que cuando se restaure el error, puedan seguir consumiendo desde la última posición
  • Kafka solo garantiza el orden de los mensajes en la partición y no puede garantizar el orden de los mensajes del tema global.

El proceso general se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
Entonces, ¿por qué existe el concepto de partición? Es principalmente por las características comunes de todo nuestro middleware distribuido: balanceo de carga y expansión horizontal, el tema es solo un concepto lógico y está orientado a productores y consumidores, mientras que la partición es un concepto físico. Es concebible que si Topic no particiona, pero almacena los mensajes en Topic en un broker, entonces todas las solicitudes de lectura y escritura para ese Topic serán procesadas por este broker, y es probable que el rendimiento caiga en un cuello de botella, que obviamente no está en línea con el alto rendimiento. La cantidad de escenarios de aplicación. Por lo tanto, debe particionarse para distribuir el tráfico a diferentes servidores .

Mecanismo de almacenamiento de archivos Kafka

Por supuesto, incluso para una partición, si la cantidad de mensajes es demasiado grande, existe el riesgo de que se atasque, por lo que debemos limpiar los mensajes con regularidad, por supuesto, de los antiguos. Si solo hay una partición, entonces debe borrarse por completo. Tiene un impacto grave en el mantenimiento de los archivos de mensajes y la limpieza de los mensajes consumidos. Así que necesitamos subdividir más Partition físicamente. Por lo tanto, las particiones deben subdividirse en unidades de segmentos . Cada partición (directorio) es equivalente a que un archivo enorme se distribuya uniformemente entre varios archivos de datos de segmento de igual tamaño (el número de mensajes en cada archivo de segmento no es necesariamente Igual) Esta función también facilita la eliminación de segmentos antiguos, lo que facilita la limpieza de los mensajes que se han consumido y mejora la utilización del disco. Cada partición solo necesita admitir lectura y escritura secuenciales.

Partición y segmento

A continuación, enviamos un mensaje para ver cómo se ve en el almacenamiento físico:
Inserte la descripción de la imagen aquí
tres mensajes: hola, dashuaige, hhh. Abra el directorio de almacenamiento y podrá ver que en la máquina 103, un conjunto de índice y registro , este es el contenido de un segmento . El
Inserte la descripción de la imagen aquí
archivo de segmento consta de dos partes, a saber, el archivo ".index" y el archivo ".log", que se representan respectivamente como el índice del segmento. Archivos y archivos de datos . Las reglas de comando para estos dos archivos son: El primer segmento de la partición global comienza desde 0 , y cada archivo de segmento subsiguiente se denomina valor de compensación del último mensaje del archivo de segmento anterior, el tamaño del valor es de 64 bits y la longitud del número es de 20 bits. No hay ningún número llenado con 0. Solo tengo un dato aquí, por lo que comienza desde 0. Abra el archivo de registro y podrá ver:
Inserte la descripción de la imagen aquí
Aunque está distorsionado, puede ver vagamente los mensajes enviados en secuencia. La arquitectura de almacenamiento general es la siguiente:
Inserte la descripción de la imagen aquí

Estructura de almacenamiento de segmentos

A través de la comprensión anterior de los archivos de ubicación de segmentos, básicamente hemos descubierto la estructura del segmento. Por supuesto, estoy aquí para un solo segmento, que no se puede ver. A continuación, se muestra un ejemplo de una gran cantidad de archivos de Internet:

//第一段segment,起始位置为0
00000000000000000000.index
00000000000000000000.log
//第一段segment,起始位置为170410
00000000000000170410.index
00000000000000170410.log
//第一段segment,起始位置为239430
00000000000000239430.index
00000000000000239430.log

Tome el archivo de segmento anterior como ejemplo para mostrar la relación correspondiente entre el archivo ".index" y el archivo ".log" del segmento: 00000000000000170410, como se muestra en la siguiente figura: Inserte la descripción de la imagen aquí
Como se muestra arriba, el archivo de índice ".index " almacena una gran cantidad de metadatos ". El archivo de datos "log" almacena una gran cantidad de mensajes y los metadatos del archivo de índice apuntan a la dirección de desplazamiento física del mensaje en el archivo de datos correspondiente. Tomando los metadatos [3, 348] en el archivo de índice ".index" como ejemplo, el archivo de datos ".log" representa el tercer mensaje, es decir, 170410 + 3 = 170413 mensajes en la partición global. La dirección de compensación física es 348 [ tenga en cuenta que esta dirección de compensación física no está compensada, la compensación global es 170413]

Ubique rápidamente mensajes en partición

Dado que el mensaje está dividido en segmentos en Partion, ¿cómo localizamos rápidamente la posición del mensaje y lo operamos con precisión? Tome la imagen de arriba como ejemplo, lea el mensaje con offset = 170418:

  • Primero busque el archivo de segmento, donde 00000000000000000000.index es el primer archivo, el segundo archivo es 00000000000000170410.index (el desplazamiento inicial es 170410 + 1 = 170411) y el tercer archivo es 00000000000000239430.index (desplazamiento inicial 239430 + 1 = 239431), por lo que este desplazamiento = 170418 cae en el segundo archivo. Los otros archivos posteriores son seguidos por analogía, nombrados y ordenados por sus compensaciones, y luego la ubicación específica del archivo se puede ubicar rápidamente de acuerdo con el método de búsqueda binaria .
  • En segundo lugar, según 170418-170410 = 8 en el archivo 00000000000000170410.index, se obtiene que es el 8º mensaje del segmento, y el índice se ubica nuevamente según el método de búsqueda binaria para obtener ** [desplazamiento de mensaje, desplazamiento físico] ** La coordenada [8,1325] está ubicada en la posición 1325 en el archivo 00000000000000170410.log para su lectura.
  • Después de encontrar la posición 1325, lea los mensajes en orden y asegúrese de terminar de leer este mensaje [¿Dónde termina este mensaje?] La estructura física del mensaje está resuelta y el mensaje tiene una estructura física fija, que incluye: desplazamiento (8 bytes), cuerpo del mensaje Se pueden determinar el tamaño (4 bytes), crc32 (4 bytes), mágico (1 byte), atributos (1 byte), longitud de la clave (4 bytes), clave (K bytes), carga útil (N bytes) y otros campos. El tamaño del mensaje, es decir, donde termina la lectura.

El anterior es el método detallado para localizar el mensaje. A través del método de índice, el mensaje correspondiente se puede encontrar rápidamente incluso después de que Kafka escriba en el disco secuencialmente.

Este blog explica el flujo de trabajo y el mecanismo de almacenamiento de Kafka. De hecho, para Kafka, más estrategias se reflejan en el productor y el consumidor. En los siguientes dos blogs, presentaremos la estrategia del productor y la estrategia del consumidor respectivamente .

Parte del contenido se refiere a https://gitbook.cn/books/5ae1e77197c22f130e67ec4e/index.html

Supongo que te gusta

Origin blog.csdn.net/sinat_33087001/article/details/108335097
Recomendado
Clasificación