¿Cómo lo hace Kafka tan rápido? ¿Cómo leer y escribir datos de manera eficiente?

Independientemente de si Kafka se utiliza como una MQ o una capa de almacenamiento, no hay más que dos funciones (muy simples). Una es que los datos producidos por el Productor se almacenan en el intermediario y la otra es que el Consumidor lee los datos del intermediario. Entonces, la solidez de Kafka se refleja en dos aspectos de la lectura y la escritura. Hablemos de las razones de la solidez de Kafka.

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

1. Utilice Partición para lograr un procesamiento paralelo

Todos sabemos que Kafka es un sistema de mensajería Pub-Sub. Tanto si se trata de publicación como de suscripción, es necesario especificar los temas.

El tema es solo un concepto lógico. Cada tema contiene una o más particiones, y se pueden ubicar diferentes particiones en diferentes nodos.

Por un lado, debido a que se pueden ubicar diferentes particiones en diferentes máquinas, pueden aprovechar al máximo el clúster para lograr un procesamiento paralelo entre máquinas. Por otro lado, debido a que la partición corresponde físicamente a una carpeta, incluso si hay varias particiones ubicadas en el mismo nodo, se pueden colocar diferentes particiones en el mismo nodo en diferentes discos a través de la configuración, para lograr un procesamiento paralelo entre discos. Aproveche los múltiples discos.

Puede procesarse en paralelo, la velocidad definitivamente mejorará y varios trabajadores definitivamente serán más rápidos que un trabajador.

"

¿Puede escribir en diferentes discos en paralelo? ¿Se puede controlar la velocidad de lectura y escritura del disco?

Luego, simplemente hable primero sobre las cosas del disco / E / S

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

¿Cuáles son los factores limitantes del rendimiento del disco duro? ¿Cómo diseñar el sistema según las características de E / S del disco?

Los componentes principales dentro del disco duro son el plato del disco, el brazo de transmisión, el cabezal de lectura y escritura y el motor del eje. Los datos reales se escriben en el disco, y la lectura y escritura la realiza principalmente el cabezal de lectura y escritura del brazo de transmisión. En la operación real, el eje gira los platos del disco y luego el brazo de transmisión se puede extender para permitir que el cabezal de lectura realice operaciones de lectura y escritura en los platos. La estructura física del disco se muestra en la siguiente figura:

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

Debido a la capacidad limitada de un solo disco, un disco duro general tiene más de dos discos, cada uno de los cuales tiene dos lados y puede registrar información, por lo que un disco corresponde a dos cabezales. El disco está dividido en muchas áreas con forma de sector, y cada área se denomina sector. La superficie del disco se centra en el centro del disco.Los círculos concéntricos con diferentes radios se denominan pistas y los cilindros compuestos por pistas con el mismo radio en diferentes discos se denominan cilindros. Tanto la pista como el cilindro representan círculos con diferentes radios, en muchos casos la pista y el cilindro se pueden utilizar indistintamente. El ángulo de visión vertical del plato del disco se muestra a continuación:

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

El factor clave que afecta al disco es el tiempo de servicio del disco, es decir, el tiempo que tarda el disco en completar una solicitud de E / S. Se compone de tiempo de búsqueda, retardo de rotación y tiempo de transmisión de datos.

El rendimiento continuo de lectura y escritura del disco duro mecánico es muy bueno, pero el rendimiento de lectura y escritura aleatoria es muy deficiente. Esto se debe principalmente a que el cabezal tarda en moverse a la pista correcta. Al leer y escribir al azar, el cabezal debe moverse continuamente y se pierde tiempo en el cabezal. Abordar, por lo que el rendimiento no es alto. Los indicadores principales importantes para medir discos son IOPS y rendimiento.

En muchos marcos de código abierto como Kafka y HBase, la E / S aleatoria se convierte en E / S secuencial tanto como sea posible mediante escrituras adicionales, para reducir el tiempo de direccionamiento y el retraso de rotación, maximizando así IOPS.

Los estudiantes interesados ​​pueden ver esas cosas sobre la E / S de disco

La velocidad de lectura y escritura del disco depende de cómo lo use, es decir, lectura y escritura secuencial o lectura y escritura aleatoria.

2. Escribe el disco de forma secuencial

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

Cada partición en Kafka es una secuencia ordenada e inmutable de mensajes . Los mensajes nuevos se añaden constantemente al final de la partición. Esto es escritura secuencial.

Alguien hizo una prueba de referencia hace mucho tiempo: "2 millones de escrituras por segundo (en tres máquinas baratas)" http://ifeve.com/benchmarking-apache-kafka-2-million-writes-second-three -máquinas-baratas /

Debido al número limitado de discos, es imposible guardar todos los datos. De hecho, Kafka, como sistema de mensajería, no necesita guardar todos los datos. Los datos antiguos deben eliminarse. También debido a la escritura secuencial, cuando Kafka usa varias estrategias de eliminación para eliminar datos, no modifica el archivo usando el modo "lectura-escritura", sino que divide la partición en múltiples segmentos, y cada segmento corresponde a un archivo físico. , Elimine los datos en Partición eliminando todo el archivo. Esta forma de borrar datos antiguos también evita operaciones de escritura aleatorias en archivos.

3. Aproveche al máximo la caché de página

El propósito de introducir la capa de caché es mejorar el rendimiento del sistema operativo Linux para el acceso al disco. La capa de caché almacena en caché parte de los datos del disco en la memoria. Cuando llega una solicitud de datos, si los datos existen en la caché y son los más recientes, los datos se pasan directamente al programa de usuario, lo que elimina el funcionamiento del disco subyacente y mejora el rendimiento. La capa de caché también es una de las principales razones por las que las IOPS de disco pueden superar las 200.

En la implementación de Linux, el caché de archivos se divide en dos niveles, uno es caché de página y el otro es caché de búfer.Cada caché de página contiene varios cachés de búfer. Page Cache se utiliza principalmente como un caché de datos de archivo en el sistema de archivos, especialmente cuando el proceso tiene operaciones de lectura / escritura en el archivo. Buffer Cache está diseñado principalmente para ser utilizado por el sistema para el almacenamiento en caché de datos de bloques cuando el sistema lee y escribe en dispositivos de bloque.

Beneficios de usar Page Cache:

  • El programador de E / S ensamblará pequeños bloques consecutivos en grandes escrituras físicas para mejorar el rendimiento
  • El Programador de E / S intentará reordenar algunas operaciones de escritura para reducir el tiempo de movimiento del cabezal del disco.
  • Haga un uso completo de toda la memoria libre (memoria que no sea JVM). Si usa caché de capa de aplicación (es decir, memoria de pila JVM), aumentará la carga de GC
  • Las operaciones de lectura se pueden realizar directamente en Page Cache. Si las velocidades de consumo y producción son las mismas, ni siquiera necesita intercambiar datos a través de discos físicos (directamente a través de Page Cache)
  • Si el proceso se reinicia, la caché en la JVM no será válida, pero la caché de página todavía está disponible

Una vez que el Broker recibe los datos, solo escribe los datos en la caché de página cuando escribe en el disco y no garantiza que los datos se escribirán por completo en el disco. Desde este punto de vista, es posible que los datos de la caché de página no se escriban en el disco cuando la máquina está inactiva, lo que puede provocar la pérdida de datos. Pero este tipo de pérdida solo ocurre en escenarios donde el sistema operativo no funciona, como fallas de energía de la máquina, y este escenario puede resolverse completamente mediante el mecanismo de replicación de nivel Kafka. Si se obliga a que los datos de la caché de página se descarguen en el disco para garantizar que no se pierdan datos en este caso, el rendimiento se reducirá. Debido a esto, Kafka proporciona dos parámetros, flush.messages y flush.ms, para forzar que los datos de Page Cache se descarguen en el disco, pero Kafka no recomienda su uso.

4. Tecnología Zero Copy

En Kafka, una gran cantidad de datos de red se almacena en el disco (Producer to Broker) y los archivos de disco se envían a través de la red (Broker to Consumer). El rendimiento de este proceso afecta directamente al rendimiento general de Kafka.

El núcleo del sistema operativo es el kernel, que es independiente de las aplicaciones ordinarias y puede acceder al espacio de memoria protegido, así como acceder a los dispositivos de hardware subyacentes.

Para evitar que el proceso del usuario opere directamente el kernel y garantizar la seguridad del kernel, el sistema operativo divide la memoria virtual en dos partes, una es el espacio del kernel (espacio del kernel) y la otra es el espacio del usuario (espacio del usuario).

En los sistemas Linux tradicionales, las interfaces de E / S estándar (como lectura, escritura) se basan en operaciones de copia de datos, es decir, las operaciones de E / S harán que los datos estén entre el búfer en el espacio de direcciones del kernel y el búfer en el espacio de direcciones del usuario. Copiar, por lo que las E / S estándar también se denominan E / S en caché. La ventaja de esto es que si los datos solicitados se han almacenado en la memoria caché del kernel, las operaciones de E / S reales se pueden reducir, pero la desventaja es que el proceso de copia de datos provocará una sobrecarga de la CPU.

Simplificamos la producción y el consumo de Kafka en los dos procesos siguientes [2]:

  1. Conservar los datos de la red en el disco (de productor a intermediario)
  2. El archivo de disco se envía a través de la red (Broker to Consumer)

4.1 Persistencia de los datos de la red en el disco (Productor to Broker)

En el modo tradicional, la transferencia de datos desde la red al archivo requiere 4 copias de datos, 4 conmutadores de contexto y dos llamadas al sistema.

 

data = socket.read()// 读取网络数据 File file = new File() file.write(data)// 持久化到磁盘 file.flush()

Este proceso en realidad tuvo lugar cuatro copias de datos:

  1. Primero copie los datos de la red al modo de kernel Socket Buffer a través de la copia DMA
  2. Luego, la aplicación lee los datos del búfer en modo kernel en el modo de usuario (copia de CPU)
  3. Luego, el programa de usuario copia el búfer de modo de usuario al modo de kernel (copia de CPU)
  4. Finalmente, copie los datos al archivo de disco a través de la copia DMA

DMA (acceso directo a memoria): acceso directo a la memoria. DMA es un mecanismo de hardware que permite la transferencia de datos bidireccional entre los periféricos y la memoria del sistema sin la participación de la CPU. El uso de DMA puede hacer que la CPU del sistema elimine el proceso de transmisión de datos de E / S real, mejorando así en gran medida el rendimiento del sistema.

Al mismo tiempo, se acompaña de cuatro cambios de contexto, como se muestra en la siguiente figura

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

La ubicación de datos generalmente no es en tiempo real, y lo mismo ocurre con la persistencia de datos del productor de Kafka. Los datos de Kafka no se escriben en el disco duro en tiempo real, sino que hace un uso completo del almacenamiento de paginación de los sistemas operativos modernos para utilizar la memoria para mejorar la eficiencia de E / S, que es la caché de página mencionada en la sección anterior.

En el caso de Kafka, los datos producidos por el productor se almacenan en el intermediario. Este proceso lee los datos de red del búfer de socket, que en realidad se pueden colocar directamente en el espacio del kernel. No es necesario leer los datos de red del búfer de socket en el búfer del proceso de la aplicación; aquí el búfer del proceso de la aplicación es en realidad el intermediario, y el intermediario recibe los datos del productor para su persistencia.

En este escenario especial: cuando se reciben datos de red desde el búfer de socket, el proceso de aplicación no necesita procesamiento intermedio y realiza directamente la persistencia. Puede utilizar la asignación de archivos de memoria mmap.

Archivos mapeados en memoria: mmap para abreviar, o MMFile El propósito de mmap es mapear la dirección del búfer de lectura en el kernel al búfer del usuario en el espacio del usuario. De esta forma, el búfer del kernel y la memoria de la aplicación se comparten, y se elimina el proceso de copiar datos del búfer de lectura del kernel al búfer del usuario. Su principio de funcionamiento es utilizar directamente la página del sistema operativo para asignar archivos directamente a la memoria física. Una vez finalizada la asignación, sus operaciones en la memoria física se sincronizarán con el disco duro.

De esta manera, se puede obtener un gran impulso de E / S, eliminando la sobrecarga de copiar del espacio del usuario al espacio del kernel.

mmap también tiene un defecto muy obvio: no es confiable, los datos escritos en mmap no se escriben realmente en el disco duro, el sistema operativo realmente escribirá los datos en el disco duro cuando el programa llame activamente a flush. Kafka proporciona un parámetro: producer.type para controlar si flush está activo o no; si Kafka escribe mmap, se vacía inmediatamente y luego regresa al Producer, que se llama sincronización; después de escribir mmap, regresa a Producer sin llamar a flush, que se llama asincrónico. (asíncrono), el valor predeterminado es sincronización.

¿Por qué Kafka es tan rápido? Leer y escribir datos de manera eficiente, resultó ser tan

La tecnología de copia cero significa que cuando la computadora está realizando operaciones, la CPU no necesita copiar datos de un área de memoria a otra área de memoria, lo que puede reducir el cambio de contexto y el tiempo de copia de la CPU.

Su función es reducir la cantidad de copias de datos, reducir las llamadas al sistema, realizar una participación cero de la CPU y eliminar completamente la carga de la CPU en el proceso de transmisión de datos desde el dispositivo de red al espacio del programa de usuario.

Actualmente existen tres tipos de tecnología de copia cero [3]:

E / S directa: los datos cruzan directamente el kernel y se transfieren entre el espacio de direcciones del usuario y los dispositivos de E / S. El kernel solo realiza tareas auxiliares como la configuración de almacenamiento virtual necesaria;

Evite la copia de datos entre el kernel y el espacio del usuario: cuando la aplicación no necesita acceder a los datos, puede evitar copiar los datos del espacio del kernel al espacio del usuario.

mmap

enviar archivo

empalme y tee

mapa de calcetines

copiar en escritura: tecnología de copia en escritura, los datos no necesitan copiarse por adelantado, pero parte de ellos se copia cuando es necesario modificarlos.

4.2 El archivo de disco se envía a través de la red (Broker to Consumer)

Forma tradicional: lea el disco primero, luego use el socket para enviar, en realidad se ha copiado cuatro veces

 

buffer = File.read Socket.send(buffer)

Este proceso se puede comparar con el mensaje de producción anterior:

  1. Primero lea los datos del archivo en el búfer de modo kernel (copia DMA) a través de la llamada al sistema
  2. Luego, el programa de aplicación lee los datos del búfer de estado de la memoria en el búfer de estado de usuario (copia de CPU)
  3. Luego, el programa de usuario copia los datos del búfer de modo de usuario al búfer de modo de kernel cuando envía datos a través del Socket (copia de CPU)
  4. Finalmente, copie los datos al búfer NIC a través de la copia DMA

El kernel de Linux 2.4+ proporciona copia cero a través de la llamada al sistema sendfile. Después de que los datos se copian en el búfer del modo kernel a través de DMA, se copian directamente en el búfer de la NIC a través de DMA sin copia de la CPU. Esta es también la fuente del término copia cero. Además de reducir la copia de datos, debido a que toda la transmisión de la red de archivos de lectura se completa mediante una llamada de envío de archivos, todo el proceso solo tiene dos conmutadores de contexto, lo que mejora considerablemente el rendimiento.

image.png

La solución de Kafka aquí es usar transferTo / transferFrom de NIO para llamar al archivo de envío del sistema operativo para lograr una copia cero. Se produjeron un total de 2 copias de datos del kernel, 2 cambios de contexto y una llamada al sistema, eliminando las copias de datos de la CPU

5. Procesamiento por lotes

En muchos casos, el cuello de botella del sistema no es la CPU o el disco, sino la E / S de la red.

Por lo tanto, además del procesamiento por lotes de bajo nivel proporcionado por el sistema operativo, los clientes y corredores de Kafka acumularán varios registros (incluida la lectura y escritura) en un lote antes de enviar datos a través de la red. El proceso por lotes registrado amortiza la sobrecarga de ida y vuelta de la red y utiliza paquetes de datos más grandes para mejorar la utilización del ancho de banda.

6. Compresión de datos

El productor puede comprimir los datos y enviarlos al corredor, reduciendo así el costo de transmisión de la red.Los algoritmos de compresión soportados actualmente son: Snappy, Gzip, LZ4. La compresión de datos se utiliza generalmente junto con el procesamiento por lotes como método de optimización.

para resumir

Si, el entrevistador me vuelve a preguntar: ¿Por qué Kafka es tan rápido? Yo diría esto:

  • procesamiento paralelo de particiones
  • Escriba el disco secuencialmente, aproveche al máximo las características del disco
  • Utilización de la caché de páginas de almacenamiento paginado del sistema operativo moderno para usar la memoria y mejorar la eficiencia de E / S
  • Tecnología de copia cero
  • Los datos producidos por el productor se conservan en el intermediario y el archivo mmap se utiliza para el mapeo para lograr una escritura secuencial rápida.
  • El cliente lee los datos del corredor, usa sendfile para leer el archivo de disco en el búfer del kernel del sistema operativo y luego los transfiere al búfer NIO para la transmisión de red, lo que reduce el consumo de CPU

 

Supongo que te gusta

Origin blog.csdn.net/yunduo1/article/details/108714939
Recomendado
Clasificación