Kiedy należy commitować ?

Pytanie jakie ostatnio sobie zadałem, wydaje się jednym z tych na które odpowiedź powinna być szybka i bezproblemowa. Tak więc, kiedy należy wysyłać polecenie commit do Solr (lub Lucene) ? Pomimo prostoty pytania, odpowiedź nie jest moim zdaniem jednoznaczna.

Aby odpowiedzieć sobie na pytanie, kiedy należy wysyłać polecenie commit, należy przyjrzeć się kilku różnym wariantom indeksowania danych oraz jak szybko chcemy te dane udostępniać. Przyglądając się typowym wdrożeniom, którymi miałem do czynienia, można wyróżnić następujące kategorie:

Dane mogą być udostępnione jedynie po całkowitej aktualizacji indeksu

Sytuacja teoretycznie i praktycznie bardzo prosta. Commitujemy dopiero kiedy skończą się dokumenty do zaindeksowania.

Dane mogą być udostępniane partiami, bez konieczności czekania na pełną aktualizację indeksu

Tutaj mamy trzy możliwości:

  1. Jeżeli nie ma znaczenia czy dane będą udostępnianie partiami, czy nie możemy wysyłać polecenie commit dopiero po przesłaniu ostatniego dokuementu.
  2. Jeżeli chcemy udostępniać dane partiami, nasza aplikacja może wysłać polecenie commit co pewien czas.
  3. Jeżeli nie chcemy wysyłać polecenia commit z aplikacji, możemy powiedzieć, aby Solr robił to za nas, czyli po prostu skorzystać z mechanizmu autocommit.

Dane muszą być zaindeksowane najszybciej jak to możliwe

Jeżeli dane mają być indeksowane najszybciej jak to jest możliwe (pomijając w tym momencie temat sposobu indeksowania) należy wysyłać polecenie commit dopiero po przesłaniu wszystkich danych. Commit jest dość kosztowny pod względem wydajności i dlatego, w omawianym przypadku, powinien być stosowany jedynie na samym końcu procesu indeksacji.

Ważne jest, aby dane były publikowane jak najszybciej

Jest to chyba najtrudniejszy z wymienionych przypadków. Wszystko zależy od tego, jak szybko chcemy mieć dane widoczne na slave’ach. Na przykład w przypadku systemu CMS, kiedy użytkownik zapisuje edytowaną stronę, chcielibyśmy, aby jej zaktualizowana zawartość dostępna była od razu – wtedy commit po każdym dokumencie i szybka replikacja jest wskazana.W przypadku dodawania artykułów do sklepu internetowego, można pokusić się o pewne opóźnienie. Takie przypadki można mnożyć w nieskończoność. Należy jednak pamiętać o odpowiednim przygotowaniu zapytań rozgrzewających, aby Solr był przygotowany do obciążenia zapytaniami oraz o tym, aby nie replikować indeksów co 30 sekund, ponieważ może to być przyczyną problemów wydajnościowych.

Osoby zainteresowane bardzo częstą aktualizacją indeksu powinny obserwować to co się dzieje w Lucene i Solr odnośnie NRT (near real time).

Optymalizacja

Warto pamiętać też o optymalizacji indeksu. Jeżeli wysyłamy polecenie commit tylko raz, na zakończenie indeksowania warto zastanowić się, czy zamiast commit nie wysyłać optimize. Nasze slave’y dostaną wtedy zoptymalizowaną wersję indeksu z najnowszymi danymi. Należy jednak pamiętać, iż optymalizacja indeksu jest dłuższa, niż commit.

Niebezpieczeństwa

Warto pamiętać, iż odwlekanie operacji commit w nieskończoność wiąże się z niebezpieczeństwem utraty danych, które nie zostały fizycznie zapisane do plików indeksu. Oczywiście nic się z danymi nie stanie, jeżeli Solr zostanie poprawnie wyłączony, natomiast w przypadku awarii maszyny może się zdarzyć sytuacja, kiedy dane które indeksowaliśmy zostaną stracone.

Podsumowanie

Jak widać, nie ma jasnej odpowiedzi kiedy należy wysyłać polecenie commit ponieważ zależy to od sytuacji i indywidualnych potrzeb. Należy jednak pamiętać, iż czynności, jakie wykonywane są przez Lucene/Solr po wysłaniu polecenia commit są mocno zasobożerne. Nie korzystajmy z tego polecenia często ponieważ może się okazać, iż zamiast indeksować dane Lucene/Solr spędza większość czasu na przetwarzaniu polecenia commit.

 

 

Pomijając temat samego sposobu indeksowania

This entry was posted on poniedziałek, Czerwiec 27th, 2011 at 08:05 and is filed under Lucene, Solr, Tutorial. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.