Cómo diseñar tu esquema

En esta página se explica cómo diseñar un esquema para una tabla de Cloud Bigtable. Antes de leer esta página, debes estar familiarizado con la descripción general de Cloud Bigtable.

Conceptos generales

Diseñar un esquema de Cloud Bigtable es muy diferente a diseñar un esquema para una base de datos relacional. Ten en cuenta los siguientes conceptos cuando diseñes tu esquema de Cloud Bigtable:

  • Cada tabla tiene solo un índice: la clave de fila. No existen índices secundarios.
  • Las filas se ordenan lexicográficamente por clave de fila, desde la string de bytes más baja a la más alta. Las claves de fila se ordenan mediante el sistema big-endian, que es el orden de bytes, o red; el equivalente binario del orden alfabético.
  • Todas las operaciones son atómicas a nivel de fila. Por ejemplo, si actualizas dos filas de una tabla, es posible que una fila se actualice correctamente y la otra actualización falle. Evita los diseños de esquema que requieran atomicidad que abarque varias filas.
  • Lo ideal es que las lecturas y escrituras se distribuyan de manera uniforme en el espacio de filas de la tabla.
  • En general, mantén toda la información de una entidad en una sola fila. Una entidad que no necesita actualizaciones y lecturas atómicas puede dividirse en varias filas. Se recomienda dividir en varias filas si los datos de la entidad son grandes (cientos de MB).
  • Las entidades relacionadas deben almacenarse en filas adyacentes, lo que hace que las lecturas sean más eficientes.
  • Las tablas de Cloud Bigtable son dispersas. Las columnas vacías no ocupan espacio alguno. Como resultado, podrías crear una gran cantidad de columnas, incluso si la mayoría de las columnas tienen la mayoría de las filas vacías.

Límites de tamaño

En Cloud Bigtable, se aplican límites de tamaño para los datos que almacenas en tus tablas. Asegúrate de considerar estos límites al diseñar tu esquema.

Debido a que en Cloud Bigtable se leen las filas de forma atómica, es especialmente importante limitar la cantidad total de datos que almacenas en una sola fila. Se recomienda almacenar un máximo de 10 MB en una sola celda y 100 MB en una sola fila. Además, debes mantenerte por debajo de los límites estrictos de tamaño de los datos en las celdas y filas.

Estos límites de tamaño se miden en megabytes binarios (MB), en los que 1 MB equivale a 220 bytes. Esta unidad de medida también se conoce como mebibyte (MiB).

Elige una clave de fila

Para que Cloud Bigtable tenga un rendimiento óptimo, es esencial pensar detenidamente cómo redactar tu clave de fila. Esto se debe a que las consultas más eficientes de Cloud Bigtable usan la clave de fila, un prefijo de clave de fila o un rango de filas para obtener los datos. Otros tipos de consultas activan un análisis completo de la tabla, lo que es mucho menos eficiente. Si eliges la clave de fila correcta, te ahorrarás un proceso de migración de datos agotador en el futuro.

Comienza por preguntarte cómo vas a utilizar los datos que deseas guardar. Por ejemplo:

  • Información del usuario: ¿Necesitas acceso rápido a la información sobre las conexiones entre los usuarios (por ejemplo, si el usuario A sigue al usuario B)?
  • Contenido generado por el usuario: Si presentas a los usuarios una muestra de una gran cantidad de contenido generado por el usuario, como actualizaciones de estado, ¿cómo decidirás qué actualizaciones de estado se mostrarán a un usuario determinado?
  • Datos de series temporales: ¿Necesitarás a menudo recuperar los registros N más recientes o los registros que se encuentran dentro de un cierto intervalo de tiempo? Si almacenas datos para varios tipos de eventos, ¿necesitarás filtrar según el tipo de evento?

Si identificas tus necesidades de forma anticipada, puedes asegurarte de que tu clave de fila y el diseño de tu esquema general proporcionen la flexibilidad suficiente para consultar tus datos de manera eficaz.

Tipos de claves de fila

En esta sección se describen algunos de los tipos de claves de fila más utilizados y se explica cuándo usar cada tipo de clave.

Como regla general, mantén tus claves de fila razonablemente cortas. Las claves de fila largas ocupan más memoria y almacenamiento, y aumentan el tiempo necesario para obtener respuestas del servidor de Cloud Bigtable.

Nombres de dominio inverso

Si almacenas datos sobre entidades que pueden representarse como nombres de dominio, considera usar un nombre de dominio inverso (por ejemplo, com.company.product) como clave de fila. El uso de un nombre de dominio inverso es ideal si los datos de cada fila tienden a superponerse con las filas adyacentes. En este caso, en Cloud Bigtable se pueden comprimir tus datos de manera más eficiente.

Este enfoque funciona mejor cuando tus datos se distribuyen a través de muchos nombres de dominio inversos diferentes. Si esperas almacenar la mayoría de tus datos en una pequeña cantidad de nombres de dominio inversos, considera otros valores para tu clave de fila. De lo contrario, podrías sobrecargar una tablet por enviar la mayoría de las escrituras a un solo nodo en tu clúster.

Identificadores de strings

Si almacenas datos sobre entidades que se pueden identificar con una string simple (por ejemplo, ID de usuario), es posible que desees utilizar el identificador de la string como la clave de fila o como una parte de la clave de fila.

En el pasado, esta página recomendaba utilizar un hash del identificador de string, en lugar del identificador de string real. Ya no recomendamos usar un hash. Hemos descubierto que las claves de fila con hash dificultan la resolución de problemas con Cloud Bigtable, ya que no tienen ningún significado. Por ejemplo, si tu clave de fila es un hash del ID de usuario, será difícil o imposible averiguar qué ID de usuario está vinculado a la clave de fila.

Usa valores legibles en lugar de un hash en la clave de fila. Además, si tu clave de fila incluye varios valores, puedes separarlos con un delimitador. Estas recomendaciones facilitan mucho el uso de la herramienta Key Visualizer para solucionar problemas con Cloud Bigtable.

Marcas de tiempo

Si necesitas frecuentemente recuperar datos en función del momento en que se registraron, es una buena idea incluir una marca de tiempo como parte de tu clave de fila. No se recomienda usar solo la marca de tiempo como clave de fila, ya que la mayoría de las escrituras se enviarán a un solo nodo. Por el mismo motivo, evita colocar una marca de tiempo al comienzo de la clave de fila.

Por ejemplo, es posible que tu aplicación necesite registrar datos relacionados con el rendimiento, como el uso de la CPU y la memoria, una vez por segundo para una gran cantidad de máquinas. Tu clave de fila, en el caso de estos datos, podría combinar un identificador de la máquina con una marca de tiempo para los datos (por ejemplo, machine_4223421#1425330757685).

Si sueles priorizar la recuperación de tus registros más recientes, puedes usar una marca de tiempo invertida en la clave de fila y quitarla del valor máximo de tu lenguaje de programación para números enteros largos (en Java, java.lang.Long.MAX_VALUE). Con una marca de tiempo invertida, los registros se ordenarán de más reciente a menos reciente.

Varios valores en una sola clave de fila

A menudo, es útil que incluyas varios identificadores en tu clave de fila, debido a que la única forma de realizar consultas eficaces en Cloud Bigtable es a través de clave de fila. Es especialmente importante comprender en profundidad cómo usarás tus datos cuando tu clave de fila incluye varios valores.

Por ejemplo, imagina que tu aplicación permite que los usuarios publiquen mensajes y que se puedan mencionar entre sí en las publicaciones, y tú deseas contar con un método eficaz para crear una lista de todos los usuarios que hayan etiquetado a un usuario específico en una publicación. Una forma de lograr este objetivo es usar una clave de fila que contenga el nombre de usuario etiquetado, seguido del nombre de usuario que hizo el etiquetado, ambos separados por un delimitador (por ejemplo, wmckinley#gwashington). A fin de descubrir quién ha etiquetado un nombre de usuario específico, o para mostrar todas las publicaciones que etiquetan ese nombre de usuario, simplemente puedes recuperar el rango de filas que tenga claves de fila que comiencen con el nombre de usuario.

Es importante crear una clave de fila que también permita recuperar un rango de filas bien definido. De lo contrario, tu consulta requerirá un análisis de la tabla, que es mucho más lento que recuperar filas específicas. Por ejemplo, imagina que almacenas datos relacionados con el rendimiento una vez por segundo. Si tu clave de fila consistiera en una marca de tiempo, seguida del identificador de la máquina (por ejemplo, 1425330757685#machine_4223421), no habría una forma eficiente de limitar tu consulta a una máquina específica y solo podrías limitar tu consulta en función de la marca de tiempo.

Prefijos de claves de fila

El primer valor de una clave de fila de varios valores se denomina prefijo de clave de fila. Los prefijos de clave de fila bien planificados te permiten aprovechar el orden de clasificación de Cloud Bigtable para almacenar datos relacionados en filas contiguas. El almacenamiento de datos relacionados en filas contiguas te permite acceder a datos relacionados como un rango de filas, en lugar de ejecutar análisis ineficientes de las tablas.

Usa prefijos de clave de fila para la modalidad multiusuario

En los prefijos de clave de fila se proporciona una solución escalable para los casos prácticos de "multiusuario", cuando almacenas datos similares, con el uso del mismo modelo de datos, en nombre de varios clientes. El uso de una tabla para todas las instancias, suele ser la forma más eficaz de almacenar y acceder a los datos multiusuario.

Por ejemplo, supongamos que almacenas y realizas un seguimiento de los historiales de compra en nombre de muchas empresas. Podrías usar tu ID único para cada empresa como un prefijo de clave de fila. Todos los datos de una instancia se almacenarán en filas contiguas en la misma tabla, y podrías realizar consultas, o filtrar, con el uso del prefijo de clave de fila. Luego, cuando una empresa ya no sea tu cliente y necesites borrar los datos del historial de compras que almacenabas para ellos, podrías borrar el rango de filas que usan el prefijo de clave de fila de ese cliente.

En cambio, si almacenas datos en nombre de cada empresa en su propia tabla, es mucho más probable que experimentes problemas de rendimiento y escalabilidad, y que puedas exceder involuntariamente el límite de Cloud Bigtable de 1,000 tablas por instancia.

Claves de fila que debes evitar

Algunos tipos de claves de fila pueden dificultar la consulta de tus datos o generar un rendimiento deficiente. En esta sección, se describen algunos tipos de claves de fila que debes evitar usar en Cloud Bigtable.

Nombres de dominio

Evita utilizar nombres de dominio estándar, no invertidos, como claves de fila. El uso de nombres de dominio estándar hace que sea ineficiente recuperar todas las filas en una parte del dominio (por ejemplo, todas las filas que se relacionan con company.com estarán en rangos de filas separadas como services.company.com, product.company.com y así sucesivamente). Además, el uso de nombres de dominio estándar hace que las filas se ordenen de tal manera que los datos relacionados no se agrupen en un solo lugar, lo que ocasiona una compresión menos eficiente.

ID numéricos secuenciales

Imagina que tu sistema asigna un ID numérico a cada uno de los usuarios de tu aplicación. Es posible que te parezca una buena idea usar el ID numérico del usuario como clave de fila en tu tabla. Sin embargo, debido a que es más probable que los usuarios nuevos sean usuarios activos, es posible que este enfoque envíe la mayor parte de tu tráfico a una pequeña cantidad de nodos.

Un enfoque más seguro es usar una versión invertida del ID numérico del usuario, que distribuye el tráfico de manera más uniforme en todos los nodos de tu tabla de Cloud Bigtable.

Identificadores que se actualizan con frecuencia

Evita utilizar una sola clave de fila para identificar un valor que debe actualizarse con mucha frecuencia. Por ejemplo, si almacenas datos de memoria de almacenamiento una vez por segundo, no uses una clave de fila única llamada memusage y no actualices la fila repetidamente. Este tipo de operación sobrecarga la tablet que almacena la fila de uso frecuente. También puede causar que una fila exceda su límite de tamaño, porque los valores anteriores de una celda ocupan espacio por un tiempo.

En su lugar, almacena un valor por fila, con el uso de una clave de fila que contenga el tipo de métrica, un delimitador y una marca de tiempo. Por ejemplo, para rastrear el uso de la memoria a lo largo del tiempo, puedes usar claves de fila similares a memusage#1423523569918. Esta estrategia es eficiente porque en Cloud Bigtable, crear una fila nueva no lleva más tiempo que crear una celda nueva. Además, esta estrategia te permite leer rápidamente los datos de un período de fechas específico, mediante el cálculo de las claves de inicio y fin adecuadas.

Para los valores que cambian con mucha frecuencia, como un contador que se actualiza cientos de veces por minuto, la mejor opción es simplemente mantener los datos en la memoria, en la capa de la aplicación, y escribir nuevas filas en Cloud Bigtable periódicamente.

Valores con hash

Como se mencionó anteriormente, la versión anterior de esta página recomendaba el uso de valores con hash en las claves de fila. Ya no recomendamos ese uso. El resultado es que las claves de fila, básicamente, no tienen significado, lo que dificulta el uso de la herramienta Key Visualizer para solucionar problemas en Cloud Bigtable.

Usa valores legibles en lugar de valores con hash. Si tu clave de fila incluye varios valores, sepáralos con un delimitador.

Familias y calificadores de columnas

En esta sección, se proporciona orientación sobre cómo abordar las familias y los calificadores de columnas de tu tabla.

Familias de columnas

En Cloud Bigtable, a diferencia de HBase, puedes usar hasta 100 familias de columnas con un excelente rendimiento. Como resultado, siempre que una fila contenga varios valores relacionados entre sí, se recomienda agrupar esos valores en la misma familia de columnas. La agrupación de datos en familias de columnas te permite recuperar datos de una sola o de varias familias, en lugar de recuperar todos los datos de cada fila. Agrupa los datos lo más cerca posible, para obtener solo la información que necesitas, pero no más, en tus llamadas a la API más frecuentes.

Además, los nombres de tus familias de columnas deben ser cortos, porque están incluidos en los datos que se transfieren para cada solicitud.

Calificadores de columnas

Debido a que las tablas de Cloud Bigtable son dispersas, puedes crear tantos calificadores de columnas como necesites en cada fila. No hay penalización de espacio para las celdas vacías en una fila. Por lo tanto, también podrías tratar a los calificadores de columnas como datos. Por ejemplo, si tu tabla almacena publicaciones de usuarios, puedes usar el identificador único para cada publicación como calificador de columna.

Sin embargo, debes evitar dividir tus datos en más calificadores de columnas de lo que sea necesario, porque esta acción puede generar filas que tengan una cantidad muy grande de celdas no vacías. Cloud Bigtable demora en procesar cada celda de una fila. Además, cada celda agrega algo de sobrecarga a la cantidad de datos que se almacenan en tu tabla y que se envían por la red. Por ejemplo, si almacenas 1 KB (1,024 bytes) de datos, sería mucho más eficiente almacenarlos en una sola celda que dividirlos en 1,024 celdas y que cada una contenga 1 byte. Si, por lo general, lees o escribes unos pocos valores relacionados al mismo tiempo, evalúa almacenar todos esos valores juntos en una celda con un formato que facilite la extracción de los valores individuales más adelante (como el formato binario del búfer de protocolo).

De manera similar, es una buena idea mantener cortos los nombres de los calificadores de columnas, lo que ayuda a reducir la cantidad de datos que se transfieren para cada solicitud.

Próximos pasos

Aprende a diseñar un esquema para datos de una serie temporal.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación de Cloud Bigtable