La compactación es
el proceso que libera espacio en le disco mergeando los archivos de
datos que se fueron acumulando. Esto es aproximadamente análogo a la
reconstrucción de una tabla en el mundo relacional. Pero la
principal diferencia en Cassandra es que está pensada como una
operación transparente que se realiza a lo largo de la vida del
servidor.
En la compactación,
los datos combinados se ordenan, se crea un nuevo índice sobre los
datos ordenados, y los datos recién fusionados, ordenados e
indexados se escriben en un único SSTable nuevo (cada SSTable consta
de varios archivos, incluidos: Datos, Índice y Filtros).
Este proceso es
administrado por la clase
org.apache.cassandra.db.compaction.CompactionManager.
Otra función
importante de la compactación es mejorar el rendimiento al reducir
el número de búsquedas requeridas. Hay un número limitado de
SSTables para inspeccionar y encontrar los datos de la columna para
una clave dada. Si una clave se muta frecuentemente, es muy probable
que todas las mutaciones terminen en SSTables vacios. Compactarlos
evita que la base de datos tenga que realizar una búsqueda para
extraer los datos de cada SSTable a fin de ubicar el valor actual de
cada columna solicitada en una lectura.
Cuando se realiza la
compactación, hay un pico temporal en la I/O del disco y el tamaño
de los datos en el disco mientras se leen los SSTables antiguos y se
están escribiendo nuevos SSTables.
Cassandra soporta
diferentes algoritmos de compactaciones y cada estrategía de
compactación esta relacionada con un algoritmo, es decir utiliza el
patron Strategy para implementar diferentes modos de compactar. La
clase padre de las estrategías es AbstractCompactionStrategy. Y se
tienen las siguientes estrategias disponibles:
- SizeTieredCompactionStrategy (STCS) es la estrategia de compactación predeterminada y se recomienda para tablas de escritura intensiva
- LeveledCompactionStrategy (LCS) se recomienda para tablas de lectura intensiva
- DateTieredCompactionStrategy (DTCS), que está destinado a series de tiempo o datos basados en la fecha.
Una característica
interesante de la compactación se relaciona con su intersección con
la reparación incremental. Una característica llamada
anticompactación se añadió en la versión 2.1. Como su nombre lo
indica, la anti-compactación es en cierto modo una operación
opuesta a la compactación regular, ya que el resultado es la
división de un SSTable en dos SSTables, uno que contiene datos
reparados y el otro que contiene datos sin reparar. La compensación
es que se introduce una mayor complejidad en las estrategias de
compactación, que deben manejar los SSTables reparados y no
reparados por separado para que no se fusionen entre sí.