Interfaz de Cassandra

En esta página, se compara Apache Cassandra con la arquitectura de Spanner, y también te ayuda a comprender las capacidades y limitaciones de la interfaz de Cassandra de Spanner. Se da por sentado que conoces Cassandra y deseas migrar aplicaciones existentes o diseñar aplicaciones nuevas mientras usas Spanner como tu base de datos.

Cassandra y Spanner son bases de datos distribuidas a gran escala que se compilan para aplicaciones que requieren alta escalabilidad y baja latencia. Si bien ambas bases de datos pueden admitir cargas de trabajo NoSQL exigentes, Spanner proporciona funciones avanzadas para el modelado de datos, las consultas y las operaciones transaccionales. Para obtener más información sobre cómo Spanner cumple con los criterios de las bases de datos NoSQL, consulta Spanner para cargas de trabajo no relacionales.

Conceptos básicos

En esta sección, se comparan los conceptos clave de Cassandra y Spanner.

Terminología

Cassandra Spanner
Clúster Instancia

Un clúster de Cassandra equivale a una instancia de Spanner, una colección de servidores y recursos de almacenamiento. Debido a que Spanner es un servicio administrado, no tienes que configurar el hardware o software subyacente. Solo debes especificar la cantidad de nodos que deseas reservar para tu instancia o usar el ajuste de escala automático para escalarla automáticamente. Una instancia actúa como un contenedor para tus bases de datos. También eliges la topología de replicación de datos (regional, birregional o multirregional) a nivel de la instancia.
Espacio de claves Base de datos

Un espacio de claves de Cassandra equivale a una base de datos de Spanner, que es una colección de tablas y otros elementos de esquema (por ejemplo, índices y roles). A diferencia de un espacio de claves, no necesitas configurar la ubicación de replicación. Spanner replica automáticamente tus datos en la región designada en tu instancia.
Tabla Tabla

En Cassandra y Spanner, las tablas son una recopilación de filas identificadas por una clave primaria especificada en el esquema de la tabla.
Partición División

Tanto Cassandra como Spanner se escalan mediante la fragmentación de datos. En Cassandra, cada fragmento se denomina partición, mientras que en Spanner, cada fragmento se denomina división. Cassandra usa particiones hash, lo que significa que cada fila se asigna de forma independiente a un nodo de almacenamiento según un hash de la clave primaria. Spanner se particiona por rango, lo que significa que las filas que son contiguas en el espacio de claves de la clave primaria también lo son en el almacenamiento (excepto en los límites de división). Spanner se encarga de dividir y combinar en función de la carga y el almacenamiento, y esto es transparente para la aplicación. La implicación clave es que, a diferencia de Cassandra, el análisis de rangos sobre un prefijo de la clave primaria es una operación eficiente en Spanner.
Fila Fila

En Cassandra y Spanner, una fila es una colección de columnas identificadas de forma única por una clave primaria. Al igual que Cassandra, Spanner admite claves primarias compuestas. A diferencia de Cassandra, Spanner no hace una distinción entre la clave de partición y la clave de orden, ya que los datos se fragmentan por intervalo. Se puede considerar que Spanner solo tiene claves de ordenamiento, con la partición administrada en segundo plano.
Columna Columna

En Cassandra y Spanner, una columna es un conjunto de valores de datos que tienen el mismo tipo. Hay un valor para cada fila de una tabla. Para obtener más información sobre cómo comparar los tipos de columnas de Cassandra con Spanner, consulta Tipos de datos.

Arquitectura

Un clúster de Cassandra consta de un conjunto de servidores y almacenamiento ubicados junto con esos servidores. Una función hash asigna filas de un espacio de claves de partición a un nodo virtual (vnode). Luego, se asigna de forma aleatoria un conjunto de vnodes a cada servidor para entregar una parte del espacio de claves del clúster. El almacenamiento de los vnodes se adjunta de forma local al nodo de entrega. Los controladores de cliente se conectan directamente a los nodos de entrega y controlan el balanceo de cargas y el enrutamiento de consultas.

Una instancia de Spanner consta de un conjunto de servidores en una topología de replicación. Spanner fragmenta cada tabla de forma dinámica en rangos de filas según el uso de CPU y disco. Los fragmentos se asignan a los nodos de procesamiento para la publicación. Los datos se almacenan físicamente en Colossus, el sistema de archivos distribuidos de Google, por separado de los nodos de procesamiento. Los controladores de cliente se conectan a los servidores de frontend de Spanner, que realizan el enrutamiento de solicitudes y el balanceo de cargas. Para obtener más información, consulta el informe técnico Ciclo de vida de las operaciones de lectura y escritura de Spanner.

En un nivel alto, ambas arquitecturas se escalan a medida que se agregan recursos al clúster subyacente. La separación de procesamiento y almacenamiento de Spanner permite que la carga entre los nodos de procesamiento se reequilibre más rápido en respuesta a los cambios en la carga de trabajo. A diferencia de Cassandra, los traslados de fragmentos no implican traslados de datos, ya que estos permanecen en Colossus. Además, la partición basada en rangos de Spanner podría ser más natural para las aplicaciones que esperan que los datos se ordenen por clave de partición. El inconveniente de la partición basada en rangos es que las cargas de trabajo que escriben en un extremo del espacio de claves (por ejemplo, tablas con claves según la marca de tiempo actual) pueden tener hotspots si no se consideran diseños de esquemas adicionales. Para obtener más información sobre las técnicas para superar los hotspots, consulta Prácticas recomendadas para el diseño de esquemas.

Coherencia

Con Cassandra, debes especificar un nivel de coherencia para cada operación. Si usas el nivel de coherencia de quórum, la mayoría de los nodos de réplica deben responder al nodo coordinador para que la operación se considere correcta. Si usas un nivel de coherencia de uno, Cassandra necesita un nodo de réplica único para responder para que la operación se considere correcta.

Spanner proporciona coherencia sólida. La API de Spanner no expone réplicas al cliente. Los clientes de Spanner interactúan con Spanner como si fuera una base de datos de una sola máquina. Una operación de escritura siempre se escribe en la mayoría de las réplicas antes de que Spanner informe su éxito al usuario. Cualquier lectura posterior refleja los datos recién escritos. Las aplicaciones pueden optar por leer una instantánea de la base de datos en un momento anterior, lo que podría tener beneficios de rendimiento en comparación con las lecturas sólidas. Para obtener más información sobre las propiedades de coherencia de Spanner, consulta la descripción general de las transacciones.

Spanner se creó para admitir la coherencia y la disponibilidad necesarias en aplicaciones a gran escala. Spanner proporciona una coherencia sólida a gran escala y con alto rendimiento. Para los casos de uso que lo requieran, Spanner admite lecturas de instantáneas (inactivas) que relajan los requisitos de actualización.

Interfaz de Cassandra

La interfaz de Cassandra te permite aprovechar la infraestructura de Spanner, que es totalmente administrada, escalable y altamente disponible, con herramientas y sintaxis de Cassandra conocidas. En esta página, se te ayuda a comprender las capacidades y limitaciones de la interfaz de Cassandra.

Beneficios de la interfaz de Cassandra

  • Portabilidad: La interfaz de Cassandra proporciona acceso a la amplia variedad de funciones de Spanner mediante esquemas, consultas y clientes compatibles con Cassandra. Esto simplifica el traslado de una aplicación compilada en Spanner a otro entorno de Cassandra o viceversa. Esta portabilidad proporciona flexibilidad de implementación y admite situaciones de recuperación ante desastres, como una salida estresada.
  • Familiaridad: Si ya usas Cassandra, puedes comenzar a usar Spanner rápidamente con muchos de los mismos tipos y sentencias de CQL.
  • Sin concesiones con Spanner: Como se compila en la base existente de Spanner, la interfaz de Cassandra proporciona todos los beneficios de disponibilidad, coherencia y relación precio-rendimiento existentes de Spanner sin tener que comprometer ninguna de las funciones disponibles en el ecosistema complementario de GoogleSQL.

Compatibilidad con CQL

  • Compatibilidad con el dialecto CQL: Spanner proporciona un subconjunto del dialecto CQL, incluido el lenguaje de consulta de datos (DQL), el lenguaje de manipulación de datos (DML), las transacciones ligeras (LWT), las funciones de agregación y de fecha y hora.

  • Funcionalidad de Cassandra admitida: La interfaz de Cassandra admite muchas de las funciones más usadas de Cassandra. Esto incluye las partes principales del esquema y el sistema de tipos, muchas formas de consulta comunes, una variedad de funciones y operadores, y los aspectos clave del catálogo del sistema de Cassandra. Las aplicaciones pueden usar muchos clientes o controladores de Cassandra conectándose a través de la implementación de Spanner del protocolo de red de Cassandra.

  • Compatibilidad con el cliente y el protocolo de red: Spanner admite las funciones de consulta principales del protocolo de red de Cassandra v4 con el adaptador de Cassandra, un cliente ligero que se ejecuta junto con tu aplicación. Esto permite que muchos clientes de Cassandra funcionen tal como están con una base de datos de interfaz de Cassandra de Spanner, a la vez que aprovechan la administración de extremos y conexiones globales, y la autenticación de IAM de Spanner.

Tipos de datos admitidos de Cassandra

En la siguiente tabla, se muestran los tipos de datos de Cassandra admitidos y se asigna cada tipo de datos al tipo de datos de GoogleSQL de Spanner equivalente.

Tipos de datos de Cassandra admitidos Tipo de datos de GoogleSQL de Spanner
Tipos numéricos tinyint (número entero de 8 bits con firma) INT64 (número entero de 64 bits con firma)

Spanner admite un solo tipo de datos de 64 bits para números enteros firmados.

smallint (número entero de 16 bits con firma)
int (número entero de 32 bits con firma)
bigint (número entero de 64 bits con firma)
float (número de punto flotante IEEE-754 de 32 bits) FLOAT32 (número de punto flotante IEEE-754 de 32 bits)
double (número de punto flotante IEEE-754 de 64 bits) FLOAT64 (número de punto flotante IEEE-754 de 64 bits)
decimal Para números decimales de precisión fija, usa el tipo de datos NUMERIC (precisión 38, escala 9).
varint (entero de precisión variable)
Tipos de cadenas text STRING(MAX)

Tanto text como varchar almacenan y validan cadenas UTF-8. En Spanner, las columnas STRING deben especificar su longitud máxima. No hay ningún impacto en el almacenamiento, ya que esto se hace con fines de validación.

varchar
ascii STRING(MAX)
uuid STRING(MAX)
inet STRING(MAX)
blob BYTES(MAX)

Para almacenar datos binarios, usa el tipo de datos BYTES.

Tipos de fecha y hora date DATE
time INT64

Spanner no admite un tipo de datos de hora dedicado. Usa INT64 para almacenar la duración en nanosegundos.

timestamp TIMESTAMP
Tipos de contenedores set ARRAY

Spanner no admite un tipo de datos set dedicado. Usa columnas ARRAY para representar un set.

list ARRAY

Usa ARRAY para almacenar una lista de objetos escritos.

map JSON

Spanner no admite un tipo de mapa dedicado. Usa columnas JSON para representar mapas.

Otros tipos boolean BOOL
counter INT64

Anotaciones de tipos de datos

La opción de columna cassandra_type te permite definir asignaciones entre los tipos de datos de Cassandra y Spanner. Cuando creas una tabla en Spanner con la que deseas interactuar mediante consultas compatibles con Cassandra, puedes usar la opción cassandra_type para especificar el tipo de datos de Cassandra correspondiente para cada columna. Luego, Spanner usa esta asignación para interpretar y convertir correctamente los datos cuando los transfiere entre los dos sistemas de bases de datos.

Por ejemplo, si hay una tabla en Cassandra con el siguiente esquema:

CREATE TABLE Albums (
  albumId uuid,
  title varchar,
  artists set<varchar>,
  tags  map<varchar, varchar>,
  numberOfSongs tinyint,
  releaseDate date,
  copiesSold bigint,
  ....
  PRIMARY KEY(albumId)
)

En Spanner, usas anotaciones de tipo para asignar a los tipos de datos de Cassandra, como se muestra a continuación:

CREATE TABLE Albums (
  albumId       STRING(MAX) OPTIONS (cassandra_type = 'uuid'),
  title         STRING(MAX) OPTIONS (cassandra_type = 'varchar'),
  artists       ARRAY<STRING(max)> OPTIONS (cassandra_type = 'set<varchar>'),
  tags          JSON OPTIONS (cassandra_type = 'map<varchar, varchar>'),
  numberOfSongs INT64 OPTIONS (cassandra_type = 'tinyint'),
  releaseDate   DATE OPTIONS (cassandra_type = 'date'),
  copiesSold    INT64 OPTIONS (cassandra_type = 'bigint')
  ...
) PRIMARY KEY (albumId);

En el ejemplo anterior, la cláusula OPTIONS asigna el tipo de datos de Spanner de la columna a su tipo de datos de Cassandra correspondiente.

  • albumId (STRING(MAX) de Spanner) se asigna a uuid en Cassandra.
  • title (STRING(MAX) de Spanner) se asigna a varchar en Cassandra.
  • artists (ARRAY<STRING(MAX)> de Spanner) se asigna a set<varchar> en Cassandra.
  • tags (JSON de Spanner) se asigna a map<varchar,varchar> en Cassandra.
  • numberOfSongs (INT64 de Spanner) se asigna a tinyint en Cassandra.
  • releaseDate (DATE de Spanner) se asigna a date en Cassandra.
  • copiesSold (INT64 de Spanner) se asigna a bigint en Cassandra.
Asignaciones directas y matizadas

En muchos casos, la asignación entre los tipos de datos de Spanner y Cassandra es directa. Por ejemplo, un STRING(MAX) de Spanner se asigna a un varchar de Cassandra, y un INT64 de Spanner se asigna a un bigint de Cassandra.

Sin embargo, hay situaciones en las que la asignación requiere más consideración y ajuste. Por ejemplo, es posible que debas asignar un smallint de Cassandra a un INT64 de Spanner.

Funciones de Cassandra compatibles

En esta sección, se enumeran las funciones de Cassandra compatibles con Spanner.

En la siguiente lista, se muestra la compatibilidad de Spanner con las funciones de Cassandra.

Funciones de Cassandra no compatibles en Spanner

Es importante comprender que la interfaz de Cassandra proporciona las capacidades de Spanner a través de esquemas, tipos, consultas y clientes que son compatibles con Cassandra. No es compatible con todas las funciones de Cassandra. Es probable que migrar una aplicación de Cassandra existente a Spanner, incluso con la interfaz de Cassandra, requiera algunos cambios para adaptarse a las funciones de Cassandra no admitidas o a las diferencias de comportamiento, como la optimización de consultas o el diseño de clave primaria. Sin embargo, una vez que se realice la migración, tus cargas de trabajo podrán aprovechar la confiabilidad de Spanner y sus capacidades únicas de varios modelos.

En la siguiente lista, se proporciona más información sobre las funciones de Cassandra que no se admiten:

  • Algunas funciones del lenguaje CQL no son compatibles: tipos y funciones definidos por el usuario, TimeUUID, TTL y marca de tiempo de escritura.
  • Spanner y el plano de control de Spanner: Las bases de datos con interfaces de Cassandra usan Spanner y herramientas de Google Cloudpara aprovisionar, proteger, supervisar y optimizar instancias. Spanner no admite herramientas, como nodetool para actividades administrativas.

Compatibilidad con DDL

Las sentencias DDL de CQL no se admiten directamente con la interfaz de Cassandra. Para los cambios de DDL, debes usar la consola de Google Cloud Spanner, el comando gcloud o las bibliotecas cliente.

Conectividad

  • Asistencia para clientes de Cassandra

    Spanner te permite conectarte a bases de datos desde una variedad de clientes:

Control de acceso con Identity and Access Management

Debes tener los permisos spanner.databases.adapt, spanner.databases.select y spanner.databases.write para realizar operaciones de lectura y escritura en el extremo de Cassandra. Para obtener más información, consulta la descripción general de IAM.

Para obtener más información sobre cómo otorgar permisos de IAM de Spanner, consulta Cómo aplicar roles de IAM.

Supervisión

Spanner proporciona las siguientes métricas para ayudarte a supervisar el adaptador de Cassandra:

  • spanner.googleapis.com/api/adapter_request_count: Captura y expone la cantidad de solicitudes de adaptador que realiza Spanner por segundo o la cantidad de errores que se producen en el servidor de Spanner por segundo.
  • spanner.googleapis.com/api/adapter_request_latencies: Captura y expone la cantidad de tiempo que Spanner tarda en controlar las solicitudes del adaptador.

Puedes crear un panel personalizado de Cloud Monitoring para mostrar y supervisar las métricas del adaptador de Cassandra. El panel personalizado contiene los siguientes gráficos:

  • Latencias de las solicitudes P99: La distribución del percentil 99 de las latencias de las solicitudes del servidor por message_type para tu base de datos.

  • Latencias de las solicitudes (P50): La distribución del percentil 50 de las latencias de las solicitudes del servidor por message_type para tu base de datos.

  • Cantidad de solicitudes a la API por tipo de mensaje: Es el recuento de solicitudes a la API por message_type de tu base de datos.

  • Cantidad de solicitudes a la API por tipo de operación: Es el recuento de solicitudes a la API por op_type de tu base de datos.

  • Tasas de errores: Son las tasas de errores de la API de tu base de datos.

Google Cloud console

  1. Descarga el archivo cassandra-adapter-dashboard.json. Este archivo tiene la información necesaria para propagar un panel personalizado en Monitoring.
  2. En la Google Cloud consola, ve a la página  Paneles:

    Dirígete a Paneles de control

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Monitoring.

  3. En la página Descripción general de los paneles, haz clic en Crear un panel personalizado.
  4. En la barra de herramientas del panel, haz clic en el ícono Configuración del panel. Luego, selecciona JSON y, luego, Editor de JSON.
  5. En el panel Editor de JSON, copia el contenido del archivo cassandra-adapter-dashboard.json que descargaste y pégalo en el editor.
  6. Para aplicar los cambios en el panel, haz clic en Aplicar cambios. Si no quieres usar este panel, vuelve a la página Resumen de paneles.
  7. Después de crear el panel, haz clic en Agregar filtro. Luego, selecciona project_id o instance_id para supervisar el adaptador de Cassandra.

gcloud CLI

  1. Descarga el archivo cassandra-adapter-dashboard.json. Este archivo tiene la información necesaria para propagar un panel personalizado en Monitoring.
  2. Para crear un panel en un proyecto, usa el comando gcloud monitoring dashboards create:

    gcloud monitoring dashboards create --config-from-file=cassandra-adapter-dashboard.json
    

    Para obtener más información, consulta la referencia de gcloud monitoring dashboards create.

Además, las siguientes métricas de Spanner son útiles para supervisar el adaptador:

  • CPU utilization metrics proporciona información sobre el uso de la CPU para las tareas del usuario y del sistema con desgloses por prioridad y tipo de operación.
  • Storage utilization metrics proporciona información sobre el almacenamiento de bases de datos y copias de seguridad.
  • Spanner built-in statistics tables proporcionan estadísticas sobre las consultas, las transacciones y las operaciones de lectura para ayudarte a descubrir problemas en tus bases de datos.

Para obtener una lista completa de las estadísticas del sistema, consulta Cómo supervisar instancias con estadísticas del sistema. Para obtener más información sobre la supervisión de tus recursos de Spanner, consulta Supervisa instancias con Cloud Monitoring.

Precios

No se aplican cargos adicionales por usar el extremo de Cassandra. Se te cobran los precios estándar de Spanner por la cantidad de capacidad de procesamiento que usa tu instancia y la cantidad de almacenamiento que usa tu base de datos.

Para obtener más información, consulta Precios de Spanner.

¿Qué sigue?