[O princípio subjacente do Kafaka alcançar alto rendimento e baixa latência]

Os princípios básicos do Kafaka para alcançar alto rendimento e baixa latência

Embora Kafka seja um armazenamento de dados baseado em disco, ele possui características de alta simultaneidade, alto rendimento e baixa latência, e seu rendimento pode facilmente atingir dezenas de milhares, dezenas ou até milhões. Então, como Kafka faz isso?

gravação sequencial

Como todos sabemos, Kafka persiste registros de mensagens em discos locais. A maioria das pessoas pensa que o desempenho de leitura e gravação de disco é ruim e pode questionar como o desempenho do Kafka é garantido. Na verdade, seja memória ou disco, a chave para saber se é rápido ou lento depende do método de endereçamento.Os discos são divididos em leitura e gravação sequencial e leitura e gravação aleatória, e a memória também é dividida em leitura e gravação sequencial e leitura e gravação aleatória. A leitura e gravação aleatória baseada em disco é realmente muito lenta, mas o desempenho de leitura e gravação sequencial do disco é muito alto. Em geral, é três ordens de magnitude maior do que a leitura e gravação aleatória do disco. Em alguns casos, o desempenho de leitura e gravação sequencial do disco é ainda maior do que a leitura e gravação aleatória da memória .

As mensagens do Kafka são continuamente anexadas ao final do arquivo do disco local em vez de serem gravadas aleatoriamente, o que melhora significativamente o rendimento de gravação do Kafka.

Cache de página

Se a CPU quiser acessar arquivos em um disco externo, ela precisa primeiro copiar o conteúdo desses arquivos para a memória. Devido a limitações de hardware, a velocidade de transferência de dados do disco para a memória é muito lenta. Se houver espaço físico livre memória agora, por que não usá-la ? Essa memória livre é usada para armazenar em cache alguns conteúdos de arquivos do disco. Essa parte da memória usada para armazenar arquivos em disco é chamada de cache de página.

Através do Page Cache do sistema operacional, as operações de leitura e gravação do Kafka são basicamente baseadas na memória, e a velocidade de leitura e gravação foi bastante melhorada.

cópia zero

O que falamos principalmente aqui é a otimização do Kafka no lado do consumidor usando o mecanismo de “cópia zero” do sistema operacional Linux. Primeiro, vamos entender o caminho geral de transmissão dos dados enviados de um arquivo para uma conexão de rede de soquete:

  1. O sistema operacional lê dados do disco para o cache de páginas do espaço do kernel.
  2. O aplicativo lê os dados do Page Cache no buffer no espaço do usuário
  3. O aplicativo grava os dados no buffer de espaço do usuário de volta ao espaço do kernel para o buffer de soquete (buffer de soquete)
  4. O sistema operacional copia os dados do buffer de soquete para o buffer da NIC enviado pela rede

Este processo inclui 4 operações de cópia e 2 trocas de contexto do sistema, e o desempenho é realmente muito ineficiente. O mecanismo de "cópia zero" do sistema operacional Linux usa o método sendfile, que permite ao sistema operacional enviar dados diretamente do cache de página para a rede. Apenas a última etapa da operação de cópia é necessária para copiar os dados para a NIC buffer, evitando assim a necessidade de copiar novamente os dados. O diagrama esquemático é o seguinte:

imagem-20230923204205119

Através deste mecanismo de "cópia zero", o Page Cache combinado com o método sendfile, o desempenho do lado do consumidor Kafka também é bastante melhorado. É por isso que às vezes, quando o consumidor continua consumindo dados, não vemos que o IO do disco está relativamente alto, neste momento é o cache do sistema operacional que está fornecendo os dados.

Segmento de partição + índice

As mensagens do Kafka são armazenadas de acordo com a classificação do tópico, e os dados do tópico são armazenados em diferentes nós do corretor de acordo com as partições, uma por uma. Cada partição corresponde a uma pasta no sistema operacional e a partição é armazenada em segmentos. Isso também é muito consistente com a ideia de design de particionamento e agrupamento de sistemas distribuídos.

Através deste design particionado e segmentado, as mensagens do Kafka são realmente distribuídas e armazenadas em pequenos segmentos, e cada operação de arquivo também é um segmento operado diretamente. Para maior otimização da consulta, Kafka cria um arquivo de índice para os arquivos de dados segmentados por padrão, que é um arquivo .index no sistema de arquivos. Este design de partição + índice não apenas melhora a eficiência da leitura de dados, mas também melhora o paralelismo das operações de dados.

Leitura e gravação em lote

A leitura e gravação de dados Kafka também é feita em lotes, e não individualmente.
Além de aproveitar a tecnologia subjacente, o Kafka também fornece alguns meios para melhorar o desempenho no nível do aplicativo. O mais óbvio é usar lotes. Ao gravar dados no Kafka, as gravações em lote podem ser habilitadas, o que evita a latência e a sobrecarga de largura de banda da transmissão frequente de mensagens individuais pela rede. Supondo que a largura de banda da rede seja de 10 MB/S, é obviamente muito mais rápido transmitir uma mensagem de 10 MB de uma vez do que transmitir uma mensagem de 1 KB 100 milhões de vezes.

Compactação em lote

Em muitos casos, o gargalo do sistema não é a CPU ou o disco, mas a E/S da rede. Isso é especialmente verdadeiro para pipelines de dados que precisam enviar mensagens entre data centers na WAN. A compactação de dados consumirá uma pequena quantidade de recursos da CPU, mas para Kafka, a E/S da rede deve ser considerada.

  1. Se cada mensagem for compactada, mas a taxa de compactação for relativamente baixa, o Kafka usará compactação em lote, ou seja, várias mensagens serão compactadas juntas em vez de compactação de mensagem única.
  2. Kafka permite o uso de agregação recursiva de mensagens.Lotes de mensagens podem ser transmitidos em formato compactado e permanecer compactados no log até serem descompactados pelo consumidor.
  3. Kafka oferece suporte a vários protocolos de compactação, incluindo protocolos de compactação Gzip e Snappy.

Fonte: Kafka - Por que o Kafka pode atingir alto rendimento e baixa latência | Você consegue beber um copo de nada (liaosi.site)

Acho que você gosta

Origin blog.csdn.net/weixin_45483322/article/details/133217533
Recomendado
Clasificación