Las experiencias con lápidas en Apache Cassandra
Detectar y prevenir lápidas
Las lápidas se pueden detectar en registros y mediante el monitoreo de métricas específicas. Su duración está definida por el ajuste de tabla gc_grace_seconds.
Ajustar la configuración de la tabla
- gc_grace_seconds
La configuración predeterminada para gc_grace_seconds es 864000 (10 días). Para nosotros, tenía sentido reducir ese valor a 345600 (4 días). En caso de que decida cambiar el período de gracia, asegúrese de realizar reparaciones dentro de ese intervalo de tiempo.
Simplemente puede modificar el valor de las tablas existentes o crear una nueva tabla como esta:
CREAR un espacio de claves de TABLA.nombre de tabla CON GC_GRACE_SECONDS = 345600;
ALTERAR el espacio de claves DE LA TABLA.nombre de tabla CON GC_GRACE_SECONDS = 345600;
- TTL
Después de que TTL pasa el intervalo de tiempo definido, las filas se eliminan y los valores se convierten en lápidas. De forma predeterminada, las filas/valores no caducan.
Mientras experimentábamos los problemas de lápidas, descubrimos que necesitábamos aumentar el tiempo de vida de nuestras mesas. Al establecer este valor en 1 ½ días, los trabajos de escritura fallidos tuvieron el efecto de eliminar todos los datos de una tabla a la vez. Debido a las actualizaciones faltantes, cada fila estaba marcada con una lápida. Establecer el valor más alto nos permite volver a ejecutar trabajos a tiempo y evitar la creación innecesaria de una gran cantidad de lápidas.
- tombstone_warn_threshold
La advertencia de umbral de lápida está configurada en 1.000 de forma predeterminada y se verá en sus registros en caso de que una sola consulta escanee más de 1.000 lápidas.
- tombstone_failure_threshold
El umbral de error de lápida se alcanza cuando se escanean 100.000 lápidas mediante una sola consulta. En este caso, la consulta se cancelará, lo que significa que los datos de la tabla afectada ya no se pueden consultar.
Esos ajustes de umbral se pueden cambiar, pero tenga en cuenta que si los aumenta, puede provocar que los nodos se queden sin memoria.
Realice reparaciones regulares
Cassandra viene con alta tolerancia a fallos y funciona bien incluso si un nodo no está disponible temporalmente. Sin embargo, es una buena práctica ejecutar la reparación de nodetool después de un error de nodo. Especialmente si desea evitar la pérdida de datos a toda costa.
Durante el proceso de reparación, el nodo que no estaba disponible recibirá las escrituras que ocurrieron durante su tiempo de inactividad.
Es un buen enfoque para ejecutar reparaciones dentro de los segundos gc_grace_seconds y de forma regular, de lo contrario, podría experimentar casos en los que los datos eliminados se resucitan.
Hay un par de formas de ejecutar reparaciones automáticamente. Una de ellas es Cassandra Reaper. Esta herramienta viene con una interfaz de usuario agradable que facilita la programación de reparaciones.
Configurar y ejecutar la compactación
quitar finalmente lápidas y liberar espacio en disco, la compactación debe ser activado. Hay diferentes tipos de compactación. La compactación menor ejecuta la compactación sobre todas las tablas y se ejecuta automáticamente en Cassandra. Elimina todas las lápidas que son más antiguas que el período de gracia. Si activa una compactación manual sobre todas las mesas, se denomina compactación mayor. Tenga en cuenta que la compactación debe activarse para cada nodo individualmente. También tiene la opción de ejecutar una compactación definida por el usuario solo en un grupo de sstables especificados.
Compactar datos en C* generalmente significa fusionar sstables en una única sstable nueva. Al realizar lecturas en varias filas, cuantas más tablas se deban escanear, más lento será el proceso. Para evitar que esto suceda, la compactación debe ejecutarse de forma regular.
Para iniciar las compacciones manualmente, puede usar nodetool compact. En caso de que no especifique un espacio de claves o tabla, la compactación se ejecutará en todos los espacios de claves y tablas.
nodetool compact keyspace tablename
Este comando inicia una compactación en la tabla especificada. Debe averiguar qué estrategia de compactación está configurada para sus tablas y compararla con las estrategias alternativas. Si desea averiguar si otra estrategia satisface mejor sus necesidades, puede consultar la documentación de DataStax.
Métricas de tabla de monitor
1. Nodetool
Nodetool es la interfaz de línea de comandos de Cassandra. Es útil si desea obtener más información sobre el rendimiento de sus clústeres. Puede consultar la lista completa de posibles comandos proporcionados por DataStax.
Los comandos Nodetool deben ejecutarse para cada nodo de forma individual. Ejecutamos C * en Kubernetes para que podamos abrir un shell para el Cassandra pod en ejecución de la siguiente manera:
kubectl exec-it cassandra-0-n recommend bash
Desde ese punto podemos usar nodetool para obtener información variada sobre nuestras tablas. El comando nodetool tablestats se puede realizar para imprimir estadísticas de espacios de claves o tablas individuales:
Los valores de “lápidas promedio por rebanada” y “lápidas máximas por rebanada” le indicarán cuántas lápidas se escanearon por consulta en los últimos cinco minutos. Si ve que este valor es muy alto, es posible que necesite ejecutar compactación más a menudo para esa tabla.
2. Herramientas SSTable
Antes de ejecutar Herramientas SSTable, Cassandra debe detenerse. El comando sstableutil le dará una lista de archivos sstables existentes para una tabla determinada. La ejecución de sstablemetadata en estos archivos le proporcionará información útil sobre la tabla especificada, como por ejemplo el TTL y una estimación de lápidas sueltas.
3. Prometheus y Grafana
Nuestro monitoreo para C* está configurado con Prometheus y Grafana. Después de recibir las advertencias de umbral de lápidas, decidimos agregar un panel a nuestro panel que nos da una idea del comportamiento de lápidas para cada una de nuestras tablas.
Cassandra tiene una métrica de tabla llamada ‘TombstoneScannedHistogram’, que presenta el histograma de lápidas que se escanearon por consulta. Al mostrar el percentil 99 veremos si algo no está bien.