2012-03-08 16 views
10

Zdaję sobie sprawę, że to pytanie jest dość dobrze omówione, jednak chciałbym uzyskać twój wkład w kontekście moich konkretnych potrzeb.Redis kontra MySQL dla danych finansowych?

Zajmuję się tworzeniem finansowej bazy danych w czasie rzeczywistym, która pobiera notowania giełdowe z sieci kilka razy na minutę i zapisuje je w bazie danych. Obecnie pracuję z SQLAlchemy nad MySQL, ale natknąłem się na Redisa i wygląda to interesująco. Wygląda dobrze, szczególnie ze względu na jego wydajność, która ma kluczowe znaczenie w mojej aplikacji. Wiem, że MySQL może być szybki, po prostu czuję, że wdrażanie ciężkiego buforowania będzie bolesne.

Dane, które zapisuję, to zdecydowanie głównie wartości dziesiętne. Wykonuję również znaczną liczbę podziałów i multiplikacji z tymi wartościami dziesiętnymi (w innej aplikacji).

Pod względem wielkości danych chwytam około 10 000 symboli kilka razy na minutę. Daje to około 3 TB danych rocznie.

Jestem również zaniepokojony kluczowym ograniczeniem ilościowym Redisa (2^32). Czy Redis to dobre rozwiązanie? Jakie inne czynniki mogą mi pomóc podjąć decyzję dotyczącą MySQL lub Redis?

Dziękujemy!

+1

MySQL jest relacyjną bazą danych, a Redist jest magazynem klucz: wartość. Już sam powinien zadzwonić dzwonek, co używać. Na Amazon RDS MySQL po prostu lata, gdy chodzi o czytanie i pisanie. Gdybym był tobą (i miałbym trochę gotówki, żeby go poprzeć), utworzyłbym go z MySQL i zainstalowałbym na Amazon RDS. –

Odpowiedz

19

Redis jest przechowywać w pamięci. Wszystkie dane muszą pasować do pamięci. Więc jeśli nie masz 3 TB pamięci RAM na rok, nie jest to właściwa opcja. Limit 2^32 nie jest tak naprawdę problemem w praktyce, ponieważ prawdopodobnie i tak będziesz musiał odrzucić swoje dane (tj. Użyć wielu instancji), a ponieważ limit to w rzeczywistości 2^32 klucze z 2^32 elementów na klucz.

Jeśli masz wystarczająco dużo pamięci i nadal chcesz używać (sharded) Redis, oto jak można przechowywać przestrzeń efektywnego czasowy: https://github.com/antirez/redis-timeseries

Można też załatać Redis, aby dodać odpowiednią szeregów czasowych struktura danych. Zobacz realizację Luca Sbardella pod adresem:

https://github.com/lsbardel/redis

http://lsbardel.github.com/python-stdnet/contrib/redis_timeseries.html

Redis jest doskonała do zbiorczych statystyk w czasie rzeczywistym i zapisać wynik tych caclulations (czyli aplikacje pyłu). Jednak przechowywanie danych historycznych w Redis jest znacznie mniej interesujące, ponieważ nie oferuje języka zapytań do wykonywania obliczeń w trybie offline na tych danych. Sklepy oparte na Btree obsługujące sharding (na przykład MongoDB) są prawdopodobnie wygodniejsze niż Redis do przechowywania dużych serii czasowych.

Tradycyjne relacyjne bazy danych nie są tak złe, aby przechowywać serie czasowe. Ludzie poświęcili całe książki na ten temat:

Developing Time-Oriented Database Applications in SQL

Innym rozwiązaniem może warto rozważyć stosuje bigdata rozwiązanie:

storing massive ordered time series data in bigtable derivatives

IMO główny punkt (niezależnie od silnika składowania) służy do oceny wzorców dostępu do tych danych. Do czego chcesz użyć tych danych? W jaki sposób uzyskasz dostęp do tych danych po ich zapisaniu? Czy potrzebujesz odzyskać wszystkie dane związane z danym symbolem? Czy potrzebujesz ewolucji kilku symboli w danym przedziale czasowym? Czy trzeba korelować wartości różnych symboli w czasie? etc ...

Moja rada to wypróbować listę wszystkich tych wzorców dostępu. Wybór danego mechanizmu składowania będzie tylko konsekwencją tej analizy.

Jeśli chodzi o użycie MySQL, zdecydowanie uważam, table partitioning ze względu na objętość danych. W zależności od schematów dostępu rozważałbym również ARCHIVE engine. Ten silnik przechowuje dane w skompresowanych plikach płaskich. Jest to przestrzeń efektywna. Może być używany z partycjonowaniem, więc pomimo tego, że nie indeksuje danych, może być skuteczny w pobieraniu podzbioru danych, jeśli szczegółowość podziału jest starannie wybrana.

+0

dziękuję za odpowiedź. w odniesieniu do MySQL, jakie koncepcje lub funkcje powinienem zaglądać, aby zoptymalizować wykorzystanie MySQL? – user1094786

+0

Zaktualizowałem moją poprzednią odpowiedź. –

0

Powinieneś najpierw sprawdzić cechy, które oferuje Redis pod względem doboru i agregacji danych. W porównaniu z bazą danych SQL, Redis jest ograniczony.

W rzeczywistości "Redis vs MySQL" zazwyczaj nie jest właściwym pytaniem, ponieważ są to jabłka i gruszki. Jeśli odświeżasz dane w bazie danych (również usuwając je regularnie), sprawdź partycjonowanie MySQL. Zobacz np. odpowiedź pisałem What is the best way to delete old rows from MySQL on a rolling basis?

>

Wyjazd MySQL Partitioning:

Dane, które traci swoją przydatność często mogą być łatwo usunięte z tabeli partycjonowanej przez upuszczenie partycję (lub partycje) zawierające tylko że dane. I odwrotnie, proces dodawania nowych danych może być w znacznym stopniu ułatwiony przez dodanie jednej lub więcej nowych partycji do przechowywania tych danych.

Zobacz np. Ten post, aby uzyskać kilka pomysłów na to, jak je zastosować:

Using Partitioning and Event Scheduler to Prune Archive Tables

A ten:

Partitioning by dates: the quick how-to

+0

Hy - dzięki! Nie usuwam, tylko stale dodaje i odpytuje (nie trzeba usuwać wartości historycznych, ja ich potrzebuję). Czy twoja odpowiedź jest nadal aktualna? – user1094786

+0

Łącze do partycjonowania MySQL zawiera przykłady zapytań, które mogą skorzystać na partycjonowaniu. Zobacz również przycinanie partycji: http://dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html –

1

Powinieneś rozważyć Cassandrę lub Hbase. Oba pozwalają na ciągłe przechowywanie i szybkie dołączanie, więc jeśli chodzi o kwerendy, otrzymujesz ogromną wydajność. Obie z łatwością przyjmą dziesiątki tysięcy punktów na sekundę.

Kluczowym punktem jest jeden z wymiarów zapytania (zwykle przez ticker), uzyskujesz dostęp do dysku (ssd lub spinning), przylegająco:. Nie musisz uderzać w indeksy miliony razy. Możesz modelować rzeczy w Mongo/SQL, aby uzyskać podobną wydajność, ale jest to bardziej kłopotliwe i dostajesz je "za darmo" po wyjęciu z pudełka z kolumnowymi facetami, bez konieczności wykonywania żadnych shenaniganów po stronie klienta, aby połączyć bloby razem.

Moje doświadczenie z Cassandrą jest to, że 10x szybciej niż MongoDB, który jest już o wiele szybciej niż większość relacyjnych baz danych, do wykorzystania serii przypadku czasowej, jak rośnie i rozmiar danych, jego przewaga nad innymi rośnie też. Dotyczy to nawet pojedynczej maszyny. Here jest tam, gdzie powinieneś zacząć.

Jedynym minusem na Cassandrze jest to, że nie masz regularności przez kilka sekund, jeśli masz dużą gromadę, więc musisz albo ją wymusić, zwolnić, albo zaakceptować, że bardzo ostatni wydruk czasami będzie mieć kilka sekund. Na jednej maszynie będą problemy z zerową spójnością, a otrzymasz te same korzyści kolumnowe.

Mniej znane z Hbase, ale twierdzi, że jest bardziej spójne (nie będzie kosztować gdzie indziej - twierdzenie CAP), ale jest znacznie bardziej zobowiązanie do ustawienia stosu Hbase.

Powiązane problemy