Estoy en el proceso de diseñar un nuevo sistema para un gran conjunto de datos geoespaciales que requerirá un rendimiento de consulta de lectura rápida. Por lo tanto, quiero ver si alguien cree que es posible o tiene experiencia / consejos sobre DBMS adecuados, estructura de datos o métodos alternativos para lograr el rendimiento requerido en la siguiente situación:
Los datos se producirán continuamente a partir de datos de radar satelital procesados, que tendrán cobertura global. Basado en la resolución satelital y la cobertura terrestre del mundo, calculo el conjunto de datos completo para producir valores en 75 mil millones de ubicaciones discretas en el mundo. Durante la vida útil de un solo satélite, la salida producirá hasta 300 valores en cada una de estas ubicaciones (por lo tanto, un conjunto de datos total de> 22 billones de valores). Esto es para un satélite, y ya hay un segundo en órbita, con otros dos planeados en los nuevos años. ¡Entonces habrá muchos datos! Un solo elemento de datos es muy simple y solo consistirá en (longitud, latitud, valor), pero debido a la cantidad de elementos, calculo que un solo satélite producirá hasta 100TB.
Los datos escritos nunca deberían necesitar actualización, ya que solo crecerán a medida que se procesen nuevas adquisiciones de satélites. El rendimiento de escritura no es importante, pero el rendimiento de lectura es crucial. El objetivo de este proyecto es poder visualizar los datos a través de una interfaz simple como una capa sobre los mapas de Google, donde cada punto tiene un valor de color basado en su promedio, gradiente o alguna función a lo largo del tiempo. (demostración al final de la publicación).
A partir de estos requisitos, la base de datos debe ser escalable y es probable que busquemos soluciones en la nube. El sistema debe ser capaz de manejar consultas geoespaciales como "puntos cerca (lat, lon)" y "puntos dentro (recuadro)", y tener un rendimiento de lectura de <1s para localizar un solo punto y polígonos que contengan hasta 50,000 puntos (aunque sería preferible hasta 200,000 puntos).
Hasta ahora tengo un conjunto de datos de prueba de ~ 750 millones de elementos de datos en 111 millones de ubicaciones. He probado una instancia de postgres / postGIS, que funcionó bien, pero sin la posibilidad de fragmentar, no puedo hacer esto a medida que crecen los datos. También he probado una instancia de mongoDB, que nuevamente parece estar bien, así que lejos, y con el fragmentación puede ser suficiente escalar con el volumen de datos. Recientemente he aprendido un poco sobre Elasticsearch, por lo que cualquier comentario sobre esto sería útil, ya que es nuevo para mí.
Aquí hay una animación rápida de lo que queremos lograr con el conjunto de datos completo:
Este gif (de mi prueba de postgres) está sirviendo (6x3) mosaicos ráster precalculados, cada uno con ~ 200,000 puntos y tomando ~ 17s para generar cada uno. Al hacer clic en un punto, el gráfico se realiza al extraer todos los valores históricos en la ubicación más cercana en <1s.
Disculpas por la larga publicación, todos los comentarios / consejos son bienvenidos.