<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>8.4.0 &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/8-4-0/feed/" rel="self" type="application/rss+xml" />
	<link>https://solr.pl</link>
	<description>All things to be found - Blog related to Apache Solr &#38; Lucene projects - https://solr.apache.org</description>
	<lastBuildDate>Sat, 14 Nov 2020 12:06:32 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Solr 8.4.0 &#8211; zarządzanie pluginami</title>
		<link>https://solr.pl/2020/04/13/solr-8-4-0-zarzadzanie-pluginami/</link>
					<comments>https://solr.pl/2020/04/13/solr-8-4-0-zarzadzanie-pluginami/#respond</comments>
		
		<dc:creator><![CDATA[Rafał Kuć]]></dc:creator>
		<pubDate>Mon, 13 Apr 2020 11:06:03 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[8.4.0]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[zarządzanie]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=812</guid>

					<description><![CDATA[Wraz z premierą Solr 8.4.0 dostajemy w nasze ręce nową funkcjonalność &#8211; zarządzanie dodatkami do Solr. Solr udostępnia nam możliwość instalowania oraz zarządzania dodatkami i repozytoriami dodatków. Spójrzmy zatem jak to działa. Zarządzanie pakietami, czyli co? Wraz z Solr 8.4.0]]></description>
										<content:encoded><![CDATA[
<p>Wraz z premierą Solr 8.4.0 dostajemy w nasze ręce nową funkcjonalność &#8211; zarządzanie dodatkami do Solr. Solr udostępnia nam  możliwość instalowania oraz zarządzania dodatkami i repozytoriami dodatków.  Spójrzmy zatem jak to działa. </p>



<span id="more-812"></span>



<h2 class="wp-block-heading">Zarządzanie pakietami, czyli co?</h2>



<p>Wraz z Solr 8.4.0 dostaliśmy nie tylko sam skrypt umożliwiający pobieranie i usuwanie pakietów. W ramach zmian dostaliśmy także cały pakiet zmian takich jak przechowywanie informacji o pakietach, zarządzanie kluczami, API do odczytu i zapisu oraz odizolowanie na poziomie classloadera. </p>



<p>Zacznijmy zatem od początku, uruchamiamy pojedynczą instancję SolrCloud następującym poleceniem:</p>



<pre class="wp-block-preformatted">$ bin/solr start -c -f -Denable.packages=true</pre>



<p>I zaczynamy zabawę pakietami.</p>



<h2 class="wp-block-heading">Podstawy zarządzania pakietami</h2>



<p>Po wpisaniu komendy:</p>



<pre class="wp-block-preformatted">$ bin/solr package </pre>



<p>Dostaniemy następujące informacje:</p>



<pre class="wp-block-preformatted">Found 1 Solr nodes:
 
Solr process 20949 running on port 8983
Package Manager

./solr package add-repo  
Add a repository to Solr.

./solr package install [:]
Install a package into Solr. This copies over the artifacts from the repository into Solr's internal package store and sets up classloader for this package to be used.

./solr package deploy [:] [-y] [--update] -collections &lt;package-name&gt;[:] [-y] [--update] -collections  [-p param1=value1 -p param2=value2 …
Bootstraps a previously installed package into the specified collections. It the package accepts parameters for its setup commands, they can be specified (as per package documentation).

./solr package list-installed
Print a list of packages installed in Solr.

./solr package list-available
Print a list of packages available in the repositories.

./solr package list-deployed -c 
Print a list of packages deployed on a given collection.

./solr package list-deployed 
Print a list of collections on which a given package has been deployed.

./solr package undeploy  -collections 
Undeploys a package from specified collection(s)

Note: (a) Please add '-solrUrl http://host:port' parameter if needed (usually on Windows).
      (b) Please make sure that all Solr nodes are started with '-Denable.packages=true' parameter.</pre>



<p>Jak widać mamy dostępnych całkiem sporo opcji, a sam mechanizm zarządzania pakietami weryfikuje działające instancje Solr i sprawdza pakiety na nich zainstalowane. </p>



<h2 class="wp-block-heading">Dodawanie nowego repozytorium</h2>



<p>W celu dodania nowego repozytorium musimy podać jego nazwę oraz jego lokalizację &#8211; URL pod którym można dostać się do repozytorium. Oczywiście w podanym repozytorium muszą znajdować się pliki, których Solr oczekuje &#8211; na przykład pliku <strong>repository.json</strong> wyglądający następująco (przykład z kodu źródłowego Solr):</p>



<pre class="wp-block-code"><code class="">[
  {
    "name": "question-answer",
    "description": "A natural language question answering plugin",
    "versions": [
      {
        "version": "1.0.0",
        "date": "2019-01-01",
        "artifacts": [
          {
            "url": "qarh-1.0.jar",
            "sig": "C9UWKkucmY3UNzqn0VLneVMe9kCbJjw7Urc76vGenoRwp32xvNn5ZIGZ7G34xZP7cVjqn/ltDlLWBZ/C3eAtuw=="
          }
        ],
        "manifest": {
          "version-constraint": "8 - 9",
          "plugins": [
            {
              "name": "request-handler",
              "setup-command": {
                "path": "/api/collections/${collection}/config",
                "payload": {"add-requesthandler": {"name": "${RH-HANDLER-PATH}", "class": "question-answer:fullstory.QARequestHandler"}},
                "method": "POST"
              },
              "uninstall-command": {
                "path": "/api/collections/${collection}/config",
                "payload": {"delete-requesthandler": "${RH-HANDLER-PATH}"},
                "method": "POST"
              },
              "verify-command": {
                "path": "/api/collections/${collection}/config/requestHandler?componentName=${RH-HANDLER-PATH}&amp;meta=true",
                "method": "GET",
                "condition": "$['config'].['requestHandler'].['${RH-HANDLER-PATH}'].['_packageinfo_'].['version']",
                "expected": "${package-version}"
              }
            }
          ],
          "parameter-defaults": {
            "RH-HANDLER-PATH": "/mypath"
          }
        }
      }
    ]
  }
]</code></pre>



<p>Spróbujmy zatem dodać nowe repozytorium za pomocą następującego polecenia oraz korzystając z plików dostępnych w <a href="https://github.com/apache/lucene-solr/tree/jira/solr-13662-3/solr/core/src/test-files/solr/question-answer-repository">kodzie źródłowym Solr</a>:</p>



<pre class="wp-block-code"><code class="">$ bin/solr package add-repo solrpl http://repo.solr.pl</code></pre>



<p>W przypadku poprawnego dodania repozytorium powinniśmy zobaczyć następujący komunikat:</p>



<pre class="wp-block-code"><code class="">Added repository: solrpl</code></pre>



<p><strong>Uwaga</strong>: w powyższym przykładzie skorzystałem z repozytorium do którego można się dostać bez SSL &#8211; proszę, nie powtarzajcie tego. Nie jest to dobra praktyka ze względu na możliwość ataków typu <em>man in the middle</em> i podmiany plików pobieranych z repozytorium.</p>



<h2 class="wp-block-heading">Instalowanie i usuwanie pakietów</h2>



<p>Po dodaniu repozytorium możemy sprawdzić listę pakietów jakie mamy dostępne. Aby to zrobić uruchamiamy polecenie:</p>



<pre class="wp-block-code"><code class="">$ bin/solr package list-available</code></pre>



<p>W odpowiedzi powinniśmy dostać następujące informacje:</p>



<pre class="wp-block-code"><code class="">Available packages:
-----
question-answer 		A natural language question answering plugin
	Version: 1.0.0</code></pre>



<p>Przed instalacją pakietów musimy jeszcze dodać klucz publiczny, za pomocą którego Solr będzie w stanie zweryfikować pliki związane z pakietami. Gdzie szukać takiego klucza? W repozytorium lub u dostawcy pakietów <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Mając już klucz możemy go zainstalować następującym poleceniem:</p>



<pre class="wp-block-code"><code class="">$ bin/solr package add-key publickey.der</code></pre>



<p>Mając te dane oraz dodany klucz możemy zacząć instalować pakiety. To dość proste, wystarczy nam następujące polecenie:</p>



<pre class="wp-block-code"><code class="">$ bin/solr package install question-answer:1.0.0</code></pre>



<p>Odpowiedź powinna być następująca:</p>



<pre class="wp-block-code"><code class="">Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":66}}
question-answer installed.</code></pre>



<p>Oznacza to, iż nasz pakiet jest gotowy do wykorzystania. Musimy wybrać kolekcję oraz uruchomić polecenie <em>deploy</em>, np w następujący sposób:</p>



<pre class="wp-block-code"><code class="">$ bin/solr package deploy question-answer:1.0.0 -collections test</code></pre>



<p>Tym razem odpowiedź Solr była następująca:</p>



<pre class="wp-block-code"><code class="">Executing {"add-requesthandler":{"name":"/mypath","class":"question-answer:fullstory.QARequestHandler"}} for path:/api/collections/test/config
Execute this command (y/n):
y
Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/mypath&amp;meta=true for collection:test
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "config":{"requestHandler":{"/mypath":{
        "name":"/mypath",
        "class":"question-answer:fullstory.QARequestHandler",
        "_packageinfo_":{
          "package":"question-answer",
          "version":"1.0.0",
          "files":["/package/question-answer/1.0.0/question-answer-request-handler-1.0.jar"],
          "manifest":"/package/question-answer/1.0.0/manifest.json",
          "manifestSHA512":"a91ab5a2c5abd53f0f72c256592c2be8b667cecb8226ac054aeed4d28aac9d743311442f2d58539bb83663a19bd1efb310aaadfd77bea458f3d475161721a114"}}}}}

Actual: 1.0.0, expected: 1.0.0
Deployed on [test] and verified package: question-answer, version: 1.0.0
Deployment successful</code></pre>



<p>Jeżeli wszystko poszło tak, jak się spodziewaliśmy oraz odpowiedzieliśmy, iż chcemy dodać pakiet do kolekcji jesteśmy gotowi <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </p>



<p>Gdy chcemy pozbyć się niechcianych pakietów wystarczy wysłać do Solr polecenie <em>undeploy</em> wraz z nazwą kolekcji oraz pakietem z którego nie chcemy już więcej korzystać. Na przykład, jeżeli nie chcemy już korzystać z pakietu, który dodaliśmy wcześniej wystarczy następujące polecenie:</p>



<pre class="wp-block-code"><code class="">$ bin/solr package undeploy question-answer -collections test</code></pre>



<p>W tym wypadku odpowiedź będzie następująca:</p>



<pre class="wp-block-code"><code class="">Executing {"delete-requesthandler":"/mypath"} for path:/api/collections/test/config</code></pre>



<h2 class="wp-block-heading">Jak to naprawdę działa?</h2>



<p>Całość zaimplementowanego mechanizmu kręci się tak naprawdę wokół ładowania klas. Mechanizm zakłada, iż jakakolwiek zmiana w plikach znajdujących się w <em>classpath</em> Solr wymaga restartu serwera. Wszystkie inne pliki mogą być ładowane dynamicznie i związane są z konfiguracją, która trzymana jest w Zookeeper. </p>



<p>U podstaw całego mechanizmu znajduje się tak zwany <em>Package Store</em>. Rozproszony system plików, który trzyma swoje dane na każdej z instancji Solr w katalogu <em>$SOLR_HOME/filestore</em>, a każdy plik opisany jest za pomocą metadanych trzymanych w pliku JSON. Meta dane pliku przechowują sumę kontrolną pliku pozwalając tym samym na weryfikację. </p>



<p>Na tym wszystkim zbudowane jest API pozwalające na zarządzanie pojedynczymi plikami, jak również całymi pakietami &#8211; np. instalowanie pakietów, czy ich uruchamianie dla poszczególnych kolekcji. </p>



<h2 class="wp-block-heading">API</h2>



<p>Oczywiście <strong>bin/solr</strong> oraz instalowanie pakietów z poziomu tego narzędzia to nie wszystko co oferuje Solr. Do dyspozycji dostaliśmy także API pozwalające na:</p>



<ul class="wp-block-list"><li>dodawanie plików do Solr za pomocą metody PUT protokołu HTTP z wykorzystaniem <strong>/api/cluster/files/{ścieżka_do_pliku}</strong></li><li>pobieranie plików za pomocą metody GET protokołu HTTP z wykorzystaniem <strong>/api/cluster/files/{ścieżka_do_pliku}</strong> </li><li>pobieranie meta danych o danym pliku za pomocą metody GET protokołu HTTP z wykorzystaniem <strong>/api/cluster/files/{ścieżka_do_pliku}?meta=true</strong></li><li>pobieranie dostępnych plików w ramach podanej ścieżki za pomocą metody GET protokołu HTTP z wykorzystaniem <strong>/api/cluster/files/{ścieżka_do_katalogu}</strong></li></ul>



<p>Warto pamiętać, iż dodanie pliku to nie tylko same wysłanie go do Solr, należy go najpierw podpisać kluczem, który dostępny jest dla Solr. Oficjalna dokumentacja Solr pokazuje, jak to zrobić: <a href="https://lucene.apache.org/solr/guide/8_5/package-manager-internals.html">https://lucene.apache.org/solr/guide/8_5/package-manager-internals.html</a>. </p>



<p>Jednak API do instalowania plików i ich pobierania to nie wszystko. Mamy także możliwość dodawania, usuwania oraz pobierania pakietów i ich wersji, czyli:</p>



<ul class="wp-block-list"><li>GET na <strong>/api/cluster/package</strong> w celu pobrania listy pakietów</li><li>PUT na <strong>/api/cluster/package</strong> w celu dodania pakietu</li><li>DELETE na <strong>/api/cluster/package</strong> w celu usunięcia pakietu</li></ul>



<p>Na przykład dodanie pakietu do Solr mogłoby odbyć się za pomocą następującego polecenia:</p>



<pre class="wp-block-code"><code class="">curl -XPUT 'http://localhost:8983/api/cluster/package' -H 'Content-type:application/json' -d  '{
 "add": {
  "package" : "testsolrpl",
  "version" : "1.0.0",
  "files" : [
   "/test/solrpl/1.0.0/testsolrpl.jar"
  ]
 }
}'</code></pre>



<h2 class="wp-block-heading">Bezpieczeństwo</h2>



<p>Korzystanie z elastyczności, jaką daje <em>hot-deploy</em> oraz możliwość instalowania pakietów rozszerzających możliwości Solr w dowolnym momencie niesie ze sobą szereg niebezpieczeństw. Ze względu na to nie powinniśmy instalować pakietów ze źródeł, których nie znamy lub nie jesteśmy pewni co się w nich znajduje. Warto też pamiętać o korzystaniu tylko z tych repozytoriów, które dodaliśmy  z wykorzystaniem SSL co zapobiegnie atakom typu <em>man in the middle</em>. Oczywiście wszystko to powinno być także poprzedzone normalnym zabezpieczeniem Solr &#8211; np. brakiem możliwości dostania się do Solr z zewnątrz. </p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Funkcjonalność instalowania pakietów bez konieczności manualnego wgrywania ich na każdy z serwerów, bez konieczności ponownego uruchamiania Solr, możliwość zarządzania nimi za pomocą API oraz weryfikacja samych plików binarnych jest bardzo fajną funkcjonalnością i przyda się niektórym użytkownikom. Należy jednak pamiętać, iż elastyczność niesie za sobą pewne niebezpieczeństwo. Jeżeli jednak pamiętamy z jakimi ograniczeniami i potencjalnymi problemami możemy mieć do czynienia nie powinniśmy obawiać się korzystania z opisanej funkcjonalności. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2020/04/13/solr-8-4-0-zarzadzanie-pluginami/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
