2013-07-29 17 views
134

Próbuję go rozgryźć, co mogę wykorzystać do przyszłego projektu, planujemy przechowywać około 500 000 rekordów miesięcznie w pierwszym roku, a może więcej na następne lata to aplikacja pionowa więc nie ma potrzeby korzystania z bazy danych, dlatego zdecydowałem się wybrać pamięć masową noSQL.DynamoDB kontra MongoDB NoSQL

Pierwsza opcja, która przyszła mi do głowy to mongo db, ponieważ jest to bardzo dojrzały produkt z dużym wsparciem ze strony społeczności, ale z drugiej strony mamy zupełnie nowy produkt, który oferuje usługę zarządzaną przy najwyższej wydajności, I Rozwiążę tę apelację, ale nie ma planu konserwacji (przynajmniej na razie), więc myślę, że będzie to ogromna zaleta, ponieważ Amazon zapewnia elastyczny sposób skalowania.

Moja główna troska dotyczy struktury zapytań, nie analizowałem jeszcze możliwości zapytań dynamoDB, ale ponieważ jest to przechowywanie danych w k/v, uważam, że może to być bardziej ograniczone niż mongo db.

Jeśli ktoś miał doświadczenie w przenoszeniu projektu z mongoDB do DynamoDB, wszelkie porady zostaną całkowicie docenione.

+3

Jeśli potrzebujesz porady dotyczącej struktury zapytań, proponuję podać przykład twojego schematu wraz z przypadkami użycia dla uzyskania dostępu do danych. Bez nich trudno jest dokonać oceny sytuacji. –

+0

Rzeczywiście, sposób kwerendy danych może znacznie wpłynąć na wybór db bazy danych. Jak hierarchiczne byłoby moje pytanie nr 1. – zanlok

+2

Jestem zaskoczony, że to pytanie nie zostało jeszcze zamknięte przez rankingowanie osób z grupy SO. Zwykle pytania, które szukają porady, są zamknięte, ponieważ nie proszą o pomoc w bardzo konkretnym problemie. –

Odpowiedz

48

Z dokumentami 500 tys. Nie ma powodu do skali. Typowy laptop z dyskiem SSD i 8 GB pamięci RAM może z łatwością zrobić 10 milionów rekordów, więc jeśli próbujesz wybrać z powodu skalowania, wybór nie ma znaczenia. Proponuję wybrać to, co lubisz najbardziej, i być może tam, gdzie możesz znaleźć najwięcej wsparcia online.

+0

Tak, moim zmartwieniem burmistrza jest zwiększanie skali i utrzymanie w czasie, aby być uczciwym osobiście Czuję, że mongoDB może wykonać zadanie, o którym właśnie myślę w kategoriach średnio i długoterminowego utrzymania –

+7

Derick, inny ważny czynnik w skali jest wykorzystanie, a nie tylko liczba dokumentów lub rozmiar bazy danych. @jack nie "czuć", ale polegać na testowaniu, w tym na platformie i sprzęcie końcowego wdrożenia; Tydzień spędzony na wypychaniu kilku wariantów bazy danych za pomocą danych i testów porównawczych powinien prowadzić do podejmowania świadomych decyzji, oszczędzając wiele bólu. – zanlok

+2

Zapewnienie profesjonalnego produktu/usługi wykracza daleko poza proste rozwiązanie "to może zrobić". Tylko dlatego, że maszyna cheapo może uruchomić Linuksa, MongoDB i miliony rekordów prawie bez pieniędzy, nie równa się doskonałej wydajności w realnym świecie.Rekordy 500K (z prostym schematem) byłyby prawdopodobnie dobrym kandydatem do DynamoDB, ponieważ OP nie miałby kosztów utrzymania (przynajmniej na sprzęt), a miesięczna opłata prawdopodobnie byłaby znacznie niższa niż koszt serwera w trakcie rok lub dwa. – cbmeeks

134

Wiem, że jest stary, ale wciąż pojawia się, gdy szukasz porównania. Używaliśmy Mongo, przeprowadziliśmy się prawie całkowicie do Dynamo, co jest teraz naszym pierwszym wyborem. Nie dlatego, że ma więcej funkcji, nie ma. Mongo ma lepszy język zapytań, możesz indeksować w strukturze, jest wiele małych rzeczy. Przewaga Dynamo wynika z tego, co OP stwierdził w swoim komentarzu: jest to łatwe. Nie musisz dbać o żadne serwery. Kiedy zaczynasz konfigurować rozwiązanie z Mongo, staje się to skomplikowane. Możesz iść do jednej z firm hostingowych, ale to też nie jest tanie. Dzięki Dynamo potrzebujesz większej przepustowości, wystarczy kliknąć przycisk. Możesz pisać skrypty do skali automatycznie. Kiedy nadszedł czas, aby uaktualnić Dynamo, jest to zrobione za Ciebie. To wszystko dużo cennego stresu i czasu nie wydanego. Jeśli nie masz dedykowanych ludzi z ops, Dynamo jest doskonałe.

Teraz domyślnie używamy Dynamo. Może Mongo, jeśli struktura danych jest wystarczająco skomplikowana, aby to uzasadnić, ale prawdopodobnie wrócimy do bazy danych SQL. Dynamo jest tępy, naprawdę musisz pomyśleć o tym, jak zamierzasz go zbudować, i prawdopodobnie użyjesz Redisa w Elasticcache, by działał na skomplikowane rzeczy. Ale na pewno dobrze jest nie dbać o to. Kodujesz. to jest to!

+23

Jeśli porównać bazę danych z bazą danych, należy porównać tylko funkcje bazy danych. Hostowane rozwiązanie nie jest funkcją bazy danych. Jeśli szukasz hostowanego MongoDB, idź na MongoHQ i wykonuj wszystkie prace, których możesz uniknąć, koncentrując się na swojej podstawowej pracy. – Kabeer

+6

To prawda, chociaż wstępne porównanie kosztów, które zrobiliśmy, pokazało, że dynamo to całkiem dobry interes. Inną kwestią jest to, że jeśli musisz zwiększyć/zmniejszyć dynamo, jest to kliknięcie przycisku. Jeśli musisz dodać dysk lub zmienić rozmiar serwera mongo, w grę wchodzą przestoje, niezależnie od tego, czy musisz to zrobić, czy też ktoś inny. – CargoMeister

7

Należy pamiętać, mam eksperymentował tylko z MongoDB ...

Z tego co czytałem, DynamoDB przebyła długą drogę, jeśli chodzi o funkcje. Był to super-podstawowy sklep z kluczem wartości o bardzo ograniczonych możliwościach przechowywania i wysyłania zapytań. Od tego czasu rośnie, wspierając teraz bigger document sizes + JSON support i global secondary indices. Różnica między ofertami DynamoDB i MongoDB pod względem funkcji rośnie z każdym miesiącem. Nowe funkcje DynamoDB są rozszerzone na here.

Większość porównań MongoDB i DynamoDB jest nieaktualna ze względu na niedawne dodanie funkcji DynamoDB. Jednakże, this post oferuje kilka innych przekonujących punktów do wyboru DynamoDB, a mianowicie, że jest to proste, mało wymagające w utrzymaniu i często tanie. Another discussion here wyborów bazy danych był interesujący, choć nieco stary.

Moje dania na wynos: jeśli używasz poważnych zapytań do bazy danych lub pracujesz w językach nieobsługiwanych przez DynamoDB, użyj MongoDB. W przeciwnym razie trzymaj się DynamoDB.

14

Krótka odpowiedź: Zacznij od SQL i dodaj NoSQL tylko wtedy, gdy/w razie potrzeby. (chyba, że ​​nie potrzebujesz niczego poza bardzo prostymi pytaniami)

Moje osobiste doświadczenia: nie używałem MongoDB do zapytań, ale od kwietnia 2015 DynamoDB jest nadal bardzo okaleczony, jeśli chodzi o coś innego niż najbardziej podstawowy klucz/zapytania wartości. Uwielbiam go za podstawowe rzeczy, ale jeśli chcesz języka zapytań, spójrz na prawdziwe rozwiązanie bazy danych SQL.

W DynamoDB możesz zapytać o skrót lub klawisz skrótu i ​​zakresu, a możesz mieć wiele wtórnych indeksów globalnych. Robię zapytania na pojedynczej tabeli z 4 możliwymi parametrami filtrowania i sortowaniem wyników, jest to obsługiwane (ledwo) poprzez użycie globalnych indeksów pomocniczych z wyrażeniami filtru. Problem pojawia się, gdy próbujesz uzyskać sumaryczne wyniki pasujące do filtra, nie możesz po prostu wyszukać pierwszych 10 elementów pasujących do filtra, ale raczej sprawdza 10 elementów i możesz uzyskać 0 poprawnych wyników, zmuszając Cię do ponownego znalezienia skanowanie z klawisza kontynuacji - ból szyi i zużywa zbyt dużo limitu odczytanego ze stołu dla prostego scenariusza.

Mówiąc konkretnie o problemie granicznej z filtrami w zapytaniu, to jest od docs (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit):

 
In a response, DynamoDB returns all the matching results within 
the scope of the Limit value. For example, if you issue a Query 
or a Scan request with a Limit value of 6 and without a filter 
expression, the operation returns the first six items in the 
table that match the request parameters. If you also supply a 
FilterExpression, the operation returns the items within the 
first six items in the table that match the filter requirements. 

Moja konkluzja jest taka, że ​​zapytań obejmujących FilterExpressions są użyteczne tylko w bardzo rzadkich przypadkach i nie są skalowalne, ponieważ każde zapytanie może z łatwością odczytać większość lub całą twoją tabelę, która pochłania zbyt wiele jednostek czytających DynamoDB. Gdy użyjesz zbyt wielu odczytanych jednostek, uzyskasz dławienie i słabą wydajność.

Opinia eksperta: Na szczycie AWS w dniu 9 kwietnia 2015 r. Brett Hollman, menedżer ds. Architektury rozwiązań, AWS w swoim przemówieniu na temat skriningu do pierwszych 10 milionów użytkowników opowiada się za rozpoczęciem od bazy danych SQL, a następnie za pomocą NoSQL tylko wtedy i to ma sens. Ponieważ prędzej czy później prawdopodobnie będziesz potrzebował serwera SQL gdzieś w twoim stosie. Jego slajdy są tutaj: http://www.slideshare.net/AmazonWebServices/deep-dive-scaling-up-to-your-first-10-million-users Zobacz slajd 28.

+0

Powinieneś naprawdę sprawdzić, jak łatwo jest zintegrować wyszukiwanie w chmurze ze strumieniami dynamodb i lambda, aby uzyskać pełny tekst lub zapytania oparte na lokalizacji. – MrTJ

+3

Wybierz bazę danych zgodnie z własnymi potrzebami. To nie jest wybór między SQL i noSQL, ale między zorientowanym na dokumenty DB, zorientowanym na wykresy DB, DB-Key, RDMBS .... Nie ma złotego wyboru, a SQL z pewnością nie jest. – vcarel

10

Wybraliśmy kombinację Mongo/Dynamo dla produktu medycznego. Zasadniczo mongo pozwala na lepsze wyszukiwanie, ale hostowane Dynamo jest świetne, ponieważ jest zgodne z HIPAA bez dodatkowej pracy. Więc obsługujemy część mongo bez danych osobowych na standardowej konfiguracji i pozwalamy amazonowi zajmować się częścią HIPAA pod względem infrastruktury. Możemy przesyłać zapytania o pewne przedmioty z mongo, które przywołują dokumenty ze wskaźnikami (identyfikatorami) powiązanego dokumentu Dynama.

Głównym powodem, dla którego zdecydowaliśmy się zrobić to za pomocą mongo zamiast hostingu całej aplikacji na dynamo było 2 powody. Najpierw musieliśmy przeprowadzić wyszukiwanie oparte na lokalizacji, z którego mongo jest świetne i na czasie, Dynamo nie było, ale teraz mają opcję.

Po drugie, niektóre dokumenty były niestrukturalne, a my nie wiedzieliśmy z wyprzedzeniem, jakie dane będą, więc na przykład powiedzmy, że użytkownik wprowadza dokument w kolekcji "form" w następujący sposób: {"nazwa użytkownika": " user1 "," email ":" [email protected] "}. Inny użytkownik umieszcza to w tej samej kolekcji {"telefon": "813-555-3333", "lokalizacja": [28.1234, -83.2342]}. Za pomocą mongo możemy przeszukiwać dowolne z tych dynamicznych i nieznanych pól w dowolnym momencie. Dynamo, możesz to zrobić, ale musiałby utworzyć indeks za każdym razem, gdy dodano nowe pole, które chciałbyś wyszukać. Więc jeśli nigdy wcześniej nie miałeś pola telefonicznego w swoim dokumencie Dynamo, a potem nagle, ktoś je dodaje, jest całkowicie niezbadany.

Teraz to przywołuje inny punkt, o którym wspomniałeś.Czasami wybór właściwego rozwiązania nie zawsze oznacza wybór najlepszego produktu do pracy. Na przykład możesz mieć klienta, który potrzebuje i będzie używać systemu utworzonego przez 10 lat. Korzystanie z rozwiązania SaaS/IaaS, które jest wystarczająco dobre, aby wykonać pracę, może być lepszym rozwiązaniem, ponieważ możesz polegać na Amazon, aby utrzymywać i utrzymywać swoje systemy na dłuższą metę.

7

Pracowałem zarówno nad fanem obu.

Ale musisz zrozumieć, kiedy użyć tego, co iw jakim celu.

Nie wydaje mi się, że dobrym pomysłem jest przeniesienie całej bazy danych do DynamoDB, ponieważ zapytania są trudne, z wyjątkiem kluczy podstawowych i pomocniczych, indeksowanie jest ograniczone, a skanowanie w DynamoDB jest bolesne.

Wybrałbym hybrydowy rodzaj DB, gdzie powinny być dostępne obszerne dane do zapytania, z MongoDB, z całą jego funkcją, której nigdy nie czułbyś się ograniczony do wprowadzania ulepszeń lub modyfikacji.

DynamoDB działa błyskawicznie (szybciej niż MongoDB), więc DynamoDB jest często używany jako alternatywa dla sesji w skalowalnych aplikacjach. Najlepsze praktyki DynamoDB sugerują również, że jeśli jest dużo danych, które są rzadziej używane, przenieś je do innej tabeli.

Załóżmy, że masz artykuły lub kanały. Ludzie częściej szukają rzeczy w zeszłym tygodniu lub w tym miesiącu. szanse na to, że ludzie odwiedzają dwuletnie dane, są bardzo rzadkie. W tym celu DynamoDB preferuje przechowywanie danych przez miesiące lub lata w różnych tabelach.

DynamoDB jest bezspornie skalowalny, coś, co trzeba zrobić ręcznie w MongoDB. jednak można stracić na wydajności DynamoDB, jeśli nie rozumiesz partycji przepustowości i jak działa skalowanie za sceną.

DynamoDB powinien być używany tam, gdzie prędkość jest krytyczna, z drugiej strony MongoDB ma za dużo rąk i funkcji, coś, czego nie ma DynamoDB.

na przykład, możesz mieć zestaw replik MongoDB w taki sposób, że jedna z replik posiada instancję danych z 8 (lub cokolwiek) godzinami. Naprawdę użyteczne, jeśli spartaczyłeś coś dużego czasu w DB i chcesz uzyskać dane tak jak wcześniej.

To jednak moja opinia.

+1

A połączenie Redis i MongoDB? Myślę, że to niesamowite. – Ismaestro

+0

Chyba tak, nie mam do czynienia z doświadczeniem w Redis, ale na pewno jest on powszechnie używany ze względu na jego wydajność, w DB pamięci prawie zawsze lepiej niż DB bazujące na dyskach. Myślę więc, że dane, do których należy uzyskać dostęp na ogromnym zapotrzebowaniu i wysokiej częstotliwości, powinny trafić do Redis. Z drugiej strony w przypadku dużych letargicznych danych należy stosować MongoDB. –