Lápidas en Apache Cassandra

Los tipos de lápidas

Las lápidas se pueden crear de varias maneras y es crucial que comprenda ciertas trampas que pueden llevar a la creación implícita de lápidas que permanecerán ocultas desde el punto de vista del programador hasta que aparezcan como un problema plausible que afecte a su clúster. Por lo tanto, es importante comprender los tipos de lápidas que se pueden crear en Cassandra:

Lápidas de celda
Las instrucciones Insert pueden crear lápidas cuando un determinado valor de celda se establece como nulo en la consulta. Esto puede suceder cuando la capa de abstracción de la base de datos o un marco de trabajo OR abstrae la consulta con representación a nivel de objeto y los valores nulos se envían implícitamente en la consulta real a Cassandra. Por ejemplo, considere la siguiente consulta CQL:

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');

Esto crearía una lápida de celda para la columna de reemplazos para el registro con store_number CA104.
Ahora considere la siguiente consulta de eliminación:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

Esto también crearía una lápida de celda para el registro correspondiente.

Lápidas de fila
Una fila entera se marca como lápida como resultado de una consulta de eliminación que identifica una fila. Por ejemplo:

DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;

Sstabledump mostraría un deletion_info a nivel de fila para las columnas de agrupación en clúster dentro de la partición.

,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]

Un gran número de lápidas de fila puede ser una indicación de un modelo de datos deficiente en el que la aplicación elimina con frecuencia registros de una tabla. En tales casos, considere revisar su modelo de datos y rediseñar las tablas en función de los patrones de consulta y la cardinalidad.

Lápidas de rango
Eliminar un rango completo de filas mediante la cláusula WHERE con una clave de partición y un rango representado por una columna de agrupación en clúster. Por ejemplo:

DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;

SSTabledump mostraría,

,"position" : 0
},
"rows" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
},
{
"type" : "range_tombstone_bound",
"end" : {
"type" : "inclusive",
"clustering" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
}
]
}
}}

El SSTabledump imprimiría lápidas de rango con un tipo de range_tombstone_bound con un inicio y un final de la clave de agrupación utilizada para denotar el rango de filas que fueron sepulcradas dentro de una partición. Las lápidas de rango también se crean cuando se reemplaza una colección completa con una consulta de INSERCIÓN o ACTUALIZACIÓN. Siempre se recomienda reemplazar elementos específicos de una colección en lugar de reemplazar toda la colección en sí.

Lápidas de partición
Las lápidas de este tipo se crean cuando se dispara una consulta de eliminación utilizando solo la clave de partición de la cláusula WHERE. Por ejemplo:

DELETE FROM item_price WHERE store_number = 'CA102';

Como sin duda ha adivinado, esto eliminaría toda la partición CA102 y el sstabledump mostraría a la partición el atributo deletion_info con marca de tiempo marked_deleted.

,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]

Lápidas TTL
Estas lápidas se crean automáticamente cuando el tiempo de vida expira para una fila o celda en particular. Sin embargo, están marcadas de manera diferente a las lápidas normales.

La siguiente instrucción insert crearía una lápida TTL después de 20 segundos.

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code) VALUES ( 'CA103', 'item103', 3.0, {'item101-r', 'item101'}, 'p103') using TTL 20;

El sstabledump mostraría:

,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]

Resumen

  • Cassandra trata internamente una consulta de eliminación como una operación de actualización que agrega un marcador llamado tombstone en los datos que se van a eliminar.
  • Las lápidas se pueden configurar con un tiempo de caducidad (gc_grace_seconds) y se limpian durante el proceso de compactación.
  • la utilidad sstabledump se puede usar para ver el contenido de un archivo SSTable en un formato legible por humanos.
  • Evite escribir valores nulos en sus tablas, ya que puede crear lápidas. Tenga cuidado al realizar consultas abstraídas por su capa OR.
  • Las lápidas de rango se prefieren a las lápidas de celda o fila, ya que solo almacenan los límites de rango ahorrando espacio en disco.
  • Evite reemplazar elementos enteros de una colección como el conjunto, la lista, el mapa con consultas de INSERCIÓN y ACTUALIZACIÓN, ya que esto puede crear lápidas de rango.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.