Implementa una arquitectura multiusuario en Spanner

En esta página, se describen varias formas de implementar múltiples usuarios en Spanner. También se analizan los patrones de administración de datos y la administración del ciclo de vida de los usuarios. Está dirigido a los arquitectos de bases de datos, los arquitectos de datos y los ingenieros que implementan aplicaciones multiusuario en Spanner como su base de datos relacional. Con ese contexto, se describen varios enfoques para almacenar datos multiusuario. Los términos “usuario”, “cliente” y “organización” se usan de manera intercambiable en todo el artículo para indicar la entidad que accede a la aplicación multiusuario. Los ejemplos que se proporcionan en esta página se basan en la implementación de una aplicación multiusuario de un proveedor de SaaS de recursos humanos (RR.HH.) en Google Cloud. Un requisito es que varios clientes del proveedor de SaaS de RR.HH. deben acceder a la aplicación multiusuario. Estos clientes se denominan usuarios.

Multiusuario

La configuración multiusuario se aplica cuando una sola instancia, o algunas instancias, de una aplicación de software se entrega a varios usuarios o clientes. Este patrón de software puede escalar de un solo usuario o cliente a cientos o miles. Este enfoque es fundamental para las plataformas de computación en la nube en las que la infraestructura subyacente se comparte entre varias organizaciones.

Piensa en el uso de la arquitectura multiusuario como una forma de partición basada en recursos de procesamiento compartidos, como las bases de datos. Una analogía son los inquilinos en un edificio de apartamentos: los inquilinos comparten la infraestructura, como las tuberías de agua y las líneas eléctricas, pero cada inquilino tiene un espacio dedicado en un apartamento. La arquitectura multiusuario es parte de la mayoría de las aplicaciones de software como servicio (SaaS), si no de todas.

Spanner es la base de datos uniforme, distribuida y completamente administrada de Google Cloudque combina los beneficios del modelo de base de datos relacional con escalabilidad horizontal no relacional. Spanner tiene semántica relacional con esquemas, tipos de datos aplicados, coherencia sólida, transacciones ACID de varias instrucciones y un lenguaje de consulta en SQL que implementa SQL ANSI 2011. Proporciona un tiempo de inactividad cero para el mantenimiento planificado o los fallos regionales, con un ANS de disponibilidad del 99.999%. Spanner también admite aplicaciones modernas multiusuario, ya que proporciona alta disponibilidad y escalabilidad.

Criterios para la asignación de datos de usuarios

En una aplicación multiusuario, los datos de cada instancia se aíslan en uno de varios enfoques de arquitectura en la base de datos subyacente de Spanner. En la siguiente lista, se describen los diferentes enfoques de arquitectura que se usan para asignar los datos de un usuario a Spanner:

  • Instancia: Un usuario reside de forma exclusiva en una instancia de Spanner, con exactamente una base de datos para ese usuario.
  • Base de datos: Un usuario reside en una base de datos en una sola instancia de Spanner que contiene varias bases de datos.
  • Tabla: Un usuario reside en tablas exclusivas dentro de una base de datos y se pueden encontrar varios usuarios en la misma base de datos.
  • Fila: Los datos de usuarios son filas en tablas de bases de datos. Esas tablas se comparten con otros usuarios.

Los criterios anteriores se denominan patrones de administración de datos y se analizan en detalle en la sección Patrones de administración de datos multiusuario. Ese análisis se basa en los siguientes criterios:

  • Aislamiento de datos: El grado de aislamiento de datos entre varios usuarios es una consideración importante para los usuarios múltiples. Por ejemplo, si los datos deben separarse de forma física o lógica, y si hay LCA (listas de control de acceso) independientes que se pueden establecer para los datos de cada arrendatario. El aislamiento se debe a las decisiones que se tomaron para los criterios de otras categorías. Por ejemplo, ciertos requisitos normativos y de cumplimiento pueden dictar un mayor grado de aislamiento.
  • Agilidad: La facilidad de incorporación y desvinculación de las actividades de un usuario respecto de la creación de una instancia, una base de datos, una tabla o una fila.
  • Operaciones: La disponibilidad o complejidad de la implementación de operaciones típicas, específicas del inquilino y actividades de administración de bases de datos. Por ejemplo, mantenimiento regular, registros, copias de seguridad u operaciones de recuperación ante desastres.
  • Escalamiento: La capacidad de escalar sin problemas para permitir el crecimiento futuro. La descripción de cada patrón contiene la cantidad de usuarios que admite el patrón.
  • Rendimiento:
    • Aislamiento de recursos: La capacidad de asignar recursos exclusivos a cada usuario, abordar el fenómeno de vecino real y habilitar el rendimiento de lectura y escritura predecible para cada usuario.
    • Recursos mínimos por arrendatario: Es la cantidad mínima promedio de recursos por arrendatario. Esto no significa necesariamente que debas pagar al menos esta cantidad por cada inquilino individual, sino que debes pagar al menos N * esta cantidad por todos los N inquilinos juntos.
    • Eficiencia de recursos: Es la capacidad de usar los recursos inactivos de otros inquilinos para ahorrar costos generales.
    • Selección de ubicación para la optimización de la latencia: Capacidad de elegir una topología de replicación específica para cada arrendatario, de modo que los datos de cada arrendatario se puedan colocar en la ubicación que proporcione la mejor latencia para el arrendatario.
  • Reglamentaciones y cumplimiento: Capacidad para abordar los requisitos de industrias y países altamente regulados que exigen el aislamiento completo de los recursos y las operaciones de mantenimiento. Por ejemplo, los requisitos de residencia de datos de Francia exigen que la información de identificación personal se almacene físicamente solo dentro de Francia. Las industrias financieras suelen requerir claves de encriptación administradas por el cliente (CMEK), y es posible que cada arrendatario quiera usar su propia clave de encriptación.

Cada patrón de administración de datos relacionado con estos criterios se detalla en la siguiente sección. Usa los mismos criterios cuando selecciones un patrón de administración de datos para un conjunto específico de usuarios.

Patrones de administración de datos multiusuario

En las siguientes secciones, se describen los cuatro patrones principales de administración de datos: instancias, bases de datos, tablas y filas.

Instancia

Para proporcionar un aislamiento completo, el patrón de administración de datos de la instancia almacena los datos de cada usuario en su propia instancia y base de datos de Spanner. Una instancia de Spanner puede tener una o más bases de datos. En este patrón, solo se crea una base de datos. En la aplicación de RR.HH. que se explicó antes, se crea una instancia de Spanner independiente con una base de datos para cada organización del cliente.

Como se ve en el siguiente diagrama, el patrón de administración de datos tiene un usuario por instancia.

El patrón de administración de datos de instancia almacena un solo usuario por instancia.

Tener instancias separadas para cada usuario permite el uso de proyectos deGoogle Cloud separados para lograr límites de confianza separados para diferentes usuarios. Un beneficio adicional es que se puede elegir cada configuración de instancia según la ubicación de cada usuario (ya sea regional o multirregional), lo que optimiza la flexibilidad y el rendimiento de la ubicación.

La arquitectura puede escalar a cualquier cantidad de usuarios. Los proveedores de SaaS pueden crear cualquier cantidad de instancias en las regiones deseadas, sin límites estrictos.

En la siguiente tabla, se describe cómo el patrón de administración de datos de instancia afecta a los diferentes criterios.

Criterios Instancia: un usuario por patrón de administración de datos de instancia
Aislamiento de datos
  • El nivel más alto de aislamiento de datos
  • El almacenamiento de datos está físicamente separado
  • Los ACL se otorgan por separado para cada instancia.
Agilidad
  • La incorporación y desvinculación requieren una configuración o baja de servicio considerable para lo siguiente:
    • La instancia de Spanner
    • Seguridad específica de la instancia
    • Conectividad específica de la instancia
  • La incorporación y la desvinculación se pueden automatizar mediante Infrastructure como Código (IaC)
Operaciones
  • Copias de seguridad independientes para cada usuario
  • Programas de copia de seguridad independientes y flexibles
  • Mayor sobrecarga operativa
    • Gran cantidad de instancias para administrar y mantener (escalamiento, supervisión, registro y ajuste de rendimiento)
Escala
  • Base de datos altamente escalable
  • Crecemiento ilimitado mediante la agregación de nodos
  • Cantidad ilimitada de usuarios
  • Instancia de Spanner disponible para cada usuario
Rendimiento
  • Aislamiento de recursos: No hay contención de recursos
  • Recursos mínimos por arrendatario: La cantidad mínima de recursos por arrendatario es de 1 nodo si se usa una instancia más grande y de 100 PU (1/10 de nodos) si se usa una instancia granular.
  • Eficiencia de recursos: No se pueden usar los recursos inactivos de otros inquilinos.
  • Selección de la ubicación para la optimización de la latencia: Coloca a cada usuario en una instancia separada y personaliza la topología de replicación para cada usuario.
Requisitos reglamentarios y de cumplimiento
  • Almacenar datos en una región específica
  • Implementar procesos específicos de seguridad, copias de seguridad o auditoría según lo requieran las empresas o Gobiernos

En resumen, los puntos clave son los siguientes:

  • Ventaja: El nivel más alto de aislamiento
  • Desventaja: Mayor sobrecarga operativa y, posiblemente, mayor costo debido al mínimo de 100 PU por usuario. No se admite el uso compartido de recursos entre diferentes organizaciones.

El patrón de administración de datos de instancia es más adecuado para las siguientes situaciones:

  • Usuarios diferentes que se distribuyen en una amplia variedad de regiones y necesitan una solución localizada.
  • Los requisitos regulatorios y de cumplimiento para algunos usuarios exigen niveles más altos de protocolos de seguridad y auditoría.
  • El tamaño de los usuarios varía significativamente, de modo que compartir recursos entre usuarios de alto volumen y de tráfico alto puede causar contención y degradación mutua.

Base de datos

En el patrón de administración de datos de la base de datos, cada usuario reside en una base de datos dentro de una única instancia de Spanner. Puede haber varias bases de datos en una sola instancia. Si una instancia no es suficiente para la cantidad de usuarios, crea varias instancias. Este patrón implica que una sola instancia de Spanner se comparte entre varios usuarios.

Spanner tiene un límite estricto de 100 bases de datos por instancia. Este límite significa que, si el proveedor de SaaS necesita escalar más allá de 100 clientes, debe crear y usar varias instancias de Spanner.

En la aplicación de RR.HH., el proveedor de SaaS crea y administra cada usuario con una base de datos separada en una instancia de Spanner.

Como se ve en el siguiente diagrama, el patrón de administración de datos tiene un usuario por base de datos.

El patrón de administración de datos de base de datos aloja un usuario por base de datos.

El patrón de administración de datos de base de datos logra un aislamiento lógico en el nivel de la base de datos para los datos de diferentes usuarios. Sin embargo, debido a que es una sola instancia de Spanner, todas las bases de datos de usuarios comparten la misma topología de replicación y la configuración de procesamiento y almacenamiento subyacente, a menos que se use la función de particionamiento geográfico. Puedes usar la función de partición geográfica de Spanner para crear particiones de instancias en diferentes ubicaciones y usar diferentes particiones de instancias para diferentes bases de datos en la misma instancia.

En la siguiente tabla, se describe cómo el patrón de administración de datos de base de datos afecta a los diferentes criterios.

Criterios Base de datos: un usuario por patrón de administración de datos de base de datos
Aislamiento de datos
  • Aislamiento lógico completo en el nivel de base de datos
  • El almacenamiento de datos está físicamente separado
  • Puedes otorgar ACL a todas las bases de datos de la instancia o puedes otorgarlas por separado a cada base de datos.
Agilidad
  • Requiere esfuerzo para crear o borrar la base de datos y cualquier control de seguridad específico
  • La automatización de la incorporación y desvinculación de sistemas se realiza a través de la infraestructura como código (IaC)
Operaciones
  • Copias de seguridad independientes para cada usuario
  • Programas de copia de seguridad independientes y flexibles
  • Menos sobrecarga operativa en comparación con el patrón de la instancia
    • Una instancia para supervisar hasta 100 bases de datos
Escala
  • Base de datos altamente escalable
  • Límite de 100 bases de datos por instancia. Para cada 100 usuarios, crea una nueva instancia de Spanner.
  • Instancias ilimitadas
  • Cantidad ilimitada de nodos por instancia
Rendimiento
  • Aislamiento de recursos: Contención entre varias bases de datos
    • Bases de datos distribuidas en nodos de instancias de Spanner
    • Bases de datos que comparten la infraestructura
    • Los vecinos heridos afectan el rendimiento
  • Recursos mínimos por arrendatario: Debido a que hay un límite de 100 bases de datos por instancia, la capacidad de procesamiento mínima para 100 bases de datos (o 100 arrendatarios) es de 1 nodo. Incluso para una instancia granular, la capacidad de procesamiento mínima por cada 100 arrendatarios sigue siendo de 1 nodo. Si bien cada instancia granular puede usar tan solo 100 unidades de procesamiento, Spanner solo permite un límite de 10 bases de datos por cada 100 unidades de procesamiento.
  • Eficiencia de recursos: Los arrendatarios comparten los recursos de una instancia. Los arrendatarios pueden usar los recursos inactivos de otros arrendatarios.
  • Selección de ubicación para la optimización de la latencia: Si no usas la función de partición geográfica, la ubicación de la base de datos es la misma que la configuración de la instancia. No puedes personalizar la ubicación de la base de datos para cada arrendatario. Sin embargo, si usas la función de partición geográfica, puedes crear particiones de instancias en diferentes ubicaciones y colocar datos en diferentes ubicaciones con una clave de colocación de filas. El uso de la partición geográfica optimiza la latencia para cada instancia.
Requisitos reglamentarios y de cumplimiento
  • Si no usas la función de partición geográfica, la ubicación de las bases de datos es la misma que la configuración de la instancia para cumplir con los requisitos reglamentarios de residencia de datos. Sin embargo, si usas la función de partición geográfica, puedes crear particiones de instancias en diferentes ubicaciones y colocar datos en diferentes ubicaciones con una clave de colocación por fila.
  • Cada base de datos puede usar su propia CMEK para la encriptación de datos.

En resumen, los puntos clave son los siguientes:

  • Ventaja: Nivel moderado de aislamiento de datos y de recursos; nivel moderado de eficiencia de recursos; cada arrendatario puede tener su propia copia de seguridad y su propia CMEK.
  • Desventaja: La cantidad de usuarios por instancia es limitada; inflexibilidad de la ubicación si no se usa la función de partición geográfica.

El patrón de administración de datos de base de datos es más adecuado para las siguientes situaciones:

  • Varios clientes se encuentran en la misma residencia de datos o están bajo la misma autoridad reguladora.
  • Los usuarios requieren separación de datos basada en el sistema y la capacidad de crear copias de seguridad y restablecer sus datos, pero funcionan bien con el uso compartido de recursos de infraestructura.
  • Los arrendatarios requieren su propia CMEK.
  • El costo es una consideración importante. Los recursos mínimos necesarios por inquilino son inferiores al costo de una instancia. Es conveniente que los inquilinos usen los recursos inactivos de otros inquilinos.

Tabla

En el patrón de administración de datos de tabla, se usa una sola base de datos, que implementa un solo esquema, para varios usuarios y un conjunto de tablas separado para los datos de cada usuario. Estas tablas se pueden diferenciar incluyendo tenant ID en los nombres de las tablas como un prefijo, un sufijo o como esquemas con nombre.

Este patrón de administración de datos con el uso de un conjunto separado de tablas para cada usuario proporciona un nivel de aislamiento mucho menor en comparación con las opciones anteriores (los patrones de administración de instancia y base de datos). La incorporación implica crear tablas nuevas, y la integridad referencial y los índices asociados.

Existe un límite de 5,000 tablas por base de datos. Para algunos clientes, ese límite podría restringir el uso de la aplicación.

Además, el uso de tablas separadas para cada cliente puede generar una gran acumulación de operaciones de actualización del esquema. Estas tareas pendientes tardan mucho tiempo en resolverse.

En la aplicación de RR.HH., el proveedor de SaaS puede crear un conjunto de tablas para cada cliente con tenant ID como prefijo en los nombres de las tablas. Por ejemplo, customer1_employee, customer1_payroll y customer1_department. Como alternativa, pueden usar el ID de inquilino como un esquema con nombre y nombrar su tabla como customer1.employee, customer1.payroll y customer1.department.

Como se muestra en el siguiente diagrama, el patrón de administración de datos de tabla tiene un conjunto de tablas para cada usuario.

El patrón de administración de datos de tabla tiene un conjunto de tablas para cada usuario.

En la siguiente tabla, se describe cómo el patrón de administración de datos de tabla afecta a los diferentes criterios.

Criterios Tabla: Un conjunto de tablas para cada patrón de administración de datos de usuarios
Aislamiento de datos
  • Nivel moderado de aislamiento de datos. Los datos están separados de forma lógica, pero se pueden almacenar físicamente en el mismo archivo en el almacenamiento persistente.
  • Las LCA se comparten de forma predeterminada, pero se pueden otorgar por separado con el control de acceso detallado (FGAC).
Agilidad
  • Requiere esfuerzo para crear o borrar las tablas nuevas, los índices asociados y cualquier control de seguridad creado a través de FGAC
  • Desconectar a un cliente significa borrar tablas
    • Puede tener un impacto temporal y negativo en el rendimiento en otros usuarios de la base de datos
Operaciones
  • No hay operaciones separadas para los usuarios
  • La copia de seguridad, la supervisión y el registro deben implementarse como funciones de la aplicación separadas o como secuencias de comandos de utilidad
Escala
  • Una base de datos única puede tener solo 5,000 tablas.
    • Solo la cantidad 5,000/<número de tablas para usuario> de usuarios en cada base de datos
    • Cuando la base de datos exceda las 5,000 tablas, agrega una base de datos nueva para los usuarios adicionales.
Rendimiento
  • Aislamiento de recursos: Recursos compartidos de infraestructura subyacente Es posible tener un alto nivel de contención de recursos.
    • Los vecinos ruidosos afectan el rendimiento.
  • Recursos mínimos por usuario: Debido a que hay un límite de 100 bases de datos por instancia y 5,000 tablas por base de datos, la capacidad de procesamiento mínima requerida por cada 500,000 usuarios es de un nodo.
  • Eficiencia de recursos: Los arrendatarios comparten los recursos de una instancia. Cada arrendatario puede usar el recurso inactivo de otros arrendatarios.
  • Selección de ubicación para la optimización de la latencia: Si no usas la función de partición geográfica, la ubicación de la base de datos es la misma que la configuración de la instancia. No puedes personalizar la ubicación de la base de datos para cada arrendatario. Sin embargo, si usas la función de partición geográfica, puedes crear particiones de instancias en diferentes ubicaciones y colocar datos en diferentes ubicaciones con una clave de colocación de filas. El uso de la partición geográfica optimiza la latencia para cada instancia.
Requisitos reglamentarios y de cumplimiento
  • Si no usas la función de partición geográfica, la ubicación de las bases de datos es la misma que la configuración de la instancia para cumplir con los requisitos reglamentarios de residencia de datos. Sin embargo, si usas la función de partición geográfica, puedes crear particiones de instancias en diferentes ubicaciones y colocar datos en diferentes ubicaciones con una clave de colocación por fila.
  • Las diferentes tablas de la misma base de datos deben usar la misma CMEK para la encriptación de datos en cada región.

En resumen, los puntos clave son los siguientes:

  • Ventajas: Nivel moderado de escalabilidad y eficiencia de recursos.
  • Desventaja:
    • Nivel moderado de aislamiento de datos y aislamiento de recursos
    • La ubicación es inflexible si no se usa la nueva función de partición geográfica.
    • No se pueden supervisar los usuarios por separado. La única información disponible sobre el consumo de recursos a nivel de la tabla son las estadísticas de tamaño de la tabla.
    • Los arrendatarios no pueden tener sus propias CMEK ni copias de seguridad.

El patrón de administración de datos de tabla es más adecuado para las siguientes situaciones:

  • Aplicaciones multiusuario que no requieren legalmente la separación de datos, pero en las que deseas tener separación lógica y control de seguridad.
  • El costo es una consideración importante. El costo mínimo por arrendatario es más económico que el costo por base de datos.

Fila

El patrón final de administración de datos entrega usuarios múltiples con un conjunto común de tablas, y cada fila pertenece a un usuario específico. Este patrón de administración de datos representa un nivel extremo de patrón multiusuario en el que todo, desde la infraestructura hasta el esquema y el modelo de datos, se comparte entre varios usuarios. Dentro de una tabla, las filas se particionan en función de las claves primarias, con tenant ID como el primer elemento de la clave. Desde la perspectiva del escalamiento, Spanner admite mejor este patrón porque puede escalar tablas sin límites.

En la aplicación de RR. HH., la clave primaria de la tabla de nóminas puede ser una combinación de customerID y payrollID.

Como se ve en el siguiente diagrama, el patrón de administración de datos de fila tiene una tabla para varios usuarios.

El patrón de administración de datos de tabla usa una tabla para varios usuarios.

A diferencia de todos los demás patrones, el acceso a los datos en el patrón de fila no se puede controlar por separado para diferentes usuarios. Usar menos tablas significa que las operaciones de actualización de esquema se completan más rápido cuando cada usuario tiene sus propias tablas de base de datos. En gran medida, este enfoque simplifica la integración, la desvinculación y las operaciones.

En la siguiente tabla, se describe cómo el patrón de administración de datos de fila afecta a los diferentes criterios.

Criterios Fila: Un conjunto de filas para cada patrón de administración de datos de usuarios
Aislamiento de datos
  • El nivel más bajo de aislamiento de datos
  • Sin seguridad en el nivel de los usuarios
Agilidad
  • No se requiere configuración en la base de datos durante la incorporación
    • La aplicación puede escribir datos directamente en las tablas existentes
  • La desvinculación implica borrar las filas del cliente en la tabla.
Operaciones
  • No hay operaciones separadas para los usuarios, lo que incluye la copia de seguridad, la supervisión y el registro
  • Poco o nada de sobrecarga a medida que aumenta el número de usuarios
Escala
  • Puede adaptarse a cualquier nivel de crecimiento de los usuarios
  • Admite una cantidad ilimitada de usuarios
Rendimiento
  • Aislamiento de recursos:
    • Todos los problemas de aislamiento de recursos que se producen en el patrón de base de datos también se aplican a este patrón.
    • Si los espacios de clave primaria no se diseñan con cuidado, es posible que ocurra un alto nivel de contención de recursos (vecino ruidoso).
      • Puede evitar la simultaneidad y la distribución
      • Es importante seguir las prácticas recomendadas
      • Borrar los datos del usuario puede tener un impacto temporal en la carga
  • Recursos mínimos por instancia: No hay recursos mínimos por instancia.
  • Eficiencia de recursos: Los arrendatarios comparten los recursos de una instancia. Cada arrendatario puede usar los recursos inactivos de otros arrendatarios.
  • Selección de ubicación para la optimización de la latencia: Si no usas la función de partición geográfica, la ubicación de la base de datos es la misma que la configuración de la instancia. No puedes personalizar la ubicación de la base de datos para cada arrendatario. Sin embargo, si usas la función de partición geográfica, puedes crear particiones de instancias en diferentes ubicaciones y colocar datos en diferentes ubicaciones con una clave de colocación de filas. El uso de la partición geográfica optimiza la latencia para cada instancia.
Requisitos reglamentarios y de cumplimiento
  • Si no usas la función de partición geográfica, la ubicación de las bases de datos es la misma que la configuración de la instancia para cumplir con los requisitos reglamentarios de residencia de datos. Sin embargo, si usas la función de partición geográfica, puedes crear particiones de instancias en diferentes ubicaciones y colocar datos en diferentes ubicaciones con una clave de colocación por fila.
  • El patrón no puede proporcionar partición en el nivel de sistema (en comparación con el patrón de instancia o de base de datos).
  • La implementación de cualquier control de seguridad y auditoría específico afecta a todos los usuarios.

En resumen, los puntos clave son los siguientes:

  • Ventajas: Es altamente escalable, tiene una sobrecarga operativa baja y simplifica la administración de esquemas.
  • Desventaja: Alta clasificación del recurso; falta de controles de seguridad y supervisión para cada usuario

Este patrón resulta más adecuado para las siguientes situaciones:

  • Aplicaciones internas que se dirigen a diferentes departamentos en los que el aislamiento estricto de seguridad de datos no es una preocupación importante en comparación con la facilidad de mantenimiento.
  • Uso compartido máximo de recursos para usuarios que usan la aplicación de nivel gratuito cuando minimizan el aprovisionamiento de recursos al mismo tiempo.

Patrones de administración de datos y administración del ciclo de vida de los usuarios

En la siguiente tabla, se comparan los diversos patrones de administración de datos en todos los criterios a un alto nivel.

Instancia Base de datos Tabla Fila
Aislamiento de datos Completado Alta Moderado Baja
Agilidad Bajo Moderado Moderado Más alto
Facilidad de operaciones Alto Alto Bajo Bajo
Escala Alta Limitado (a menos que se usen instancias adicionales cuando se alcance el límite) Limitada (a menos que se usen bases de datos adicionales cuando se alcance el límite) El más alto
Rendimiento1: Aislamiento de recursos Alta Bajo Baja Baja
Rendimiento1: Recursos mínimos por arrendatario Alta Moderada alta Moderado Sin mínimo por usuario
Rendimiento1: Eficiencia de recursos Baja Alto Alta Alta
Rendimiento1: Selección de la ubicación para la optimización de la latencia Alta Moderado Moderado Moderado
Reglamentos y cumplimiento Más alto Alta Moderado Baja

1 El rendimiento depende en gran medida del diseño del esquema y de las prácticas recomendadas de consultas. Los valores que aparecen aquí son solo una expectativa promedio.

Los mejores patrones de administración de datos para una aplicación multiusuario específica son los que satisfacen la mayoría de sus requisitos según los criterios. Si no se requiere un criterio en particular, puedes ignorar la fila en la que se encuentra.

Patrones de administración de datos combinados

A menudo, un patrón de administración de datos único es suficiente para abordar los requisitos de una aplicación multiusuario. Cuando ese es el caso, el diseño puede adoptar un solo patrón de administración de datos.

Algunas aplicaciones multiusuario requieren varios patrones de administración de datos al mismo tiempo. Por ejemplo, una aplicación multiusuario que admite un nivel gratuito, un nivel regular y un nivel empresarial.

  • Nivel gratuito:

    • Debe ser rentable
    • Debe tener un límite superior de volumen de datos
    • Por lo general, admite funciones limitadas
    • El patrón de administración de datos de fila es un buen candidato de nivel gratuito
      • La administración de usuarios es sencilla
      • No es necesario crear recursos de usuarios específicos o exclusivos
  • Nivel regular:

    • Ideal para clientes que pagan, que no tienen altos requisitos de escalamiento o aislamiento
    • El patrón de administración de datos de tabla o el patrón de administración de datos de base de datos son buenos candidatos para el nivel regular:
      • Las tablas y los índices son exclusivos del usuario.
      • Las copias de seguridad son sencillas en el patrón de administración de datos de base de datos
      • La copia de seguridad no es compatible con el patrón de administración de datos de la tabla.
        • La copia de seguridad de usuario debe implementarse como una utilidad fuera de Spanner.
  • Nivel empresarial:

    • Por lo general, un nivel alto de autonomía total en todos los aspectos
    • El usuario tiene recursos dedicados que incluyen escalamiento dedicado y aislamiento completo.
    • El patrón de administración de datos de instancia es adecuado para el nivel empresarial.

Una práctica recomendada es mantener diferentes patrones de administración de datos en diferentes bases de datos. Si bien es posible combinar diferentes patrones de administración de datos en una base de datos de Spanner, hacerlo dificulta la implementación de la lógica de acceso de la aplicación y las operaciones del ciclo de vida.

En la sección sobre el diseño de aplicaciones, se describen algunas consideraciones de diseño de aplicaciones multiusuario que se aplican cuando se usa un patrón de administración de datos único o varios patrones de administración de datos.

Administra el ciclo de vida del usuario

Los usuarios tienen un ciclo de vida. Por lo tanto, debes implementar las operaciones de administración correspondientes dentro de tu aplicación multiusuario. Más allá de las operaciones básicas de creación, actualización y eliminación de usuarios, considera las siguientes operaciones adicionales relacionadas con los datos:

  • Exporta datos de usuario:

    • Cuando se borra un usuario, se recomienda exportar primero sus datos y, en lo posible, hacer que el conjunto de datos esté disponible para ellos.
    • Cuando se usa el patrón de administración de datos de fila o tabla, el sistema de aplicaciones multiusuario debe implementar la exportación o mapearla a la función de base de datos (exportación de bases de datos) y, luego, implementar una lógica personalizada para extraer la porción de datos que corresponde al usuario.
  • Crea una copia de seguridad de los datos del usuario:

    • Cuando usas el patrón de administración de datos de instancia o de base de datos y las copias de seguridad de usuarios individuales, usa las funciones de exportación o copia de seguridad de la base de datos.
    • Cuando usas el patrón de administración de datos de tabla o fila y creas copias de seguridad de los datos de usuarios individuales, la aplicación multiusuario debe implementar esta operación. La base de datos de Spanner no puede determinar qué datos pertenecen a qué usuario.
  • Mueve datos de usuario:

    • Para mover un usuario de un patrón de administración de datos a otro (o mover un usuario dentro del mismo patrón de administración de datos entre instancias o bases de datos), se requiere la extracción de los datos de un patrón de administración de datos y la inserción de esos datos en el nuevo patrón de administración de datos.

    • Mitigar una situación de vecino ruidoso es otra razón para mover usuarios.

Diseño de aplicaciones

Cuando diseñas una aplicación multiusuario, implementas una lógica empresarial optimizada para usuarios. Esto significa que cada vez que la aplicación ejecuta la lógica empresarial, siempre debe estar en el contexto de un usuario conocido.

Desde la perspectiva de la base de datos, el diseño de la aplicación implica que cada consulta debe ejecutarse en el patrón de administración de datos en el que reside el usuario. En las siguientes secciones, se destacan algunos de los conceptos centrales del diseño de aplicaciones multiusuario.

Conexión de usuario dinámica y configuración de consulta

La asignación dinámica de datos de usuario a solicitudes de aplicación de usuarios usa una configuración de asignación:

  • En el caso de los patrones de administración de datos de la base de datos o los patrones de administración de datos de una instancia, una cadena de conexión es suficiente para acceder a los datos de un usuario.
  • Para los patrones de administración de datos de tablas, se deben determinar los nombres correctos de las tablas.
  • En el caso de los patrones de administración de datos de fila, usa los predicados adecuados para recuperar los datos de un usuario específico.

Una instancia puede estar en cualquiera de los cuatro patrones de administración de datos. La siguiente implementación de asignación aborda una configuración de conexión para el caso general de una aplicación multiusuario que usa todos los patrones de administración de datos al mismo tiempo. Cuando un usuario determinado reside en un patrón, algunas aplicaciones multiusuario usan un patrón de administración de datos para todos los usuarios. Este caso se cubre de forma implícita mediante la siguiente asignación.

Si un usuario ejecuta la lógica empresarial (por ejemplo, un empleado que accede con su ID de usuario), la lógica de la aplicación debe determinar el patrón de administración de datos del usuario, la ubicación de los datos para un ID de usuario determinado y, opcionalmente, la convención de nomenclatura de tablas (para el patrón de tabla).

Esta lógica de aplicación requiere la asignación de patrones de administración de usuarios a datos. En la siguiente muestra de código, connection string hace referencia a la base de datos en la que residen los datos del usuario. En la muestra, se identifica la instancia de Spanner y la base de datos. Para la base de datos y la instancia de patrón de administración de datos, el siguiente código es suficiente a fin de que la aplicación conecte y ejecute consultas:

tenant id -> (data management pattern,
              database connection string)

Se requiere un diseño adicional para los patrones de administración de datos de filas y tablas.

Patrón de administración de datos de tablas

Para el patrón de administración de datos de tabla, hay varios usuarios dentro de la misma base de datos. Cada grupo de usuarios tiene su propio conjunto de tablas. Las tablas se distinguen por su nombre. Qué tabla pertenece a qué usuario es determinista.

Un enfoque es colocar la tabla de cada usuario en un espacio de nombres con el nombre del usuario y calificar completamente el nombre de la tabla con namespace.name. Por ejemplo, puedes colocar una tabla EMPLOYEE dentro del espacio de nombres T356 para el usuario con el ID 356, y tu aplicación puede usar T356.EMPLOYEE para dirigir las solicitudes a la tabla.

Otro enfoque es anteponer el ID de usuario a los nombres de las tablas. Por ejemplo, la tabla EMPLOYEE se llama T356_EMPLOYEE para el usuario con el ID 356. La aplicación debe anteponer cada tabla con el prefijo tenant ID antes de enviar la consulta a la base de datos que devolvió la asignación.

Si deseas usar otro texto en lugar del ID de usuario, puedes mantener una asignación del ID de usuario al espacio de nombres del esquema con nombre o al prefijo de la tabla.

Para simplificar la lógica de la aplicación, puedes introducir un nivel de indirección. Por ejemplo, puedes usar una biblioteca común con tu aplicación para adjuntar automáticamente el prefijo de espacio de nombres o de tabla para la llamada del inquilino.

Patrón de administración de datos de filas

Se requiere un diseño similar para el patrón de administración de datos de filas. En este patrón, hay un solo esquema. Los datos de usuarios se almacenan como filas. Para acceder de forma correcta a los datos, agrega un predicado a cada consulta y selecciona el usuario adecuado.

Un enfoque para encontrar el usuario adecuado es tener una columna llamada TENANT en cada tabla. Para un mejor aislamiento de los datos, el valor de esta columna debe formar parte de la clave primaria. El valor de la columna es tenant ID. Cada consulta debe agregar un predicado AND TENANT = tenant ID a una cláusula WHERE existente o agregar una cláusula WHERE con el predicado AND TENANT = tenant ID.

Para conectarse a la base de datos y crear las consultas adecuadas, el identificador de usuario debe estar disponible en la lógica de la aplicación. Se puede pasar como parámetro o almacenar como contexto de subproceso.

Algunas operaciones del ciclo de vida requieren que modifiques la configuración de asignación del patrón de administración de usuario a dato Por ejemplo, cuando mueves un usuario entre patrones de administración de datos, debes actualizar el patrón de administración de datos y la string de conexión a la base de datos. Es posible que también debas actualizar el prefijo de la tabla.

Generación y atribución de consultas

Un principio subyacente fundamental de las aplicaciones multiusuario es que varios usuarios pueden compartir un solo recurso de nube. Los patrones de administración de datos anteriores se dividen en esta categoría, excepto en el caso de que se asigne un usuario único a una sola instancia de Spanner.

El uso compartido de recursos va más allá de compartir datos. También se comparten la supervisión y el registro. Por ejemplo, en el patrón de administración de datos de tabla y el patrón de administración de datos de fila, todas las consultas de todos los usuarios se registran en el mismo registro de auditoría.

Si se registra una consulta, este debe examinarse el texto de la consulta para determinar para qué usuario se ejecutó. En el patrón de administración de datos de filas, debes analizar el predicado. En el patrón de administración de datos de tablas, debes analizar uno de los nombres de la tabla.

En el patrón de administración de datos de base de datos o en el de administración de datos de instancia, el texto de la consulta no tiene información de usuarios. Para obtener información del usuario para estos patrones, debes consultar la tabla de asignación de patrones de administración de datos a usuarios.

Sería más fácil analizar los registros y las consultas si se determina el usuario para una consulta determinada sin analizar el texto de la consulta. Una forma de identificar de manera uniforme un usuario para una consulta en todos los patrones de administración de datos es agregar un comentario al texto de la consulta que tiene tenant ID y, de forma opcional, una label.

En la siguiente consulta, se seleccionan todos los datos del empleado para el grupo de usuarios que identifica TENANT 356. Para evitar analizar la sintaxis de SQL y extraer el ID de usuario del predicado, el ID de usuario se agrega como un comentario. Se puede extraer un comentario sin tener que analizar la sintaxis de SQL.

SELECT * FROM EMPLOYEE
  -- TENANT 356
  WHERE TENANT = 'T356';

o

SELECT * FROM T356_EMPLOYEE;
  -- TENANT 356

Con este diseño, cada ejecución de una consulta para un usuario se atribuye a ese usuario con independencia del patrón de administración de datos. Si un usuario se mueve de un patrón de administración de datos a otro, el texto de la consulta puede cambiar, pero la atribución se mantiene igual en el texto de consulta.

La muestra de código anterior es solo un método. Otro método es insertar un objeto JSON como un comentario en lugar de una etiqueta y un valor:

SELECT * FROM T356_EMPLOYEE;
  -- {"TENANT": 356}

También puedes usar etiquetas para atribuir búsquedas a los inquilinos y ver las estadísticas en las tablas spanner_sys integradas.

Operaciones del ciclo de vida de acceso de usuario

Según tu filosofía de diseño, una aplicación multiusuario puede implementar directamente las operaciones del ciclo de vida de los datos descritas antes, o puede crear una herramienta de administración de usuarios separada.

Independientemente de la estrategia de implementación, es posible que las operaciones del ciclo de vida deban ejecutarse sin la lógica de la aplicación en ejecución al mismo tiempo. Por ejemplo, mientras se mueve un usuario de un patrón de administración de datos a otro, la lógica de la aplicación no pueden ejecutar porque los datos no están en una sola base de datos. Cuando los datos no están en una sola base de datos, requieren dos operaciones adicionales desde la perspectiva de una aplicación:

  • Detener una instancia: Inhabilita todo el acceso a la lógica de la aplicación mientras permite las operaciones del ciclo de vida de los datos.
  • Iniciar un usuario: La lógica de la aplicación puede acceder a los datos de un usuario mientras las operaciones del ciclo de vida que interfieren en la lógica de la aplicación están inhabilitadas.

Si bien no se usa con frecuencia, el cierre de un usuario de emergencia puede ser otra operación importante del ciclo de vida. Usa este cierre cuando sospeches un incumplimiento y debas prohibir todo el acceso a los datos del usuario, no solo la lógica de la aplicación, sino también las operaciones del ciclo de vida. Un incumplimiento se puede originar dentro o fuera de la base de datos.

También debe estar disponible una operación del ciclo de vida coincidente que quite el estado de emergencia. Esta operación puede requerir que dos o más administradores accedan al mismo tiempo para implementar el control mutuo.

Aislamiento de aplicaciones

Los diversos patrones de administración de datos admiten diferentes grados de aislamiento de datos de usuarios. Desde el nivel más aislado (instancia) hasta el menos aislado (fila), son posibles diferentes grados de aislamiento.

En el contexto de una aplicación multiusuario, se debe tomar una decisión de implementación similar: ¿todos los usuarios acceden a sus datos (en patrones de administración de datos posiblemente diferentes) con la misma implementación de la aplicación? Por ejemplo, un clúster de Kubernetes único podría ser compatible con todos los usuarios y cuando un usuario accede a sus datos, el mismo clúster ejecuta la lógica empresarial.

Como alternativa, como en el caso de los patrones de administración de datos, se pueden dirigir diferentes usuarios a distintas implementaciones de aplicaciones. Los usuarios grandes pueden tener acceso a una implementación de aplicación exclusiva para ellos, mientras que los usuarios más pequeños en el nivel gratuito comparten una implementación de aplicación.

En lugar de hacer coincidir de forma directa los patrones de administración de datos que se analizan en este documento con patrones de administración de datos de aplicación equivalentes, puedes usar el patrón de administración de datos de base de datos para que todos los usuarios compartan una implementación de aplicación única. Es posible que el patrón de administración de datos de base de datos y todos estos usuarios compartan una sola implementación de la aplicación.

La arquitectura multiusuarios es un patrón de administración de datos de aplicación importante, en especial cuando la eficiencia de los recursos juega una función fundamental. Spanner admite varios patrones de administración de datos; úsalo para implementar aplicaciones multiusuario. Proporciona un tiempo de inactividad cero para el mantenimiento planificado o los fallos regionales, con un ANS de disponibilidad del 99.999%. También admite aplicaciones modernas multiusuario, ya que proporciona alta disponibilidad y escalabilidad.