Plusy i minusy używania MongoDB zamiast MS SQL Server [zamknięty]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 2 lata temu .

Popraw to pytanie

Jestem nowy w świecie NoSQL i myślę o zastąpieniu mojej bazy danych MS SQL Server na MongoDB. Moja aplikacja (napisana w. Net C#) współdziała z kamerami IP i rejestruje metadane dla każdego obrazu z aparatu, do bazy danych MS SQL. Średnio wstawiam około 86400 rekordów dziennie dla każdej kamery i w bieżącym schemacie bazy danych utworzyłem osobną tabelę dla oddzielnych zdjęć z kamery, np. Camera_1_Images, Camera_2_Images ... Camera_N_Images. Pojedynczy rekord obrazu składa się z prostych informacji metadanych. jak AutoId, FilePath, CreationDate. Aby dodać więcej szczegółów, moja aplikacja inicjuje oddzielny proces (.exe) dla każdej kamery i każdego procesu wstawia 1 rekord na sekundę w tabela względna w bazie danych.

Potrzebuję sugestii ekspertów (MongoDB) w następujących kwestiach:

  1. Aby dowiedzieć się, czy MongoDB jest dobry do przechowywania takich danych, które ostatecznie zostaną zapytane o przedziały czasowe (np. pobrać wszystkie obrazy z konkretnej kamery między określoną godziną)? Jakieś sugestie dotyczące projektu schematu opartego na dokumentach dla mojej sprawy?

  2. Jaka powinna być Specyfikacja serwera (CPU, RAM, dysku)? jakieś sugestie?

  3. Czy powinienem rozważ Sharding / replikację w tym scenariuszu (biorąc pod uwagę wydajność na piśmie do synchronizacji zestawów replik)?

  4. Czy są jakieś korzyści z używania wielu baz danych na tej samej maszynie, tak że jedna baza danych będzie przechowywać obrazy z bieżącego dnia dla wszystkich kamer, a druga będzie używana do archiwizacji zdjęć z poprzedniego dnia? Myślę nad tym w odniesieniu do podziału odczytów i zapisów na oddzielnych bazach danych. Ponieważ wszystkie żądania odczytu mogą być obsługiwane przez drugą bazę danych i pisze do pierwszego. Skorzysta czy nie? Jeśli tak, to każdy pomysł, aby zapewnić, że obie bazy danych są synchronizowane zawsze.

Wszelkie inne sugestie są mile widziane.
Author: A-Sharabiani, 2012-11-02

3 answers

Jestem starterem w bazach NoSQL. Więc odpowiadam na to kosztem potencjalnych głosów w dół, ale będzie to dla mnie wspaniałe doświadczenie uczenia się.

Zanim postaram się odpowiedzieć na twoje pytania, powinienem powiedzieć, że jeśli MS SQL Server działa dobrze dla Ciebie, a następnie trzymaj się go. Nie masz podałeś jakiś ważny powód, dla którego chcesz używać MongoDB, z wyjątkiem faktu, że że dowiedziałeś się o tym jako dokument zorientowany db. Ponadto widzę że masz prawie ten sam zestaw metadanych, dla których rejestrujesz każda kamera, czyli Twój schemat jest dynamiczny.

  • aby powiedzieć, czy MongoDB jest dobry do przechowywania takich danych, które w końcu zostaną zapytane o przedziały czasowe (np. pobrać wszystkie obrazy z konkretnej kamery między określoną godziną)? Jakieś sugestie dotyczące projektu schematu opartego na dokumentach dla mojej sprawy?

MongoDB jest zorientowanym na dokument db, jest dobry w zapytaniu W zbiorczym (nazywamy go dokumentem). Od kiedy ty są już przechowywane dane każdej kamery w swojej własnej tabeli, w MongoDB będziesz mieć oddzielną kolekcję utworzoną dla każdej kamery. Oto jak {[18] } wykonujesz zapytania z zakresu dat.

  • Jaka powinna być Specyfikacja serwera (CPU, RAM, dysku)? jakieś sugestie?

Wszystkie bazy danych NoSQL są zbudowane tak, aby skalować na sprzęcie towarowym. Ale przy okazji zadałeś pytanie, możesz myśleć o poprawie wydajności przez skalowanie. Możesz zacząć od rozsądnej maszyny, a wraz ze wzrostem obciążenia możesz dodawać kolejne serwery(skalowanie). Nie musisz planować i kupować wysokiej klasy serwera.

  • Czy powinienem rozważyć Sharding / replikację dla tego scenariusza(biorąc pod uwagę wydajność na piśmie do synchronizacji zestawów replik)?

MongoDB blokuje cały db dla pojedynczego zapisu (ale daje wydajność dla innych operacji) i jest przeznaczony dla Systemów, które mają więcej odczytów niż zapisów. Zależy to więc od jaki jest Twój system. Istnieje wiele sposobów shardingu i powinien być specyficzny dla danej domeny. Odpowiedź ogólna nie jest możliwa. Jednak niektóre przykłady mogą być podane jak sharding przez geografii, przez gałęzie itp.

Przeczytaj również a plain english introduction to Cap Theorem

Zaktualizowano odpowiedź na komentarz do sharding

Zgodnie z ich } dokumentacją , powinieneś rozważyć wdrożenie sharded clustera, jeśli:

  • twój zestaw danych zbliża się lub przekracza pojemność pojedynczego węzła w systemie.
  • rozmiar aktywnego zestawu roboczego systemu wkrótce przekroczy pojemność maksymalnej ilości pamięci RAM dla systemu.
  • Twój system ma dużą aktywność zapisu, pojedyncza instancja MongoDB nie może zapisywać danych wystarczająco szybko, aby zaspokoić zapotrzebowanie, a wszystkie inne podejścia nie zmniejszyły kontrowersji.

Więc na podstawie ostatniego punktu tak. Funkcja auto-sharding jest zbudowana do skalowania. W takim przypadku masz blokadę zapisu dla shard, a nie dla bazy danych. Ale moja jest teoretyczną odpowiedzią. Proponuję konsultację z 10gen.com Grupa.

 29
Author: Aravind Yarram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:28

Aby stwierdzić, czy MongoDB jest dobry do przechowywania takich danych, które ostatecznie zostaną zapytane o przedziały czasowe (np. konkretnej kamery między określoną godziną)?

To pytanie jest zbyt subiektywne, aby odpowiedzieć. Z własnego doświadczenia z wieloma rozwiązaniami SQL (ironicznie nie MS SQL) powiedziałbym, że oba są równie dobre, jeśli zrobione dobrze.

Także:

Jaka powinna być Specyfikacja serwera (CPU, RAM, dysku)? dowolne sugestia?

Zależy od zbyt wielu zmiennych, które tylko Ty znasz, jednak mały klaster sprzętu towarowego działa całkiem dobrze. Naprawdę nie mogę udzielić rzeczowej odpowiedzi na to pytanie i sprowadzi się to do Twoich testów.

Jeśli chodzi o schemat to ja bym wybrał dokument struktury:

{
    _id: {},
    camera_name: "my awesome camera",
    images: [
        { 
            url: "http://I_like_S3_here.amazons3.com/my_image.png" ,
            // All your other fields per image
        }
    ]
}
To powinno być dość łatwe do utrzymania i aktualizacji, o ile nie osadzasz dużo głębiej, ponieważ wtedy może stać się trochę bólu, jednak to zależy od Twojego zapytania.

Nie tylko to, ale to powinno być dobre dla shardingu, ponieważ masz wszystkie potrzebne dane w jednym dokumencie, gdybyś miał shard na _id prawdopodobnie możesz uzyskać idealną konfigurację tutaj.

Czy powinienem rozważyć Sharding / replikację w tym scenariuszu(biorąc pod uwagę wydajność na piśmie do synchronizacji zestawów replik)?

Możliwe, że wiele osób zakłada, że muszą odłamać, kiedy w rzeczywistości po prostu muszą być bardziej inteligentni w tym, jak projektują baza danych. MongoDB jest bardzo darmową formą, więc istnieje wiele sposobów na zrobienie tego źle, ale biorąc to pod uwagę, Istnieje również wiele sposobów na zrobienie tego dobrze. Ja osobiście bym pamiętał o shardingu. Replikacja może być również bardzo przydatna.

Czy są jakieś korzyści z używania wielu baz danych na tej samej maszynie, tak że jedna baza danych będzie przechowywać obrazy z bieżącego dnia dla wszystkich kamer, a druga będzie używana do archiwizacji zdjęć z poprzedniego dnia?

Mimo że MongoDBs write lock jest na poziomie DB (obecnie) powiedziałbym: nie. Właściwa struktura dokumentu i właściwe odłamywanie / replikacja(w razie potrzeby) powinny być w stanie obsłużyć to w jednym zbiorze (- ach) opartym na dokumencie w ramach jednego DB. Nie tylko to, ale możesz kierować zapisy i odczyty w klastrze na określone serwery, aby stworzyć sytuację współbieżności między niektórymi maszynami w klastrze. Promowałbym poprawne wykorzystanie funkcji współbieżności MongoDBs nad separacją DB.

Edit

Po czytając pytanie ponownie pominąłem moje rozwiązanie, że wstawiasz 80K + zdjęć dla każdego aparatu dziennie. Jako taki zamiast osadzonej opcji chciałbym rzeczywiście zrobić wiersz na obraz w kolekcji o nazwie images, a następnie camera kolekcja i odpytywać dwa tak jak w SQL.

Podzielenie kolekcji images powinno być równie łatwe na camera_id.

Upewnij się również, że bierzesz pod uwagę swój zestaw roboczy z serwerem.

 4
Author: Sammaye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 15:51:13

Aby stwierdzić, czy MongoDB jest dobry do przechowywania takich danych, które ostatecznie zostaną zapytane o przedziały czasowe (np. konkretnej kamery między określoną godziną)? Wszelkie sugestie dotyczące Schemat oparty na dokumentach dla mojej sprawy?

MongoDB może to zrobić. Aby uzyskać lepszą wydajność, możesz ustawić indeks w swoim polu czasu.

Jaka powinna być Specyfikacja serwera (CPU, RAM, dysku)? jakieś sugestie?

Myślę, że RAM i Dysk byłby ważny.

  • Jeśli nie chcesz robić sharding do scale out, powinieneś rozważyć większy rozmiar dysku, aby móc przechowywać w nim wszystkie swoje dane.
  • twoje gorące dane powinny zmieścić się w pamięci RAM. Jeśli nie, powinieneś rozważyć większą pamięć RAM, ponieważ wydajność MongoDB zależy głównie od PAMIĘCI RAM.

Czy powinienem rozważyć Sharding/replikację dla tego scenariusza (podczas biorąc pod uwagę wydajność na piśmie, aby zsynchronizować replikę zestawy)?

Nie wiem ile macie aparatów, nawet 1000 wstawek / sekundę przy sumie 1000 kamer powinno być łatwe do zmontowania. Jeśli chodzi o wydajność insert, nie sądzę, że musisz robić sharding (z tym, że rozmiar danych jest zbyt duży, aby rozdzielić je na kilka maszyn).

Kolejnym problemem jest częstotliwość odczytu aplikacji. To jest bardzo wysoki, to można rozważyć sharding lub replikacji tutaj. I można użyć (timestamp + camera_id) jako klucz sharding, jeśli zapytanie dotyczy tylko jednej kamery w zakresie czasu.

Czy są jakieś korzyści z używania wielu baz danych na tej samej maszynie, więc ta jedna baza danych będzie zawierała zdjęcia z dnia bieżącego dla wszystkich kamer, a drugi będzie używany do archiwizacji zdjęć z poprzedniego dnia?

Tabelę można rozdzielić na dwie kolekcje (archive i current). I ustaw indeks tylko na archive, jeśli zapytasz o datę tylko na archive. Bez nakładów na tworzenie indeksu, zbiór current powinien korzystać z insert.

I możesz napisać codzienny program do zrzutu danych current do archive.

 3
Author: Chien-Wei Huang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 10:30:27