2012-10-25 8 views
8

Ich habe Solr mit mehreren Kernen ausgeführt. Wegen der hohen Last möchte ich einen Slave einrichten, der exakt dieselben Indizes enthält.Wie konfiguriere ich Solr-Replikation mit mehreren Kernen

Die Dokumentation http://wiki.apache.org/solr/SolrReplication gibt an: "Fügen Sie den Replikationsanforderungshandler zu solrconfig.xml für jeden Kern hinzu", aber ich habe nur eine solrconfig.xml.

Meine Konfiguration:
Config:/data/Solr/web/Solr/conf/config Dateien
Daten:/data/Solr/data/Solr/Kerndaten dirs

Ist es wirklich notwendig zu kopieren die solrconfig.xml für jeden Kern?
Und wo sollte ich diese mehreren solrconfig-Dateien?

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

Können Sie Ihre 'solr.xml' veröffentlichen, wo Sie Ihre Kerne konfiguriert haben? – javanna

+0

Ich habe solr.xml hinzugefügt – DionS

+0

Danke, genau was ich dachte. Schau dir meine Antwort an. – javanna

Antwort

16

Sie müssen die solr-Instanz, die Sie auf dem Slave-Server haben, kopieren und den Replikationshandler auf solrconfig.xml konfigurieren. Es ist die beste Praxis, ein anderes instanceDir Verzeichnis für jeden Kern zu haben, da normalerweise jeder Kern seine eigenen schema.xml und solrconfig.xml hat. Auf jeden Fall können Sie die gleiche conf nur Ihre solr.xml Konfiguration verwenden, um die gleiche instanceDir zu zeigen, aber eine andere dataDir, die Sie als dataDir in Ihrem solrconfig.xml konfigurieren sowie:

<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> 

Ist dies Ihre Situation sein sollte, wenn Sie derzeit mehrere haben Kerne aber eine einzige solrconfig.xml.

Der solrconfig.xml Replikationsabschnitt auf den Slaves muss die URL des Masters enthalten, einschließlich des Kernnamens, der natürlich für jeden Kern unterschiedlich ist. Aber Sie können die Platzhalter $ verwenden {solr.core.name} wie folgt aus:

<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> 

In der Tat sind einige Eigenschaften wie solr.core.name automatisch hinzugefügt, um die core scope und Sie können sie in Ihrer Konfiguration beziehen. Daher kann der Replikationsabschnitt für jeden Kern derselbe sein, wenn Sie keine kernspezifischen Einstellungen haben.

Darüber hinaus könnten Sie die gleiche Konfiguration für master and slave mit der folgenden Konfiguration verwenden und ändern Sie einfach den Wert (wahr oder falsch), die Sie an den Umgebungsvariablen zuweisen enable.master und enable.slave auf, was Sie tun wollen. Ich meine, dass Sie die gleiche Datei verwenden können, aber natürlich wird es auf verschiedenen Maschinen sein, da es nicht sehr sinnvoll wäre, Master und Slaves auf demselben Rechner zu haben.

<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

Vielen Dank, ich habe es funktioniert mit solrcore.properties Datei, die enable.master und enable.slave für beide Maschinen enthält. – DionS

+0

Froh, dass meine Antwort geholfen hat, gern geschehen! – javanna

+0

Vielen Dank für das Beispiel, das Sie gegeben haben, ist wirklich hilfreich für mich. Ich benutze Sym Link mehrere homogene Kerne (Dun fragen warum, ist die Anfrage von meinem Client). Und finden Sie heraus, Ihre Lösung ist der Killer Punch! – ajreal

1

Ja, Sie müssen genau die gleiche Kopie der Dateien in jeder Kopie des Kerns replizieren Sie haben.

Um noch mehr Ihre solr-Instanzen zu entladen, schlage ich vor, dass Sie einen Master nur für die Indexierung und 2 Slaves verwenden, die vom Master repliziert werden, um Ihre Dokumente abzufragen.

+0

Danke, ich werde diese Option auch prüfen, wenn die Replikation immer noch nicht ausreicht. – DionS

Verwandte Themen