2009-09-05 13 views
11

Nuestra aplicación actualmente genera una nueva base de datos para cada cliente. Estamos comenzando a preguntarnos si deberíamos considerar la refacturación de esto a un sistema de múltiples inquilinos.Cualquier idea sobre aplicaciones Multi-tenant versus Multi-database en Rails

¿Qué beneficios/compensaciones deberíamos considerar? ¿Cuáles son las mejores prácticas para implementar una aplicación de múltiples usuarios en Rails?

Respuesta

6

Los sistemas de múltiples inquilinos le presentarán toda una serie de problemas. Mis pensamientos rápidos están por debajo

  • Todos SQL debe ser examinado y rediseñado para incluir un valor ClientId.

  • todos los índices deben ser examinados para determinar si el ClientId tiene que ser incluido

  • un error en una instrucción SQL por un desarrollador /administrador de sistemas en la producción se afectar a todos sus clientes.

  • Una base de datos de la corrupción/problema afectar a todos sus clientes

  • Usted tiene algo de privacidad de datos cuestiones cual pobre código/aplicación podría permitir clienteA para ver los datos pertenecientes a clienteB

  • Un cliente que use su sistema de una manera pesada/agresiva puede afectar la percepción de los demás clientes sobre el rendimiento

  • Adaptar los datos estáticos a las preferencias individuales de los clientes se vuelve más complejo.

Estoy seguro de que hay una serie de otros problemas, pero estos fueron mis primeros pensamientos.

+0

gracias Steve .. No parece demasiado enamorados .. Cualquier beneficio de hacer esto en su opinión? – Dom

+2

Hmm. También hay muchas desventajas para el enfoque de múltiples bases de datos. Si estoy diseñando un sistema, tenderá a tener varios inquilinos con clientes grandes en particular, tal vez divididos en un sistema aparte. De hecho, hay algunos beneficios para un sistema con varios inquilinos. El gran número de bases de datos se convierte en un dolor de cabeza administrativo. También es doloroso programar actualizaciones en múltiples bases de datos, etc. –

0

¿Por qué lo harías? ¿Tiene una gran agregación entre usuarios o está generando demasiados DB? ¿Ha considerado usar archivos SQLite por inquilino en lugar de servidores de bases de datos compartidos (ya que las aplicaciones multiusuario a menudo son de bajo perfil y no necesitan mucha concurrencia)?

+0

consideramos esto, sin embargo, en una configuración de servidor web con equilibrio de carga, nos habríamos encontrado con problemas al usar sqllite en diferentes servidores web, por lo que optamos por un enfoque de 2 niveles – Dom

2

Realmente depende de lo que esté haciendo.

Estamos haciendo un programa MIS para la industria de la impresión que rastrea inventario, empleados, clientes, equipos y hace algunos cálculos serios para estimar los costos de la realización de trabajos basados ​​en muchas variables de entrada.

Estamos anticipando bases de datos muy grandes para cada cliente, y actualmente tenemos 170 tablas. Agregar otra columna a casi todas las tablas solo para almacenar el client_id me duele el cerebro.

Actualmente estamos en la fase beta de nuestro programa, y ​​aquí están algunas cosas que hemos encontrado:

  • Migraciones: A Rieles suposición es que sólo tendrá 1 base de datos. Puede adaptarlo para múltiples bases de datos, y migraciones es una de ellas. Necesita una tarea de rake personalizada para aplicar migraciones a todas las bases de datos existentes. Prepárese para resolver muchos problemas, ya que una migración puede tener éxito en una base de datos, pero puede fallar en otra.
  • Bases de datos de desove: ¿Cómo se crea un nuevo db? ¿De un archivo SQL, copiando un db existente o ejecutando todas las migraciones? ¿Cómo mantiene su esquema coherente entre su sistema de creación de tablas y sus bases de datos en vivo?
  • Conectando a la base de datos apropiada: Usamos una cookie para almacenar un valor único que se asigna a la base de datos correcta. Usamos un filtro de antes en un controlador Autorizado que hereda de ActionController que obtiene el db de ese valor único y utiliza el método establish_connection en una Subclase de ActiveRecord :: Base. Esto nos permite obtener algunos modelos de un db común y otros del db específico del cliente.

Si tiene preguntas específicas sobre cualquiera de estos, le puedo ayudar.

+0

Nuestra aplicación funciona mucho como has descrito anteriormente. Constantemente hemos tenido problemas con la migración de bases de datos y hemos descubierto que nuestro desarrollo puede derivar en diferentes esquemas inconsistentes, lo que resulta en un gran esfuerzo para tratar de fusionar cuando queremos implementar. Las principales atracciones para refacturar nuestra aplicación como un sistema multi-tennant es que no tenemos que preocuparnos por una gran cantidad de lógica de migración de bases de datos, podemos escalar nuestra aplicación en base a una única base de datos, y podemos construir un conjunto más limpio de herramientas de administración ... – Dom

8

He estado investigando lo mismo y encontré esta presentación para ofrecer una solución interesante: usar esquemas de Postgre (un poco como espacios de nombres) para separar datos en el nivel DB manteniendo todos los inquilinos en el mismo DB y permaneciendo (en su mayoría) transparente a los rieles.

Writing Multi-Tenant Applications in Rails - Guy Naor

Cuestiones relacionadas