【问题标题】:How do I configure Solr replication with multiple cores如何配置具有多个核心的 Solr 复制
【发布时间】:2012-10-15 10:40:47
【问题描述】:

我让 Solr 运行多核。 由于负载很重,我想设置一个包含完全相同索引的从站。

文档http://wiki.apache.org/solr/SolrReplication 声明“将复制请求处理程序添加到每个核心的 solrconfig.xml”,但我只有一个 solrconfig.xml。

我的配置:
配置:/data/solr/web/solr/conf/config 文件
数据:/data/solr/data/solr/core 数据目录

真的有必要为每个内核复制 solrconfig.xml 吗?
我应该把这些多个 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>

【问题讨论】:

  • 你能把你的solr.xml贴在你配置核心的地方吗?
  • 谢谢,正是我的想法。看看我的回答。

标签: solr replication


【解决方案1】:

您需要做的是复制您在从属服务器上的 solr 实例,并在 solrconfig.xml 上配置复制处理程序。 最佳实践是为每个内核设置不同的instanceDir 目录,因为通常每个内核都有自己的schema.xmlsolrconfig.xml。无论如何,您可以使用相同的配置,只需将您的solr.xml 配置为指向相同的instanceDir,但不同的dataDir,您也可以在solrconfig.xml 中将其配置为dataDir

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

如果您当前有多个内核但只有一个 solrconfig.xml,这应该是您的情况。

slave上的solrconfig.xml复制部分需要包含master的url,包括核心名称,当然每个核心都不一样。但是您可以像这样使用占位符 ${solr.core.name}:

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

实际上,solr.core.name 等一些属性会自动添加到core scope 中,您可以在配置中引用它们。因此,如果您没有任何特定于核心的设置,则每个核心的复制部分都可以相同。

此外,您可以通过以下配置为 master and slave 使用相同的配置,并根据您想要执行的操作更改分配给环境变量 enable.masterenable.slave 的值(true 或 false) .我的意思是你可以使用同一个文件,但当然它会在不同的机器上,因为在同一台机器上拥有 master 和 slave 没有多大意义。

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

【讨论】:

  • 非常感谢,我使用包含 enable.master 和 enable.slave 的 solrcore.properties 文件让两台机器都能正常工作。
  • 感谢您提供的示例,对我很有帮助。我一直在使用 sym link 多个同构核心(不问为什么,是我客户的请求)。并找出你的解决方案是杀手锏!
  • 真的很高兴它有帮助!感谢您的反馈!
【解决方案2】:

是的,您需要在要复制的每个内核副本中拥有完全相同的文件副本。

要卸载更多的 solr 实例,我建议您有一个仅用于索引的主服务器和 2 个从主服务器复制的从服务器,用于查询您的文档。

【讨论】:

  • 谢谢,如果复制还不够,我也会考虑这个选项。
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多