Solr 5.2 – szybkie spojrzenie na mechanizm kopii zapasowych

Wraz z niedawną premierą Solr w wersji 5.2 oraz 5.2.1 dostaliśmy możliwość skorzystania z mechanizmu wykonywania kopii zapasowych przy pomocy API. Ze względu na to, że była to funkcjonalność na którą część użytkowników czekała już dość długo postanowiliśmy się jej przyjrzeć.

W celu przetestowania funkcjonalności przeprowadzimy bardzo prosty test:

  1. uruchomimy Solr w trybie rozproszonym,
  2. zaindeksujemy kilka dokumentów,
  3. zrobimy kopię zapasową,
  4. ponownie zaindeksujemy kilka dokumentów,
  5. postaramy się przywrócić kopię zapasową, którą wykonaliśmy w kroku 3

Zacznijmy więc.

Uruchomienie Solr

Pierwsze krok to uruchomienie Solr. W tym celu wykorzystaliśmy skrypt bin/solr i następującą komendę:

bin/solr -e cloud

Potrzebujemy jednej instancji SolrCloud oraz pustej kolekcji (najlepiej gettingstarted). Do testów potrzebujemy pojedynczego shard’a.

Sama topologia stworzonego przez nas klastra wygląda następująco:

Zrzut ekranu 2015-06-21 o 11.13.31

Indeksowanie danych

Zaindeksowanie danych jest równie proste. Ze względu na wykorzystanie przykładowej kolekcji gettinstarted możemy wysłać dane o dowolnej strukturze, a Solr postara się odpowiednio zmodyfikować schema.xml. Zaindeksowaliśmy całe dwa dokumenty korzystając z następującego polecenia:

curl 'localhost:8983/solr/gettingstarted/update?commit=true' -H 'Content-type:application/xml' --data-binary '
<add>
 <doc>
  <field name="id">1</field>
  <field name="name">Test document 1</field>
 </doc>
 <doc>
  <field name="id">2</field>
  <field name="name">Test document 2</field>
 </doc>
</add>'

Kopia zapasowa

Wykonanie kopii zapasowej jest tak samo proste, jak czynności, które wykonywaliśmy do tej pory. Wystarczy, że uruchomimy następującą komendę:

curl 'http://localhost:8983/solr/gettingstarted/replication?command=backup&name=test&location=/Users/gro/backup/'

Powyższa komenda poinformowała Solr, że chcemy wykonać kopię zapasową, nazwać ją snapshot.test (Solr dodaje wartość parametru name do nazwy snapshot.)  Sama kopia zapasowa, w przypadku braku określonej lokalizacji, zostanie stworzona w katalogu z danymi. Oczywiście możemy podać inny katalog za pomocą parametru location (tak jak w powyższym przykładzie), który może być zarówno ścieżką względną (do katalogu z danymi Solr), jak i bezwzględną.

Odpowiedź Solr będzie szybka i podobna do następującej:

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <lst name="responseHeader"><int name="status">0</int><int name="QTime">2</int></lst><str name="status">OK</str>
</response>

W przypadku, kiedy nasza kolekcja jest duża, czas tworzenia kopii zapasowej będzie oczywiście odpowiednio dłuższy. Jeżeli chcemy sprawdzać, jaki jest postęp wystarczy uruchomienie następującej komendy:

curl 'http://localhost:8983/solr/gettingstarted/replication?command=details'

Ponowna indeksacja

Kolejnym krokiem naszego, prostego testu jest indeksacja kolejnych dwóch dokumentów przy pomocy następującej komendy:

curl 'localhost:8983/solr/gettingstarted/update?commit=true' -H 'Content-type:application/xml' --data-binary '
<add>
 <doc>
  <field name="id">3</field>
  <field name="name">Test document 3</field>
 </doc>
 <doc>
  <field name="id">4</field>
  <field name="name">Test document 4</field>
 </doc>
</add>'

Po tej operacji, jeżeli uruchomilibyśmy następującą komendę:

curl 'localhost:8983/solr/gettingstarted/select?q=*:*&rows=0&indent=true'

Solr poinformuje nas, że w naszej kolekcji są cztery dokumenty:

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">6</int>
  <lst name="params">
   <str name="q">*:*</str>
   <str name="indent">true</str>
   <str name="rows">0</str>
  </lst>
 </lst>
 <result name="response" numFound="4" start="0" maxScore="1.0">
 </result>
</response>

Przywrócenie kopii zapasowej

Postarajmy się zatem przywrócić naszą kopię zapasową i zobaczmy ile dokumentów będzie widzieć Solr. W tym celu uruchamiamy następującą komendę:

curl 'http://localhost:8983/solr/gettingstarted/replication?command=restore&name=test&location=/Users/gro/backup/'

Solr zwrócił następującą odpowiedź:

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <lst name="responseHeader"><int name="status">0</int><int name="QTime">2</int></lst><str name="status">OK</str>
</response>

Zatem sprawdźmy co Solr zwróci na nasze proste zapytanie:

curl 'localhost:8983/solr/gettingstarted/select?q=*:*&rows=0&indent=true'
<?xml version="1.0" encoding="UTF-8"?>
<response>
 <lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">0</int>
  <lst name="params">
   <str name="q">*:*</str>
   <str name="indent">true</str>
   <str name="rows">0</str>
  </lst>
 </lst>
 <result name="response" numFound="2" start="0">
 </result>
</response>

Jak widać Solr poprawnie przywrócił kopię zapasową i znów mamy dwa dokumenty w naszej kolekcji.

Podsumowanie

Jak widać mechanizm działa poprawnie, należy jednak pamiętać o kilku rzeczach. W przypadku instalacji kilku instancji Solr na tej samej maszynie, lepiej unikać wykonywania kopii zapasowych do katalogu bezwzględnego (można nadpisać sobie dane). Poza tym, fajnie jest móc mieć w pełni zabezpieczone dane 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *