2012-07-17 12 views
6

Używam MongoDB od jakiegoś czasu i zobaczyłem, że fsync czeka na wypróżnienie danych na dysk. Ok, więc pomyślałem, że to jest rozwiązanie dla bezpieczeństwa danych.Do czego służy fsync MongoDB?

To działało dobrze, trwa długo, dłużej niż w przypadku SQL. Wtedy zobaczyłem, że mogę umieścić syncdelay do 0, a następnie prędkość powróciła, ale pomyślałem, jak będzie w przyszłości z wieloma wieloma jednoczesnymi żądaniami. Usunąłem więc opcję fsync z aktualizacji oraz wstawiłem i usunięto opcję konfiguracji syncdelay.

Aby sprawdzić, czy dane zostały napisane szybko sprawdziłem Rockmongo po tym, jak zrobiłem aktualizację, a dane rzeczywiście tam były, super szybko!

Tak naprawdę, co to jest fsync, jeśli powoduje, że zapisy są powolne, a bez tego zapisy się zdarzają, a mimo to szybko?

Odpowiedz

5

Per Mongo dokumentacja:

Głównym zastosowaniem fsync jest do spłukiwania i zablokować bazy danych kopii zapasowych.

również

bloków operacja Fsync wszystkie inne operacje zapisu na jakiś czas biegnie.

Blokowanie wydaje się być przyczyną.

4

fsync to technicznie polecenie administratora, które wymusza wypłukanie wszystkich danych na dysk. Nie powinieneś go używać w swoim kodzie, przynajmniej normalnie. Służy do blokowania bazy danych dla kopii zapasowych i tak dalej.

Bezpieczeństwo danych w MongoDB pochodzi z replikacji/shardingu/kronikowania, a nie z wymuszania zapisu. Taki rodzaj pokonuje cel rzeczy.

Sterownik Java opakowuje tę koncepcję "zapisu i synchronizacji" w klasie WriteConcern, której nigdy nie lubiłem. Nie powinieneś decydować, która część twoich danych jest mniej lub bardziej istotna, ale po prostu zaufaj narzędziu, aby wykonać swoją pracę.

Ponadto, jeśli ustawiony syncdelay do zera upewnić włączeniu dziennika off. Zobacz this.

+0

Moim największym problemem było to, że Mongo przechowywane dane na temat pamięci na dysku, a następnie po syncdelay, a jeśli użytkownik otrzymuje wiad sucess ale sprzęt nie powiodło się przed tym synchronizacji, w zasadzie, wielkim niepowodzeniem. Mam rację? czy jest na to rozwiązanie? – Hadrian

+0

Ponownie, replikacja.MongoDB to rozproszony magazyn danych, a nie RDBMS. Pojedyncza instancja MongoDB jest w zasadzie bezużyteczna, ponieważ nie można polegać na tym, że jest trwała sama. Kiedy masz dwa wystąpienia, nie musisz się martwić o awarię sprzętu. – kprobst

+0

Pojedyncze wystąpienie z kronikowaniem jest w porządku pod względem trwałości, zwłaszcza w przypadku problemów związanych z pisaniem dziennika. – MrKurt

0

Zgodnie z innymi odpowiedziami polecenie fsync wymusza opróżnianie i jest zwykle używane tuż przed zablokowaniem plików danych dla migawki czasu w punkcie.

Istnieje "fsync" write concern option na getLastError, który będzie czekać na powrót do wszystkich oczekujących danych zostało przepłukane na dysk. Normalnie nie użyłby to jednak opcja „j” (który wraca jak najszybciej dziennika stało) jest znacznie szybszy powrót i nadal zapewnia trwałe zapisy. można przekazać za pośrednictwem polecenia aktualizacja/insert jako bezpieczna opcja w sterowniku wyboru aby automatycznie uruchomić komendę getLastError dla Ciebie.