Un Segment File es un archivo inmutable y append-only que almacena un subconjunto de datos en un sistema de almacenamiento log-structured. En lugar de modificar datos in-place, las nuevas escrituras y actualizaciones se añaden al final del Segment File activo. Una vez que un Segment File alcanza un tamaño predefinido o un cierto umbral de tiempo, se cierra y se convierte en inmutable, y un nuevo Segment File se abre para las escrituras entrantes. Este modelo simplifica la gestión de concurrencia y la recuperación ante fallos, ya que los datos históricos permanecen intactos.
La implementación de Segment Files es prominente en bases de datos y sistemas de almacenamiento que adoptan una arquitectura log-structured merge-tree (LSM-tree). Ejemplos concretos incluyen Apache Cassandra, Apache Kafka, Elasticsearch y RocksDB. En Apache Kafka, los Segment Files almacenan los mensajes de un topic-partition, donde cada segmento contiene un rango de offsets. En RocksDB y Apache Cassandra, los SSTables (Sorted String Tables) son esencialmente Segment Files que contienen pares clave-valor ordenados, generados por la compactación de memtables y otros SSTables.
Para un arquitecto, los Segment Files son cruciales por varios motivos. Permiten escrituras de alto rendimiento al convertir operaciones aleatorias en escrituras secuenciales, lo que es eficiente para HDDs y SSDs. Sin embargo, la lectura de datos puede requerir buscar en múltiples Segment Files y aplicar procesos de compactación (merge) para eliminar versiones obsoletas o duplicadas, lo que introduce latencia y consumo de recursos (CPU, I/O). La elección del tamaño del segmento impacta directamente el rendimiento de escritura, la frecuencia de compactación y la eficiencia de la recuperación. Un tamaño de segmento pequeño puede aumentar la frecuencia de compactación, mientras que uno grande puede ralentizar la recuperación y el rebalanceo. Comprender estos trade-offs es fundamental para diseñar sistemas de almacenamiento escalables y resilientes.