¿Cuál es la forma moderna de particionar PostgreSQL en las máquinas, cuando los datos son "naturalmente particionables"?


22

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).

  1. 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.

  2. 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.

  3. 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:

  1. 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.

  2. 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:

  1. 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).
  2. Poder escalar dinámicamente arriba / abajo, agregando / eliminando nodos de servidor. Principalmente como Riak es capaz de hacer.
  3. No requiero que mi aplicación sepa con qué nodos hablar y cuándo.

Hola loxs, ¿cómo resolviste este problema?
Dikla

Particionamiento a nivel de aplicación con múltiples almacenes de datos. Realmente un desastre :(. Realmente triste de que algo como esto no exista ...
loxs

Respuestas:



4

Creo que la mejor opción es pgpool-II . Puede tener hasta 128 nodos y

  1. Es posible configurar reglas complejas de partición y distribución de datos
  2. Soporte "Aprovisionamiento en línea". No escala las escrituras pero se lee escalable
  3. No estoy seguro, si es posible fuera de la caja. Quizás necesites usar LVS

Otra opción podría ser Stado

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.