Skip to content

Arquitectura interna del log ​

Kafka esta construido alrededor de logs particionados. Un log es una secuencia append-only de registros ordenados por offset.

Log segmentado ​

Cada partition se guarda como varios segmentos en disco.

txt
orders.created-0/
  00000000000000000000.log
  00000000000000000000.index
  00000000000000001000.log
  00000000000000001000.index

Cuando un segmento alcanza cierto tamano o tiempo, Kafka abre otro.

Append-only ​

Kafka escribe al final del log. Esto favorece I/O secuencial.

mermaid
flowchart LR
  A["offset 0"] --> B["offset 1"]
  B --> C["offset 2"]
  C --> D["new writes append here"]

Indices ​

Kafka mantiene indices para localizar offsets dentro de segmentos sin recorrer todo el archivo.

Page cache ​

Kafka se apoya mucho en la page cache del sistema operativo. Por eso memoria del host, disco y patrones de lectura importan tanto.

No todo "uso de memoria" implica problema: parte puede ser cache util del SO.

Zero-copy ​

Kafka puede transferir datos desde disco a red de forma eficiente reduciendo copias entre espacio kernel y user space.

Esto ayuda mucho cuando consumidores leen eventos ya almacenados.

Retencion ​

La retencion elimina segmentos completos cuando cumplen condiciones.

txt
retention.ms
retention.bytes

Kafka no borra evento por evento en el caso normal; borra segmentos.

Compaction ​

Con cleanup.policy=compact, Kafka conserva la ultima version por key.

txt
key=user-1 value=A
key=user-1 value=B

Tras compactacion, puede conservarse solo B para esa key.

ISR ​

ISR significa in-sync replicas: replicas suficientemente al dia con el leader.

Si una replica se queda atras, sale del ISR. Esto afecta disponibilidad de escrituras con acks=all.

Controller y metadata ​

El cluster necesita coordinar metadata:

  • Brokers activos.
  • Leaders de partitions.
  • Configuracion de topics.
  • Estado de replicas.

En Kafka moderno, esta coordinacion puede hacerse con KRaft en vez de ZooKeeper.

Buenas practicas ​

  • Usa discos rapidos y monitoriza I/O.
  • Ajusta retencion segun reprocesamiento real.
  • Entiende compaction antes de usarla.
  • Monitoriza under-replicated partitions.
  • Evita eventos gigantes.
  • Dimensiona page cache y disco con margen.