Translate

miércoles, 8 de mayo de 2019

Compactaciones en Apache Cassandra


Como dijimos anteriormente SSTables son inmutables, esto ayuda a cassandra en ser más rápida en la escritura. Por ejemplo ante una modificación, cassandra no necesita buscar el registro a modificar, solo escribe una nueva fila. El proceso de compactación permite mejorar las lecturas y ahorrar en disco dado que mergea los SSTables. Es decir en el proceso de compactación los datos y las claves son mergeados, las columnas son combinadas, se eliminan las marcas de tombstones y un nuevo indice es creado.

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í.