Diseña 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 mayor string de bytes a la menor. Las claves de filas siguen el orden de bytes big-endian (a veces llamado orden de bytes de red), que es el equivalente binario del orden alfabético. Esto significa que los números enteros no se ordenan de manera automática de forma numérica. Por ejemplo, 3 > 20. Si deseas almacenar números enteros y ordenarlos de forma numérica, rellénalos para que se ordenen de forma numérica: 20 > 03. Esto se aplica en particular a las marcas de tiempo en las que se desean realizar consultas basadas en rangos.
  • Las columnas se agrupan por familia de columnas y se clasifican en orden lexicográfico dentro de la familia de columnas.
  • 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. Por esta razón, sigue las pautas a continuación:
    • Evita los diseños de esquema que requieran atomicidad que abarque varias filas.
    • En general, mantén toda la información de una entidad en una sola fila. Sin embargo, si tu caso práctico no requiere que hagas actualizaciones atómicas o lecturas a una entidad, puedes dividir la entidad en varias filas. Si los datos de la entidad son grandes (cientos de MB), se recomienda dividir en varias filas.
  • Lo ideal es que las lecturas y escrituras se distribuyan de manera uniforme en el espacio de filas de la tabla.
  • 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 tienen casi todas las filas vacías.
  • Es mejor tener algunas tablas grandes que muchas tablas pequeñas. Cloud Bigtable obtuvo su nombre porque funciona mejor con tablas muy grandes. Es lógico que desees una tabla separada para un caso práctico completamente diferente que requiera un esquema distinto, pero no debes usar tablas separadas para datos similares. Por ejemplo, no debes crear una tabla nueva por un año nuevo o un cliente nuevo.

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 cuando diseñes el 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 la 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 para estos datos puede combinar un identificador para la máquina con una marca de tiempo para los datos (por ejemplo, machine_4223421#1425330757685).

Si por lo general recuperas primero los registros más recientes, puedes usar una marca de tiempo invertida en la clave de fila cuando le quites la marca de tiempo 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 del más reciente al 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 habilita que los usuarios publiquen mensajes y que se puedan mencionar entre sí en las publicaciones. Deseas una manera eficiente de crear una lista de todos los usuarios que etiquetaron 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 realizó el etiquetado, separados por un delimitador (por ejemplo, wmckinley#gwashington). Para averiguar quién etiquetó a un nombre de usuario específico o mostrar todas las publicaciones que lo etiquetan, puedes simplemente recuperar el rango de filas cuyas claves comienzan 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 consiste de una marca de tiempo seguida del identificador de la máquina (por ejemplo, 1425330757685#machine_4223421), no habría una manera eficiente de limitar tu búsqueda en una máquina específica; y solo podrías limitar tu consulta según 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 las instancias múltiples

Los prefijos de clave de fila proporcionan una solución escalable para los casos prácticos de “instancias múltiples”, lo que ocurre 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 es la forma más eficaz de almacenar y acceder a los datos de varias instancias.

Por ejemplo, supongamos que almacenas y realizas un seguimiento de los historiales de compra en nombre de muchas empresas. Puedes usar tu ID único para cada empresa como prefijo de clave de fila. Todos los datos de una instancia se almacenan en filas contiguas en la misma tabla, y puedes buscarlos o filtrarlos mediante el prefijo de la clave de fila. Luego, cuando una empresa ya no es tu cliente y necesitas borrar los datos del historial de compras que almacenabas para la empresa, puedes descartar el rango de filas que usan el prefijo de clave de fila del cliente.

En cambio, si almacenas datos en nombre de cada empresa en su propia tabla, puedes experimentar problemas de escalabilidad y rendimiento. También es muy probable que, sin darte cuenta, alcances el límite de 1,000 tablas por instancia de Cloud Bigtable. Después de que una instancia alcanza este límite, Cloud Bigtable evita que crees más tablas en la 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 usar 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 dentro de una parte del dominio (por ejemplo, todas las filas que se relacionan con company.com estarán en rangos de filas separados 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 usar una sola clave de fila para identificar un valor que debe actualizarse con mucha frecuencia. Por ejemplo, si almacenas los datos de uso de memoria una vez por segundo, no uses una sola clave de fila llamada memusage y actualiza la fila varias veces. 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, mediante una clave de fila que contenga el tipo de métrica, un delimitador y una marca de tiempo. Por ejemplo, para realizar un seguimiento del uso de la memoria a lo largo del tiempo, puedes usar claves de filas 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ó antes, 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 sueles leer o escribir algunos valores relacionados al mismo tiempo, considera almacenar todos esos valores juntos en una celda con un formato que te permita extraer 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.

Diseño de mesas

Mesas grandes

Cloud Bigtable tiene un límite de 1,000 tablas por instancia. En la mayoría de los casos, deberías tener muchas menos tablas. En otros sistemas de bases de datos, puedes elegir almacenar datos en varias tablas según el asunto y la cantidad de columnas. En Cloud Bigtable, sin embargo, es mejor almacenar todos tus datos en una tabla grande. Asigna un prefijo de clave de fila único para cada conjunto de datos, de modo que Cloud Bigtable almacene los datos relacionados en un rango contiguo al que puedas consultar por prefijo de clave de fila.

La creación de muchas tablas pequeñas es un antipatrón de Cloud Bigtable por algunas razones:

  • El envío de solicitudes a muchas tablas diferentes puede aumentar la sobrecarga de la conexión de backend, lo que aumenta la latencia final.

  • Tener varias tablas de diferentes tamaños puede interrumpir el balanceo de cargas tras bambalinas que hace que Cloud Bigtable funcione.

Próximos pasos