Kompilacje indeksu w MongoDB mogą mieć negatywny wpływ na dostępność klastra MongoDB. Jeśli uruchomisz budowanie indeksu pierwszego planu na dużej kolekcji na serwerze produkcyjnym, może się okazać, że klaster przestanie odpowiadać do czasu zakończenia budowania indeksu. W przypadku dużej kolekcji może to zająć kilka godzin lub dni, jak opisano w niebezpieczeństwach związanych z budowaniem indeksu w MongoDB.
Zalecaną najlepszą praktyką jest uruchamianie kompilacji indeksu w tle, jednak w przypadku dużych indeksów kolekcji napotkaliśmy wiele problemów związanych z tym podejściem. W przypadku klastra z trzema węzłami oba serwery pomocnicze zaczynają budować indeks i przestają odpowiadać na wszelkie żądania. W związku z tym podstawowy nie ma kworum i przechodzi do stanu drugorzędnego, wyłączając klaster. Ponadto domyślne kompilacje indeksów uruchamiane z wiersza poleceń to kompilacje indeksów pierwszego planu – co sprawia, że jest to obecnie powszechny problem. Mamy nadzieję, że w przyszłych wydaniach stanie się to domyślnie tłem.
Po uruchomieniu indeksu, samo ponowne uruchomienie serwera nie rozwiązuje naszego problemu; MongoDB pobierze kompilację indeksu od miejsca, w którym została przerwana. Jeśli wcześniej po ponownym uruchomieniu uruchamiałeś kompilację indeksu w tle, teraz staje się ona kompilacją indeksu pierwszego planu, więc w takim przypadku ponowne uruchomienie może pogorszyć problem.
Jeśli już uruchomiłeś budowanie indeksu, jak go zatrzymać? Na szczęście zatrzymanie budowania indeksu jest stosunkowo łatwe.
Opcja 1:Zakończ proces budowania indeksu
Zlokalizuj proces budowania indeksu za pomocą db.currentOp(), a następnie zakończ operację za pomocą db.killOp(
{ "opid" : 820659355, "active" : true, "lockType" : "write", .... "op" : "insert", "ns" : "xxxx", "query" : { }, "client" : "xxxx", "desc" : "conn", "msg" : "index: (2/3) btree bottom up 292168587/398486401 64%" }
Jeśli węzeł, w którym budowany jest indeks, nie odpowiada na nowe połączenia lub killOp nie działa, użyj opcji 2 poniżej:
Opcja 2:Konfiguracja „noIndexBuildRetry” i ponowne uruchomienie
MongoDB udostępnia opcję „–noIndexBuildRetry”, która nakazuje MongoDB zaprzestanie tworzenia niekompletnych indeksów po ponownym uruchomieniu.
Ten parametr nie wydaje się być obsługiwany z pliku konfiguracyjnego, tylko jako parametr dla procesu mongod. Nie wolimy uruchamiać mongod ręcznie z tą opcją, ponieważ jeśli przypadkowo uruchomisz proces mongod jako użytkownik z podwyższonym poziomem uprawnień (np. root), kończy się to zmianą uprawnień do wszystkich plików. Ponadto, po uruchomieniu jako „root”, mieliśmy sporadyczne problemy z ponownym uruchomieniem procesu jako mongod.
Prostszą opcją jest edycja pliku /etc/init.d/mongod. Szuka tej linii:
OPTIONS=" -f $CONFIGFILE"
Zastąp tym wierszem:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
Szczegółowe kroki
Na potrzeby tej dyskusji podajemy instrukcje dla CentOS/RedHat/Amazon Linux.
-
Skonfiguruj „–noIndexBuildRetry”
Dodaj opcję „–noIndexBuildRetry” do wszystkich węzłów danych, jak wyjaśniono powyżej.
-
Uruchom ponownie wszystkie węzły budujące indeks
Spójrz na plik dziennika mongod dla każdego serwera danych i ustal, czy buduje indeks. Jeśli tak, zrestartuj serwer „service mongod restart”.
-
Upuść niekompletny indeks
Po ponownym uruchomieniu wszystkich odpowiednich węzłów spójrz na listę indeksów i upuść niekompletny indeks, jeśli widzisz go na liście.
-
Usuń „–noIndexBuildRetry”
Edytuj plik /etc/init.d/mongod, aby usunąć opcję –noIndexBuildRetry dodaną w kroku 1, abyśmy mogli powrócić do domyślnego zachowania wznawiania kompilacji indeksu.
W przypadku dalszych pytań skontaktuj się z nami pod adresem [email protected].
Miłego indeksowania!