Jak skonfigurować MongoDB Java driver MongoOptions do użytku produkcyjnego?

Szukałem w Internecie, szukając najlepszych praktyk konfigurowania MongoOptions dla Sterownika Java MongoDB i nie wymyśliłem nic innego niż API. Poszukiwania zaczęły się po tym, jak wpadłem na kom.mongodb.DBPortPool$Semahoresout: Out of semafors to get db błąd połączenia " i zwiększając połączenia / mnożnik byłem w stanie rozwiązać ten problem. Szukam linków do lub twoich najlepszych praktyk w konfigurowaniu tych opcji do produkcji.

Opcje dla sterownik 2.4 zawiera: http://api.mongodb.org/java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connectionsPerHost
  • connectTimeout
  • maxWaitTime
  • socketTimeout
  • threadsAllowedToBlockForConnectionmultiplier

Nowsze sterowniki mają więcej opcji i byłbym zainteresowany wysłuchaniem o nich, jak również.

Author: Eyal, 2011-06-29

2 answers

Zaktualizowano do 2.9:

  • AutoConnectRetry oznacza po prostu, że sterownik automatycznie spróbuje ponownie połączyć się z serwerem(serwerami) po nieoczekiwanym rozłączeniu. W środowiskach produkcyjnych zwykle ma być ustawiony na true.

  • ConnectionsPerHost to ilość fizycznych połączeń, które pojedyncza instancja Mongo (jest singleton, więc zwykle masz jedną na aplikację) może ustanowić do procesu mongod/mongos. W momencie pisania sterownika java będzie ustal tę liczbę połączeń w końcu, nawet jeśli rzeczywista przepustowość zapytania jest niska(w słowach kolejności zobaczysz statystykę "conn" w mongostat rośnie, dopóki nie trafi tę liczbę na serwer aplikacji).

    Nie ma potrzeby ustawiania tego powyżej 100 w większości przypadków, ale to ustawienie jest jedną z tych rzeczy" przetestuj i zobacz". Pamiętaj, że musisz upewnić się, że ustawiłeś tę wartość na tyle nisko, aby całkowita liczba połączeń z serwerem nie przekraczała

    db.serverStatus().connections.available

    W produkcja obecnie wynosi 40.

  • ConnectTimeout . Jak sama nazwa wskazuje liczba milisekund sterownik będzie czekał przed przerwaniem próby połączenia. Ustaw timeout na coś długiego (15-30 sekund), chyba że istnieje realistyczna, oczekiwana szansa, że będzie to przeszkadzać w innych udanych próbach połączenia. Zwykle, jeśli próba połączenia trwa dłużej niż kilka sekund, infrastruktura sieciowa nie jest w stanie uzyskać wysokiej przepustowość.

  • MaxWaitTime . Liczba ms wątku będzie czekać na połączenie, które stanie się dostępne w puli połączeń i spowoduje wyjątek, jeśli nie zdarzy się to na czas. Zachowaj wartość domyślną.

  • SocketTimeout . Standardowa wartość limitu czasu gniazda. Ustawiona na 60 sekund (60000).

  • ThreadsAllowedToBlockForConnectionmultiplier . Mnożnik dla connectionsPerHost oznaczający liczbę wątków, na które można czekać połączenia, aby stały się dostępne, jeśli pula jest obecnie wyczerpana. Jest to ustawienie, które spowoduje " com.mongodb.Dbportpool$SemaphoresOut: Out of semafors to get db connection" wyjątek. Wyrzuci ten wyjątek, gdy kolejka wątków przekroczy wartość threadsAllowedToBlockForConnectionmultiplier. Na przykład, jeśli connectionsPerHost wynosi 10, a wartość ta wynosi 5, do 50 wątków może zablokować przed rzuceniem wspomnianego wyjątku.

    Jeśli spodziewasz się dużych szczytów w przepustowość, która może powodować duże kolejki, tymczasowo zwiększa tę wartość. Właśnie z tego powodu mamy go na 1500. Jeśli Ładowanie zapytań konsekwentnie przewyższa serwer, powinieneś odpowiednio poprawić swój sprzęt/skalowanie.

  • ReadPreference . (UPDATED, 2.8+) używany do określenia domyślnej preferencji odczytu i zastępuje "slaveOk". Skonfiguruj Readpreferencję za pomocą jednej z metod klasy factory. pełny opis produktu najczęstsze ustawienia można znaleźć na końcu tego posta

  • W . (UPDATED, 2.6+) ta wartość określa "bezpieczeństwo" zapisu. Gdy wartość ta wynosi -1, write nie zgłosi żadnych błędów niezależnie od błędów sieci lub bazy danych. WriteConcern.NONE jest odpowiednim predefiniowanym WriteConcern. Jeśli w wynosi 0, to błędy sieciowe spowodują, że write nie powiedzie się, ale błędy mongo nie będą. Jest to zwykle określane jako "fire and forget" pisze i powinien być stosowany, gdy wydajność jest ważniejsza niż spójność i trwałość. Użyj WriteConcern.Normalny dla tego trybu.

    Jeśli ustawisz w na 1 lub więcej, zapis jest uważany za Bezpieczny. Bezpieczne zapisy wykonaj zapis i wykonaj go poprzez żądanie do serwera, aby upewnić się, że zapis się powiódł lub pobrać wartość błędu, jeśli nie (Innymi słowy, wysyła polecenie getLastError () po zapisie). Zauważ, że do czasu zakończenia polecenia getLastError() połączenie jest zarezerwowane. Jako wynik tego i dodatkowego polecenia przepływność będzie znacznie niższa niż zapis z w

    W przypadku zestawów replik można użyć wyższych wartości, aby w whcih powiedzieć MongoDB, aby wysłał zapis do co najmniej "w" członków zestawu replik przed powrotem (lub dokładniej, poczekaj na replikację zapisu do " w " członków). Można również ustaw w na łańcuch "większość", który mówi MongoDB, aby wykonał zapis do większości członków zestawu replik (writeconcern.Większość). Typicall powinieneś ustawić tę wartość na 1, chyba że potrzebujesz wydajności surowej (-1 lub 0) lub replikowanych zapisów (>1). Wartości wyższe niż 1 mają znaczny wpływ na przepustowość zapisu.

  • Fsync . Opcja trwałości, która zmusza mongo do spłukiwania na dysk po każdym zapisie, gdy jest włączona. Nigdy nie miałem żadnych problemów z trwałością związanych z zaległościami w pisaniu, więc mamy to na false (domyślnie) w produkcji.

  • J *(NOWE 2.7+)*. Wartość logiczna, która po ustawieniu na true zmusza MongoDB do oczekiwania na udany commit grupy dziennikarskiej przed powrotem. Jeśli masz włączone dziennikowanie, możesz to włączyć, aby zapewnić dodatkową trwałość. Zobacz http://www.mongodb.org/display/DOCS/Journaling aby zobaczyć, co da ci Dziennikarstwo (a więc dlaczego warto włączyć to flaga).

ReadPreference Klasa ReadPreference pozwala Ci skonfigurować, do jakiego stopnia zapytania instancji mongod są kierowane, jeśli pracujesz z zestawami replik. Dostępne są następujące opcje :

  • ReadPreference.primary () : wszystkie odczyty trafiają tylko do głównego członka repset. Użyj tego, jeśli wszystkie zapytania wymagają zwrócenia spójnych (ostatnio zapisanych) danych. To jest default.

  • ReadPreference.primaryPreferred () : wszystkie odczyty trafiają do głównego elementu repset, jeśli to możliwe, ale mogą odpytywać drugorzędne elementy, jeśli węzeł główny nie jest dostępny. W ten sposób, jeśli podstawowy staje się niedostępny, odczyty stają się ostatecznie spójne, ale tylko wtedy, gdy podstawowy jest niedostępny.

  • ReadPreference.secondary () : wszystkie odczyty trafiają do drugorzędnych członków repsetu, a element główny jest używany tylko do zapisu. Użyj tego tylko wtedy, gdy możesz żyć z ostatecznie konsekwentnym czytaniem. Dodatkowe członkowie repset mogą być używane do skalowania wydajności odczytu, chociaż istnieją limity liczby członków (głosujących) repset może mieć.

  • ReadPreference.secondaryPreferred () : wszystkie odczyty trafiają do drugorzędnych członków repsetu, jeśli któryś z nich jest dostępny. Członek główny jest używany wyłącznie do zapisu, chyba że wszyscy członkowie drugorzędni staną się niedostępni. Inne niż zapasowe do głównego członka dla odczytów to jest to samo, co ReadPreference.wtórne ().

  • ReadPreference.nearest () : czyta przejdź do najbliższego członka repset dostępnego dla klienta bazy danych. Używaj tylko wtedy, gdy dopuszczalne są spójne odczyty. Najbliższy członek to członek o najniższym opóźnieniu między Klientem a różnymi członkami repset. Ponieważ zajęci członkowie będą mieli większe opóźnienia, to powinno również automatycznie zrównoważyć obciążenie odczytu, chociaż z mojego doświadczenia wydaje się, że wtórne (preferowane) więc lepiej, jeśli opóźnienia członkowskie są stosunkowo spójne.

Uwaga: wszystkie powyższe wersje mają tę samą metodę, która zwraca instancje TaggableReadPreference. Pełny opis znaczników zestawu replik znajduje się tutaj: znaczniki zestawu replik

 151
Author: Remon van Vliet,
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
2013-03-06 09:59:12

Sterowniki MongoDB zapewniają klientom Mongo kilka opcji obsługi różnych błędów limitu czasu sieci, które mogą wystąpić podczas użytkowania. Opcje różnią się w zależności od wersji i języka sterownika. Zdecydowanie polecam przeczytanie dokumentacji klasy MongoClient twojego sterownika. Podczas produkcji ważne jest, aby ustawić prawidłowe wartości tych opcji, aby uniknąć nieoczekiwanych przerw w przepływie aplikacji. Inteligentne połączenie z serwerem bazy danych może zwiększyć wydajność aplikacji.

Tutaj to kilka ważnych opcji dla MongoClient, które chcesz ustawić podczas łączenia się z serwerem MongoDB w produkcji.

ServerSelctionTimeOut: timeout wyboru serwera jest liczbą milisekund, które sterownik mongo będzie czekał na wybranie serwera do operacji przed poddaniem się i wystąpieniem błędu.Sterownik Mongo używa 30s jako domyślnej wartości limitu czasu wyboru serwera. W zależności od przypadku użycia możemy zwiększyć lub zmniejszyć ten próg.

Połączenie Timeout: limit czasu połączenia jest liczbą milisekund, które sterownik będzie czekał przed przerwaniem nowej próby połączenia.Domyślna wartość limitu czasu połączenia zależy od wersji i języka sterownika. Najnowsze wersje sterowników Mongo Java & Ruby mają domyślny limit czasu 10s dla połączeń, podczas gdy sterownik NodeJs nie ma limitu czasu.Jeśli limit czasu jest zbyt wysoki, ryzykujesz zwlekanie z aplikacją. Jeśli limit czasu jest zbyt niski, możesz zrezygnować zbyt szybko. Lepiej jest przetestować z różnymi wartościami, aby znaleźć odpowiedni limit czasu dla Twojej aplikacji.

SocketTimeout:Socket timeout to liczba milisekund, którą wysyłanie lub odbieranie na gnieździe może zająć przed upływem czasu.Sterownik Mongo Java & NodeJS ma domyślny limit czasu gniazda wynoszący 0s, co oznacza w zasadzie brak limitu czasu. Podczas gdy Ruby oferuje limit czasu gniazda 5s. Nie chcesz nakładać limitu na ten limit czasu, ponieważ różne operacje będą wymagały tego czasu.

Zrozumienie Klienta MongoDB Opcje Timeout mają szczegółowy opis, aby mieć więcej wglądu w te opcje.

 2
Author: VISHAL KUMAWAT,
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
2016-11-07 12:00:13