Solr配置:solr.xml配置详解

Solr配置:solr.xml配置详解

solr.xml文件定义了一些适用于所有或多个核心的全局配置选项。

本节将描述Solr附带的默认solr.xml文件以及如何根据需要修改它。有关如何配置core.properties的详细信息,请参见核心发现部分。

定义solr.xml

您可以在$SOLR_HOME目录(通常是server/solr/var/solr/data)中找到solr.xml,或者在使用SolrCloud时可选地在ZooKeeper中找到。如果找不到$SOLR_HOME/solr.xml,Solr将使用默认的solr.xml文件。

警告: 从ZooKeeper加载solr.xml已弃用,在未来版本中将不受支持。作为Solr的节点配置,此文件必须在早期启动时可用,并且也允许节点之间不同。

默认的solr.xml文件位于$SOLR_TIP/server/solr/solr.xml,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<solr>

<int name="maxBooleanClauses">${solr.max.booleanClauses:1024}</int>
<str name="sharedLib">${solr.sharedLib:}</str>
<str name="modules">${solr.modules:}</str>
<str name="allowPaths">${solr.allowPaths:}</str>
<str name="allowUrls">${solr.allowUrls:}</str>
<str name="hideStackTrace">${solr.hideStackTrace:false}</str>

<solrcloud>

<str name="host">${host:}</str>
<int name="hostPort">${solr.port.advertise:0}</int>
<str name="hostContext">${hostContext:solr}</str>

<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>

<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>
<int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>
<str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
<str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
<str name="zkCredentialsInjector">${zkCredentialsInjector:org.apache.solr.common.cloud.DefaultZkCredentialsInjector}</str>
<bool name="distributedClusterStateUpdates">${distributedClusterStateUpdates:false}</bool>
<bool name="distributedCollectionConfigSetExecution">${distributedCollectionConfigSetExecution:false}</bool>
<int name="minStateByteLenForCompression">${minStateByteLenForCompression:-1}</int>
<str name="stateCompressor">${stateCompressor:org.apache.solr.common.util.ZLibCompressor}</str>

</solrcloud>

<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
<int name="socketTimeout">${socketTimeout:600000}</int>
<int name="connTimeout">${connTimeout:60000}</int>
</shardHandlerFactory>

<metrics enabled="${metricsEnabled:true}">
<!--reporter name="jmx_metrics" group="core" class="org.apache.solr.metrics.reporters.SolrJmxReporter"/-->
</metrics>

</solr>

如您所见,发现Solr配置是”SolrCloud友好”的。但是,<solrcloud>元素的存在并意味着Solr实例正在SolrCloud模式下运行。除非在启动时指定了-DzkHost-DzkRun,否则此部分将被忽略。

solr.xml参数

<solr>元素

<solr>标签中没有您可以指定的属性,它是solr.xml的根元素。下面的表列出了solr.xml中每个XML元素的子节点。

configSetService

  • 可选参数,默认值:configSetService
  • 此属性不需要设置
  • 如果使用,此属性应设置为继承自ConfigSetService的类的FQN(完全限定名),您必须提供一个带有类型为org.apache.solr.core.CoreContainer的参数的构造函数
  • 例如,<str name="configSetService">com.myorg.CustomConfigSetService</str>
  • 如果未设置此属性,Solr使用默认configSetService,有ZooKeeper意识的org.apache.solr.cloud.ZkConfigSetService,无ZooKeeper意识的org.apache.solr.core.FileSystemConfigSetService

adminHandler

  • 可选参数,默认值:org.apache.solr.handler.admin.CoreAdminHandler
  • 此属性不需要设置
  • 如果使用,此属性应设置为继承自CoreAdminHandler的类的FQN
  • 例如,<str name="adminHandler">com.myorg.MyAdminHandler</str>会配置自定义管理处理器(MyAdminHandler)来处理管理请求
  • 如果未设置此属性,Solr使用默认管理处理器org.apache.solr.handler.admin.CoreAdminHandler

coreAdminHandlerActions

  • 可选参数,默认值:无
  • 此属性不需要设置
  • 如果定义,它应包含要在CoreAdminHandler中注册的自定义操作列表
  • 列表的每个条目应为str类型,其中条目名称定义操作名称,值是继承自CoreAdminOp的操作类的FQN
  • 例如,操作可以这样定义:
1
2
3
4
<coreAdminHandlerActions>
<str name="foo">com.example.FooAction</str>
<str name="bar">com.example.BarAction</str>
</coreAdminHandlerActions>

定义自定义操作后,可以使用其名称调用它们:

1
http://localhost:8983/solr/admin/cores?action=foo

collectionsHandler

  • 可选参数,默认值:org.apache.solr.handler.admin.CollectionsHandler
  • 如上,用于自定义CollectionsHandler实现

infoHandler

  • 可选参数,默认值:org.apache.solr.handler.admin.InfoHandler
  • 如上,用于自定义InfoHandler实现

coreLoadThreads

  • 可选参数,默认值:无
  • 指定将分配用于并行加载核心的线程数

replayUpdatesThreads

  • 可选参数,默认值:见描述
  • 指定将分配用于并行重放更新的线程数
  • 此池为节点的所有核心共享
  • 默认值等于处理器数量

indexSearcherExecutorThreads

  • 可选参数,默认值:0
  • 指定将分配用于搜索查询的线程数
  • -1表示可用的总处理器线程数

coreRootDirectory

  • 可选参数,默认值:server/solr
  • 核心发现树的根,默认为$SOLR_HOME

coresLocator

  • 可选参数,默认值:org.apache.solr.core.CorePropertiesLocator
  • 此属性不需要设置
  • 如果使用,此属性应设置为实现CoresLocator的类的FQN,您必须提供一个带有类型为org.apache.solr.core.NodeConfig的参数的构造函数
  • 例如,<str name="coresLocator">com.myorg.CustomCoresLocator</str>会配置自定义核心定位器

coreSorter

  • 可选参数,默认值:org.apache.solr.core.CoreSorter
  • 此属性不需要设置
  • 如果使用,此属性应设置为实现CoreSorter的类的FQN,您必须提供一个带有类型为org.apache.solr.core.CoreContainer的参数的构造函数
  • 此服务在Solr启动时用于优先确定应首先加载哪些核心

managementPath

  • 可选参数,默认值:无
  • 目前不可操作

sharedLib

  • 可选参数,默认值:无
  • 指定将在所有核心间共享的公共库目录的路径
  • 此目录中的任何JAR文件都将添加到Solr插件的搜索路径中
  • 如果指定的路径不是绝对路径,它将相对于$SOLR_HOME
  • 自定义处理器可以放置在此目录中
  • 注意,指定sharedLib不会从Solr的类路径中删除$SOLR_HOME/lib

modules

  • 可选参数,默认值:无
  • 接受要在启动时启用的捆绑Solr模块列表
  • 这种添加模块的方式将它们添加到共享类加载器,使它们对Solr中的每个集合可用,与solrconfig.xml中仅适用于该集合的<lib>标签不同
  • 示例值:extracting,ltr
  • 有关更多详细信息,请参见Solr模块章节

allowPaths

  • 可选参数,默认值:无
  • Solr通常只会访问相对于$SOLR_HOME$SOLR_DATA_HOMEcoreRootDir的文件夹
  • 如果您需要在这些路径之外创建核心,您可以使用allowPaths显式允许路径
  • 它是一个逗号分隔的文件系统路径字符串以允许
  • 特殊值*将允许系统上的任何路径

allowUrls

  • 可选参数,默认值:见描述
  • 逗号分隔的要允许的Solr主机列表
  • 可以省略HTTP/HTTPS协议,仅检查主机和端口,即10.0.0.1:8983/solr,10.0.0.1:8984/solr
  • 在运行Solr作为用户管理集群并使用shards参数时,需要特别配置主机列表作为允许列表,否则Solr将禁止请求
  • 在SolrCloud模式下,允许列表会自动配置为包括集群中的所有活动节点
  • 允许列表也可以在solr.in.sh / solr.in.cmd中使用solr.allowUrls系统属性配置
  • 如果您需要为向后兼容性禁用此功能,可以设置系统属性solr.disable.allowUrls=true

hideStackTrace

  • 可选参数,默认值:无
  • 当此属性设置为true时,Solr在发生错误的情况下不会在HTTP响应中返回任何堆栈跟踪
  • 默认情况下(false),堆栈跟踪仅对可预测的Solr异常隐藏,但对意外异常(即HTTP 500)在响应中返回

shareSchema

  • 可选参数,默认值:无
  • 此属性设置为true时,确保指向相同Schema资源文件的多个核心将引用相同的IndexSchema对象
  • 共享IndexSchema对象使加载核心更快
  • 如果您使用此功能,请确保在Schema文件中不使用核心特定的属性

transientCacheSize

  • 可选参数,默认值:无
  • 自9.2起弃用。 定义在为需要的核心卸载未使用核心之前可以加载多少个具有transient=true的Solr核心

configSetBaseDir

  • 可选参数,默认值:$SOLR_HOME/configsets
  • 可以找到Solr核心配置集的目录

maxBooleanClauses

  • 可选参数,默认值:见描述
  • 设置任何查询中允许的最大(嵌套)子句数
  • 此全局限制对任何集合的任何查询中允许的总子句数提供安全约束——无论这些子句是在查询字符串中显式指定的,还是基于索引中的术语从更复杂类型查询的查询扩展/重写的结果
  • 此限制在Lucene的多个点强制执行,既防止构造具有过多子句数的原始查询对象(主要是BooleanQuery)以可能耗尽JVM堆的方式,也确保没有复合查询(由多个原始查询组成)可以以可能导致搜索线程使用过多CPU的方式执行具有过多嵌套子句数
  • 在默认配置中,此属性使用solr.max.booleanClauses系统属性的值(如果指定)
  • 这是_default配置集中用于solrconfig.xml<maxBooleanClauses>元素的相同系统属性,使Solr管理员可以轻松增加两个值(在所有集合中),而无需搜索和更新所有配置
1
<maxBooleanClauses>${solr.max.booleanClauses:1024}</maxBooleanClauses>

hiddenSysProps

  • 可选参数,默认值:见描述
  • 用于匹配应被编辑以隐藏敏感信息的sysProps的正则表达式模式的逗号分隔列表
  • 允许列表也可以使用solr.hiddenSysProps系统属性或通过SOLR_HIDDEN_SYS_PROPS环境变量配置
  • 默认情况下,Solr将隐藏所有basicAuth、AWS、ZK或SSL秘密sysProps
  • 它还将隐藏任何包含”password”或”secret”的sysProp

<solrcloud>元素

此元素定义了与SolrCloud相关的几个参数。除非Solr实例以-DzkRun-DzkHost启动,否则此部分将被忽略。

distribUpdateConnTimeout

  • 可选参数,默认值:无
  • 用于设置集群内更新的底层connTimeout

distribUpdateSoTimeout

  • 可选参数,默认值:无
  • 用于设置集群内更新的底层socketTimeout

host

  • 可选参数,默认值:无
  • Solr用于访问核心的主机名

hostContext

  • 可选参数,默认值:无
  • URL上下文路径

hostPort

  • 可选参数,默认值:${solr.port.advertise:0}
  • Solr用于访问核心并通过liveNodes宣传Solr节点位置的端口
  • 此选项仅在Solr实例侦听的端口与希望其他节点联系它的端口不同时才需要
  • 例如,如果Solr节点在代理后面运行或在允许端口映射的云环境(如Kubernetes)中运行
  • hostPort是Solr实例希望其他节点联系它的端口
  • 在默认的solr.xml文件中,这设置为${solr.port.advertise:0}
  • 如果没有通过solr.xml传递端口(即0),则Solr将默认为jetty正在侦听的端口,由${jetty.port}定义

leaderVoteWait

  • 可选参数,默认值:无
  • 当SolrCloud启动时,每个Solr节点在假设任何未报告的节点都已关闭之前,等待找到该分片的所有已知副本的时间

leaderConflictResolveWait

  • 可选参数,默认值:180000毫秒
  • 当试图为分片选举领导者时,此属性设置副本等待看到冲突状态信息解决的最大时间
  • 在进行滚动重启时,特别是重启托管Overseer的节点时,状态信息中的临时冲突可能发生
  • 通常,默认值180000(毫秒)足以解决冲突
  • 如果您在SolrCloud中有数百或数千个小集合,您可能需要增加此值

zkClientTimeout

  • 可选参数,默认值:无
  • 连接到ZooKeeper服务器的超时
  • 与SolrCloud一起使用

zkHost

  • 可选参数,默认值:无
  • 在SolrCloud模式下,Solr应用于集群状态信息的ZooKeeper主机的URL

genericCoreNodeNames

  • 可选参数,默认值:无
  • 如果为true,节点名称不基于节点的地址,而是基于标识核心的通用名称
  • 当不同机器接管服务该核心时,事情将更容易理解

zkCredentialsProvider、zkACLProvider和zkCredentialsInjector

distributedClusterStateUpdates

  • 可选参数,默认值:无
  • 如果为true,SolrCloud的内部行为改变为不使用Overseer进行集合的state.json更新,而是直接对ZooKeeper进行此操作

minStateByteLenForCompression

  • 可选参数,默认值:-1
  • 启用通过网络和存储在ZooKeeper中的state.json压缩的可选参数
  • 提供的值是压缩state.json的最小字节长度,即任何超过该大小(以字节为单位)的state.json都将被压缩
  • 默认值为-1,意味着state.json始终未压缩

stateCompressor

  • 可选参数,默认值:org.apache.solr.common.util.ZLibCompressor
  • 为通过网络和存储在ZooKeeper中的state.json提供压缩实现的可选参数
  • 提供的值是用于状态压缩的类
  • 仅当minStateByteLenForCompression设置为-1以上的值时才使用

<logging>元素

class

  • 可选参数,默认值:无
  • 用于日志记录的类
  • 相应的JAR文件必须对Solr可用,可能通过solrconfig.xml中的<lib>指令

enabled

  • 可选参数,默认值:true
  • 是否启用日志记录

<logging><watcher>元素

size

  • 可选参数,默认值:50
  • 缓冲的日志事件数

threshold

  • 可选参数,默认值:无
  • 您的特定日志记录实现将记录的日志记录级别以上
  • 例如,使用Log4j时可能指定DEBUG、WARN、INFO等

<shardHandlerFactory>元素

Solr使用”分片处理器”发送和跟踪内部进行的节点间请求以处理分布式搜索或其他请求。通过<shardHandlerFactory>元素配置的工厂用于根据需要创建新的分片处理器。这里定义的工厂将在整个Solr中使用,除非被solrconfig.xml中特定的requestHandler覆盖。

有两种工厂实现可用,每种创建相应的分片处理器。默认的HttpShardHandlerFactory是大多数部署的最佳选择。但是,某些部署,特别是使用身份验证或具有大量分片集合的部署,可能受益于ParallelHttpShardHandlerFactory提供的额外并行化。

也支持自定义分片处理器,应在solr.xml中通过其完全限定的类名引用:

1
<shardHandlerFactory name="ShardHandlerFactory" class="qualified.class.name"/>

<shardHandlerFactory>的子元素在自定义分片处理器的情况下可能有所不同,但HttpShardHandlerFactoryParallelShardHandlerFactory都支持以下配置选项:

socketTimeout

  • 可选参数,默认值:见描述
  • 集群内查询和管理请求的读取超时
  • 默认值与<solrcloud>部分中指定的distribUpdateSoTimeout相同

connTimeout

  • 可选参数,默认值:见描述
  • 集群内查询和管理请求的连接超时
  • 默认为<solrcloud>部分中指定的distribUpdateConnTimeout

urlScheme

  • 可选参数,默认值:无
  • 在分布式搜索中使用的URL方案

maxConnectionsPerHost

  • 可选参数,默认值:100000
  • 每个主机允许的最大连接数

corePoolSize

  • 可选参数,默认值:0
  • 服务请求的线程池的初始核心大小

maximumPoolSize

  • 可选参数,默认值:无
  • 服务请求的线程池的最大大小
  • 默认是无限制

maxThreadIdleTime

  • 可选参数,默认值:5
  • 空闲线程在被终止之前在队列中持续的秒数

sizeOfQueue

  • 可选参数,默认值:无
  • 如果线程池使用后备队列,使用直接切换的最大大小
  • 默认使用SynchronousQueue

fairnessPolicy

  • 可选参数,默认值:false
  • 配置线程池是否偏向公平性而不是吞吐量的布尔值

replicaRouting

  • 可选参数,默认值:见描述
  • 指定副本路由偏好配置的NamedList
  • 可用于选择和配置副本路由偏好
  • default=true可用于设置默认基础副本路由偏好
  • 仅遵循正向默认状态断言;即default=false无效
  • 如果没有配置显式默认基础副本路由偏好,隐式默认将是random
1
2
3
4
5
6
7
8
9
<shardHandlerFactory class="HttpShardHandlerFactory">
<lst name="replicaRouting">
<lst name="stable">
<bool name="default">true</bool>
<str name="dividend">routingDividend</str>
<str name="hash">q</str>
</lst>
</lst>
</shardHandlerFactory>

副本路由也可以通过shards.preference请求参数在每个请求中指定(覆盖默认值)。如果请求包含dividendhashdividend优先用于路由。对于配置stable路由,hash参数隐式默认为主查询参数(即q)的字符串值的哈希。dividend参数必须明确配置;没有隐式默认值。如果只需要dividend路由,hash可以明确设置为空字符串,完全禁用隐式基于哈希的路由。

<replicaPlacementFactory>元素

可以在solr.xml中定义默认的副本放置插件。为了允许这样做,必须将solr.cluster.plugin.edit.enabled系统属性设置为false。此设置将禁用/cluster/plugins编辑API,防止在运行时修改集群插件。

1
2
3
4
<replicaPlacementFactory class="org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory">
<int name="minimalFreeDiskGB">10</int>
<int name="prioritizedFreeDiskGB">200</int>
</replicaPlacementFactory>

class属性应设置为扩展PlacementPluginFactory的类的FQN。子元素特定于实现。

<clusterSingleton>元素

可以在solr.xml中声明一个或多个clusterSingleton元素。为了允许这样做,必须将solr.cluster.plugin.edit.enabled系统属性设置为false。此设置将禁用/cluster/plugins编辑API,防止在运行时修改集群插件。

每个clusterSingleton元素指定一个应在Solr启动时加载的集群插件,以及其关联配置。

1
2
3
<clusterSingleton name="pluginName" class="qualified.plugin.class">
<int name="value1">20</int>
</clusterSingleton>

name属性是必需的,对每个clusterSingleton必须唯一。

class属性应设置为扩展ClusterSingleton的类的FQN。子元素特定于实现,这里的value1作为示例提供。

<metrics>元素

solr.xml中的<metrics>元素允许您自定义Solr报告的指标。您可以定义不应返回的系统属性,或定义自定义供应商和报告器。

如果您想为安装自定义指标,请参见指标配置部分。

<caches>元素

solr.xml中的<caches>元素支持定义和配置命名的节点级缓存。

这些缓存类似于solrconfig.xml中的用户定义缓存,除了每个命名缓存作为长期存在的单例存在于节点级别。这些节点级缓存可通过CoreContainer.getCache(String cacheName)从应用程序代码访问。

请注意,由于节点级缓存存在于单个核心的上下文之上,钩入核心/搜索器生命周期的配置参数(如autowarmCountregenerator)对节点级缓存是无关/忽略的。

1
2
3
4
5
6
7
8
<solr>
<caches>
<cache name="myNodeLevelUserCache"
class="solr.CaffeineCache"
size="4096"
initialSize="1024" />
</caches>
</solr>

在solr.xml中替换JVM系统属性

Solr支持在solr.xml中替换JVM系统属性值的变量,这允许在运行时指定各种配置选项。语法是${propertyname[:option default value]}。这允许定义可以在Solr启动时覆盖的默认值。如果未指定默认值,则必须在运行时指定属性,否则解析solr.xml文件时将生成错误。

通常使用-D标志启动JVM时指定的任何JVM系统属性都可以用作solr.xml文件中的变量。

例如,在下面显示的solr.xml文件中,socketTimeoutconnTimeout值各自设置为”60000”。但是,如果您使用bin/solr start -DsocketTimeout=1000启动Solr,HttpShardHandlerFactorysocketTimeout选项将使用1000ms的值覆盖,而connTimeout选项将继续使用”60000”的默认属性值。

1
2
3
4
5
6
<solr>
<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
<int name="socketTimeout">${socketTimeout:60000}</int>
<int name="connTimeout">${connTimeout:60000}</int>
</shardHandlerFactory>
</solr>

配置最佳实践

性能优化配置

  1. 线程池配置:根据硬件资源合理配置coreLoadThreadsreplayUpdatesThreads
  2. 缓存策略:利用shareSchema和节点级缓存优化内存使用
  3. 网络超时:根据网络环境调整各种超时设置

安全配置建议

  1. 隐藏敏感信息:配置hiddenSysPropshideStackTrace保护敏感信息
  2. 路径控制:谨慎配置allowPathsallowUrls限制访问范围
  3. ZooKeeper安全:在生产环境中配置ZooKeeper访问控制

集群配置优化

  1. 节点标识:使用genericCoreNodeNames简化节点管理
  2. 状态压缩:在大规模集群中启用状态压缩
  3. 分布式操作:根据需要启用分布式集群状态更新

故障排除

常见配置问题

  1. 启动失败:检查必需参数是否正确设置
  2. 性能问题:评估线程池和超时配置
  3. 连接问题:验证网络相关设置

监控和诊断

  1. 日志配置:合理配置日志级别和缓冲区大小
  2. 指标收集:启用和配置适当的指标报告
  3. 系统属性:使用变量替换机制进行动态配置

总结

solr.xml是Solr的核心配置文件,定义了影响整个Solr实例的全局设置。通过理解各个配置参数的作用和最佳实践,可以优化Solr的性能、安全性和可维护性。合理的配置不仅能提高系统效率,还能增强集群的稳定性和安全性。

在实际应用中,应根据具体的硬件环境、网络条件和业务需求调整相应的配置参数。同时,利用变量替换机制可以实现更灵活的配置管理,便于在不同环境间部署和维护Solr集群。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero