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:
- uruchomimy Solr w trybie rozproszonym,
- zaindeksujemy kilka dokumentów,
- zrobimy kopię zapasową,
- ponownie zaindeksujemy kilka dokumentów,
- 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:
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 😉