Jestem w trakcie projektowania nowego systemu dla dużego zestawu danych geoprzestrzennych, który będzie wymagał szybkiego wykonania zapytania dotyczącego odczytu. Dlatego chcę sprawdzić, czy ktoś uważa, że jest to możliwe, lub ma doświadczenie / porady dotyczące odpowiednich DBMS, struktury danych lub alternatywnych metod, aby osiągnąć wymaganą wydajność w następującej sytuacji:
Dane będą nieprzerwanie wytwarzane z przetworzonych danych radaru satelitarnego, które będą miały zasięg globalny. Na podstawie rozdzielczości satelitarnej i zasięgu lądowego globu szacuję pełny zestaw danych, aby uzyskać wartości w 75 miliardach dyskretnych lokalizacji na kuli ziemskiej. W ciągu całego życia pojedynczego satelity dane wyjściowe będą generować do 300 wartości w każdej z tych lokalizacji (więc całkowity zestaw danych> 22 bilionów wartości). Dotyczy to jednego satelity, a na orbicie jest już drugi, a kolejne dwa planowane są na kilka kolejnych lat. Będzie więc dużo danych! Pojedynczy element danych jest bardzo prosty i będzie się składał tylko (długość, szerokość geograficzna, wartość), ale ze względu na liczbę elementów oceniam, że pojedynczy satelita może wyprodukować do 100 TB.
Zapisane dane nigdy nie powinny wymagać aktualizacji, ponieważ będą rosły tylko w miarę przetwarzania nowych akwizycji satelitarnych. Wydajność zapisu nie jest ważna, ale wydajność odczytu ma kluczowe znaczenie. Celem tego projektu jest możliwość wizualizacji danych za pomocą prostego interfejsu, takiego jak warstwa nad mapami Google, gdzie każdy punkt ma kolorową wartość na podstawie jego średniej, gradientu lub funkcji w czasie. (demo na końcu postu).
Z tych wymagań baza danych musi być skalowalna i prawdopodobnie będziemy szukać rozwiązań w chmurze. System musi być w stanie poradzić sobie z zapytaniami geoprzestrzennymi, takimi jak „punkty w pobliżu (lat, lon)” i „punkty w (box)”, i mieć wydajność odczytu <1s dla lokalizacji pojedynczego punktu oraz wielokątów zawierających do 50 000 punktów (choć preferowane byłoby do 200 000 punktów).
Do tej pory mam zestaw danych testowych ~ 750 milionów danych w 111 milionach lokalizacji. Przetestowałem instancję postgres / postGIS, która działała OK, ale bez możliwości dzielenia nie robię tego, to będzie w stanie poradzić sobie w miarę wzrostu danych. Przetestowałem również instancję mongoDB, która znów wydaje się OK, więc daleko, a przy dzieleniu na fragmenty może być wystarczające skalowanie z woluminem danych. Niedawno nauczyłem się trochę o elasticsearch, więc wszelkie komentarze na ten temat byłyby pomocne, ponieważ są dla mnie nowe.
Oto szybka animacja tego, co chcemy osiągnąć przy użyciu pełnego zestawu danych:
Ten gif (z mojej postgresowej wersji próbnej) podaje (6x3) wstępnie obliczone płytki rastrowe, z których każda zawiera ~ 200 000 punktów i zajmuje około 17 sekund na wygenerowanie każdego. Kliknięcie punktu powoduje utworzenie wykresu poprzez wyciągnięcie wszystkich wartości historycznych z najbliższej lokalizacji w <1s.
Przepraszamy za długi post, wszelkie komentarze / porady są mile widziane.