Estou no processo de projetar um novo sistema para um grande conjunto de dados geoespaciais que exigirá um desempenho rápido da consulta de leitura. Portanto, quero ver se alguém pensa que é possível ou tem experiência / aconselhamento sobre DBMSs, estrutura de dados ou métodos alternativos adequados para obter o desempenho necessário na seguinte situação:
Os dados serão produzidos continuamente a partir de dados de radar de satélite processados, que terão cobertura global. Com base na resolução de satélites e cobertura terrestre do mundo, eu estimo o conjunto completo de dados para produzir valores em 75 bilhões de locais distintos no mundo. Durante a vida útil de um único satélite, a saída produzirá até 300 valores em cada um desses locais (portanto, um conjunto de dados total de> 22 trilhões de valores). Isto é para um satélite, e já existe um segundo em órbita, com outros dois planejados nos próximos anos. Portanto, haverá muitos dados! Um único item de dados é muito simples e consistirá apenas em (longitude, latitude, valor), mas devido ao número de itens, estimo um único satélite para produzir até 100 TB.
Os dados escritos nunca precisam ser atualizados, pois só crescerão à medida que novas aquisições de satélite forem processadas. O desempenho de gravação não é importante, mas o desempenho de leitura é crucial. O objetivo deste projeto é poder visualizar os dados por meio de uma interface simples, como uma camada sobre o google maps, onde cada ponto tem um valor colorido com base em sua média, gradiente ou alguma função ao longo do tempo. (demonstração no final da postagem).
A partir desses requisitos, o banco de dados precisa ser escalável e é provável que procuremos soluções em nuvem. O sistema precisa ser capaz de lidar com consultas geoespaciais, como "pontos próximos (lat, lon)" e "pontos dentro (caixa)", e ter desempenho de leitura de <1s para localizar um único ponto e polígonos que contêm até 50.000 pontos (embora até 200.000 pontos sejam preferíveis).
Até agora, tenho um conjunto de dados de teste de ~ 750 milhões de itens de dados em 111 milhões de locais. Eu testei uma instância postgres / postGIS, que funcionou bem, mas sem a possibilidade de fragmentação, não será possível lidar com o aumento dos dados. Também tentei uma instância mongoDB, que novamente parece OK. até agora, e com o sharding, pode ser suficiente escalar com o volume de dados. Recentemente, aprendi um pouco sobre elasticsearch, portanto, qualquer comentário sobre isso seria útil, pois é novo para mim.
Aqui está uma rápida animação do que queremos alcançar com o conjunto completo de dados:
Este gif (do meu teste do postgres) está servindo (6x3) blocos raster pré-computados, cada um contendo ~ 200.000 pontos e ~ 17s para gerar cada um. Ao clicar em um ponto, o gráfico é elaborado puxando todos os valores históricos no local mais próximo em <1s.
Desculpas pelo longo post, todos os comentários / conselhos são bem-vindos.