¿Qué es una SSTable?

Respuestas:

105

La tabla de cadenas ordenadas (prestada de Google) es un archivo de pares de cadenas de clave / valor, ordenados por claves

Schildmeijer
fuente
4
¡Gracias por otra excelente respuesta de SO Cassandra! Por cierto, ¿has visto a esta pregunta: stackoverflow.com/questions/2573106/...
knorv
¿Es generalmente inmutable?
Dean J
1
sí, los sstables son inmutables por diseño, lo cual es una característica asombrosa
Schildmeijer
Entonces, ¿cómo puede ser ordenado e inmutable?
xjcl
56

"Una SSTable proporciona un mapa inmutable ordenado y persistente de claves a valores, donde tanto las claves como los valores son cadenas de bytes arbitrarias. Se proporcionan operaciones para buscar el valor asociado con una clave especificada y para iterar sobre todos los pares clave / valor en un rango de claves especificado. Internamente, cada SSTable contiene una secuencia de bloques (normalmente cada bloque tiene un tamaño de 64 KB, pero esto es configurable). Un índice de bloque (almacenado al final de la SSTable) se utiliza para localizar bloques; el índice se carga en la memoria cuando se abre la SSTable. Se puede realizar una búsqueda con una única búsqueda de disco: primero encontramos el bloque apropiado realizando una búsqueda binaria en el índice en memoria y luego leyendo el bloque apropiado del disco. Opcionalmente, una SSTable se puede mapear completamente en la memoria, lo que nos permite realizar búsquedas y escaneos sin tocar el disco."

zhouchonghz AT gmail.com
fuente
4
"sin tocar el disco" -> "sin ser consciente de que se está tocando el disco". La E / S mapeada en memoria es una técnica muy útil porque delega la E / S real al sistema operativo, asumiendo que puede hacer un buen trabajo en el almacenamiento en caché (especialmente cuando varios procesos comparten el mismo archivo). Pero tiene la desventaja de que no puedes controlarlo. Si la página no está residente en la memoria, el hilo se bloqueará y no podrá realizar otras operaciones; compárelo con "async IO", donde puede registrar una devolución de llamada y hacer otras cosas en el mismo hilo, mientras el IO está pendiente.
ithkuil
2
@ithkuil: Puede tener absolutamente el control de las E / S mapeadas en la memoria al menos hasta el punto de poder asegurarse de que ciertas páginas estén en la memoria o se hayan comprometido en el disco (todavía hay margen de maniobra para las páginas que no se garantiza que estén en memoria pero muy bien podría ser). De eso se tratan cosas maravillosas como mlock (), msync () y MAP_LOCKED. También puede obtener una comprensión de lo que está y no está paginado actualmente a través de mincore ().
Christopher Smith
2
@ChristopherSmith: sí, tienes razón, hay formas de controlarlo. Sin embargo, generalmente se usa para secciones críticas de rendimiento (tiempo real) o problemas relacionados con la seguridad (como evitar que una contraseña en la memoria se intercambie en el disco). Los archivos mapeados en memoria son muy útiles precisamente por el hecho de que no tiene que decidir cuántos de ellos guardar en la memoria; de lo contrario, podría leer todo el archivo en la memoria sin mmap y lograr el mismo efecto. De hecho, acabo de hacer grepping con el código de cassandra; la única llamada se mlockall(MCL_CURRENT);realiza al inicio. Ver también: goo.gl/AEgPM
ithkuil
4
La cita anterior es del artículo de BigTable .
ShreevatsaR
4

Una tableta se almacena en forma de SSTables.

SSTable (directamente mapeado a GFS) es un almacenamiento inmutable basado en valores clave. Almacena fragmentos de datos, cada uno de 64 KB.

Definiciones:

  • Índice de las claves: clave y ubicación inicial
  • Chunk es una unidad de almacenamiento en GFS, la gestión de réplicas se realiza por fragmento
manjit singh
fuente
3
  • SSTable (engl. Tabla de cadenas ordenadas) es un archivo de pares de cadenas clave / valor, ordenadas por claves.

  • Una SSTable proporciona un mapa inmutable ordenado y persistente de claves a valores, donde tanto las claves como los valores son cadenas de bytes arbitrarias.

  • Internamente, cada SSTable contiene una secuencia de bloques (normalmente
    cada bloque tiene un tamaño de 64 KB, pero esto es configurable).

miksiii
fuente