2012-10-25 16 views
8

Mam Solr z wieloma rdzeniami. Z powodu dużego obciążenia chcę skonfigurować urządzenie podrzędne zawierające dokładnie te same indeksy.Jak skonfigurować replikację Solr z wieloma rdzeniami?

W dokumentacji http://wiki.apache.org/solr/SolrReplication podano "Dodaj procedurę obsługi żądania replikacji do pliku solrconfig.xml dla każdego rdzenia", ale mam tylko jeden plik solrconfig.xml.

Moja konfiguracja:
Config: Pliki/data/solr/web/solr/conf/config
Dane:/data/solr/data/solr/podstawowe katalogi danych

Czy to naprawdę konieczne, aby skopiować plik solrconfig.xml dla każdego rdzenia?
Gdzie powinienem umieścić te wiele plików solrconfig?

solr.xml

<?xml version="1.0" encoding="UTF-8" ?> 
    <solr persistent="true"> 
    <property name="dih.username" value="user"/> 
    <property name="dih.password" value="passwd"/> 
    <property name="jdbclib" value="/usr/progress/dlc102b/java"/> 
    <property name="dih.dburl" value="jdbc:datadirect:openedge://172.20.7.218:31380;databaseName=easource"/> <cores adminPath="/admin/cores"> 
    <core instanceDir="/data/solr/web/trunk/" name="product" dataDir="/data/solr/data/trunk/product-swap"> 
     <property name="dih-config" value="dih-config-product.xml"/> 
    </core> 
    <core instanceDir="/data/solr/web/trunk/" name="product-swap" dataDir="/data/solr/data/trunk/product"> 
     <property name="dih-config" value="dih-config-product.xml"/> 
    </core> 
    <core instanceDir="/data/solr/web/trunk/" name="periodp" dataDir="/data/solr/data/trunk/periodp"> 
     <property name="dih.config" value="dih-config-periodp.xml"/> 
    </core> 
    <core instanceDir="/data/solr/web/trunk/" name="periodp-swap" dataDir="/data/solr/data/trunk/periodp-swap"> 
     <property name="dih.config" value="dih-config-periodp.xml"/> 
    </core> 
    </cores> 
</solr> 
+0

Czy możesz opublikować swój plik 'solr.xml', w którym skonfigurowałeś swoje rdzenie? – javanna

+0

Dodałem solr.xml – DionS

+0

Dzięki, dokładnie to, co myślałem. Spójrz na moją odpowiedź. – javanna

Odpowiedz

16

Należy skopiować egzemplarz instancji Solr na serwerze podrzędnym i skonfigurować procedurę obsługi replikacji na komputerze solrconfig.xml. Najlepiej jest mieć inny katalog instanceDir dla każdego rdzenia, ponieważ zazwyczaj każdy rdzeń ma swój własny schema.xml i solrconfig.xml. W każdym razie można używać tego samego conf tylko konfigurowania solr.xml zwrócić do tej samej instanceDir ale innym dataDir, które zostało skonfigurowane jako dataDir w solrconfig.xml także:

<solr persistent="true" sharedLib="lib"> 
    <cores adminPath="/admin/cores"> 
     <core name="core0" instanceDir="core"> 
      <property name="dataDir" value="/data/core0" /> 
     </core> 
     <core name="core1" instanceDir="core"> 
      <property name="dataDir" value="/data/core1" /> 
     </core> 
    </cores> 
</solr> 

ta powinna być sytuacja, gdy masz aktualnie wielokrotność rdzenie, ale pojedynczy solrconfig.xml.

Sekcja replikacji na urządzeniach slave musi zawierać adres URL urządzenia master, w tym nazwę rdzenia, która oczywiście różni się dla każdego rdzenia. Ale można użyć zastępczy $ {solr.core.name} takiego:

<requestHandler name="/replication" class="solr.ReplicationHandler" > 
    <lst name="slave"> 
     <str name="masterUrl">http://master_host:port/solr/${solr.core.name}/replication</str> 
     <str name="pollInterval">00:00:20</str> 
    </lst> 
</requestHandler> 

W rzeczywistości, niektóre właściwości, takie jak solr.core.name są automatycznie dodawane do core scope i można odnieść się do nich w danej konfiguracji. W rezultacie sekcja replikacji może być taka sama dla każdego rdzenia, jeśli nie masz żadnych podstawowych ustawień rdzenia.

Ponadto, można użyć tej samej konfiguracji dla master and slave o następującej konfiguracji i wystarczy zmienić wartość (prawda lub fałsz), które można przypisać do zmiennych środowiskowych enable.master i enable.slave oparciu o to, co chcesz robić. Mam na myśli to, że możesz użyć tego samego pliku, ale oczywiście będzie on na różnych komputerach, ponieważ nie ma sensu posiadanie masterów i niewolników na tym samym komputerze.

<requestHandler name="/replication" class="solr.ReplicationHandler" > 
    <lst name="master"> 
     <str name="enable">${enable.master:false}</str> 
     <str name="replicateAfter">commit</str> 
    </lst> 
    <lst name="slave"> 
     <str name="enable">${enable.slave:false}</str> 
     <str name="masterUrl">http://master_host:8983/solr/${solr.core.name}/replication</str> 
     <str name="pollInterval">00:00:60</str> 
    </lst> 
</requestHandler> 
+0

Wielkie dzięki, mam to działa przy użyciu pliku solrcore.properties, który zawiera enable.master i enable.slave dla obu maszyn. – DionS

+0

Cieszę się, że moja odpowiedź pomogła, nie ma za co! – javanna

+0

Dziękuję za podany przykład, jest dla mnie bardzo pomocna. Używałem łącza sym wielokrotnych jednorodnych rdzeni (nie pytaj dlaczego, jest ŻĄDANIE od mojego klienta). I przekonaj się, że twoje rozwiązanie to uderzenie mordercy! – ajreal

1

Tak, trzeba mieć dokładnie taką samą kopię plików w każdej kopii rdzenia jesteś repliką.

Aby zwolnić jeszcze więcej instancji solr, proponuję mieć wzorzec używany tylko do indeksowania i 2 slaves, replikowane z master, używane do wysyłania zapytań do dokumentów.

+0

Dzięki, rozważę tę opcję, jeśli replikacja nadal nie jest wystarczająca. – DionS

Powiązane problemy