Después de varios años de vivir en el espacio "NoSQL", ahora tengo un problema que es bastante "relacional" en su naturaleza. Hoy veo almacenes de datos con ojos bastante diferentes que antes. Cosas como Riak me han echado a perder de una manera que ya no puedo tolerar puntos únicos de falla, "falta de mantenimiento", etc. Por supuesto, (o espero), no he perdido completamente la cordura. Este es un proyecto personal que no tiene (o aún) requisitos extremadamente altos.
La mayoría de las soluciones de fragmentación no me dan lo que quiero (al menos a simple vista), probablemente porque mi problema es bastante "fácil" de resolver. Al menos en el nivel conceptual (ignorando las restricciones que los propios RDBM traen a la mesa).
Tengo una pequeña cantidad de datos "compartidos", que se pueden duplicar libremente. No tiene requisitos de consistencia dura. Esto se puede almacenar en una base de datos tipo dinamo y se escalará infinitamente. Pero aún me gustaría ir con una sola base de datos si es posible.
Tengo muchos datos "por usuario". Es decir, muchos usuarios, con cada usuario con datos de tamaño absolutamente razonable, realmente aptos para ser almacenados en un solo nodo PostgreSQL. Estamos hablando de 10s de miles de registros como máximo.
Nunca necesito consultar entre usuarios y no necesito atomicidad entre usuarios.
Esto suena extremadamente fácil de lograr. Al menos cuando lo estoy mirando con mis "ojos NoSQL".
Estas son mis ingenuas ideas iniciales:
En el extremo, podría serializar a todo el usuario como una sola clave / valor en Riak. Por supuesto, la deserialización / serialización constante de varios megabytes de datos será lenta y es por eso que estoy considerando usar PostgreSQL. Muchos Riak K / V no se pueden usar, ya que necesito atomicidad / transacciones dentro de los datos de cada usuario.
Podría usar una base de datos SQLite por usuario, y usar algo como GlusterFS para la redundancia / disponibilidad. Esta es probablemente la solución que voy a elegir si no puedo encontrar algo igualmente bueno usando PostgreSQL. Pros: puede reducir / aumentar la escala realmente bien; Contras: prefiero tener los tipos y la rigidez de PostgreSQL sobre SQLite
Entonces, lo que idealmente solicitaría de una solución de fragmentación de PostgreSQL:
- Guarde automáticamente varias copias de los datos de cada usuario (en diferentes máquinas). Poder cambiar dinámicamente el nodo maestro por usuario / fragmento (si el maestro anterior se cae).
- Poder escalar dinámicamente arriba / abajo, agregando / eliminando nodos de servidor. Principalmente como Riak es capaz de hacer.
- No requiero que mi aplicación sepa con qué nodos hablar y cuándo.