Recomendamos este enfoque, ya que es el más sencillo de administrar, especialmente cuando todos los tenants comparten el mismo esquema de datos y los volúmenes de datos son moderados (< TBs)Al consolidar todos los datos de los tenants en una sola tabla, mejora la eficiencia del almacenamiento gracias a una compresión de datos optimizada y a una menor sobrecarga de metadatos. Además, las actualizaciones del esquema se simplifican, ya que todos los datos se administran de forma centralizada. Este método es especialmente eficaz para gestionar una gran cantidad de tenants (potencialmente millones). Sin embargo, otros enfoques pueden ser más adecuados si los tenants tienen distintos esquemas de datos o se espera que diverjan con el tiempo. En los casos en que exista una diferencia significativa en el volumen de datos entre tenants, los tenants más pequeños pueden verse afectados innecesariamente en el rendimiento de las consultas. Tenga en cuenta que este problema se mitiga en gran medida al incluir el campo tenant en la clave primaria. Este es un ejemplo de implementación de un modelo de multitenencia con tabla compartida. Primero, creemos una tabla compartida con el campo
tenant_id incluido en la clave primaria.
user_1 y user_2.
user_1 y user_2 a acceder únicamente a los datos de sus tenants.
GRANT SELECT sobre la tabla compartida mediante un rol común.
user_1 y ejecutar una consulta SELECT sencilla. Solo se devuelven las filas del primer tenant.
Tablas separadas
Usar tablas separadas es una buena opción cuando los tenants tienen distintos esquemas de datos.En escenarios con pocos tenants pero con conjuntos de datos muy grandes, donde el rendimiento de las consultas es crítico, este enfoque puede superar al modelo de tabla compartida. Como no es necesario filtrar los datos de otros tenants, las consultas pueden ser más eficientes. Además, las claves primarias pueden optimizarse aún más, ya que no hace falta incluir un campo adicional (como un ID de tenant) en la clave primaria. Ten en cuenta que este enfoque no escala para miles de tenants. Consulta los límites de uso. Este es un ejemplo de implementación del modelo de multi-tenancy con tablas separadas. Primero, creemos dos tablas: una para los eventos de
tenant_1 y otra para los eventos de tenant_2.
user_1 y user_2.
GRANT SELECT en la tabla correspondiente.
user_1 y ejecutar una consulta select simple sobre la tabla correspondiente a este usuario. Solo se devuelven las filas del primer tenant.
Bases de datos separadas
Este enfoque es útil si cada tenant requiere una gran cantidad de tablas y, posiblemente, vistas materializadas, y tiene un esquema de datos diferente. Sin embargo, puede resultar difícil de administrar si el número de tenants es elevado.La implementación es similar al enfoque de tablas separadas, pero, en lugar de conceder privilegios a nivel de tabla, se conceden a nivel de base de datos. Ten en cuenta que este enfoque no escala bien para miles de tenants. Consulta límites de uso. Este es un ejemplo de implementación de un modelo de multitenencia con bases de datos separadas. Primero, creemos dos bases de datos: una para
tenant_1 y otra para tenant_2.
user_1 y user_2.
GRANT SELECT sobre la tabla correspondiente.
user_1 y ejecutar una consulta SELECT sencilla sobre la tabla events de la base de datos correspondiente. Solo se devuelven las filas del primer tenant.
Compute-compute separation
Servicio Cloud independiente
Este método, menos habitual, sería una solución si es necesario almacenar los datos de los tenants en distintas regiones por motivos legales, de seguridad o proximidad.Se debe crear una cuenta de usuario en cada servicio para que el usuario pueda acceder a los datos del tenant correspondiente. Este enfoque es más difícil de gestionar y añade sobrecarga con cada servicio, ya que cada uno requiere su propia infraestructura para funcionar. Los servicios pueden gestionarse mediante la ClickHouse Cloud API, y la orquestación también es posible a través del provider oficial de Terraform. Este es un ejemplo de implementación de un modelo de multitenencia con servicios separados. Ten en cuenta que el ejemplo muestra la creación de tablas y usuarios en un servicio de ClickHouse; esto mismo deberá replicarse en todos los servicios. Primero, vamos a crear la tabla
events
user_1
GRANT SELECT sobre la tabla correspondiente.
user_1 al servicio del tenant 1 y ejecutar una consulta select sencilla. Solo se devuelven las filas del primer tenant.