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 | <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 | <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_HOME
或coreRootDir
的文件夹 - 如果您需要在这些路径之外创建核心,您可以使用
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
- 可选参数,默认值:无
- 如果您使用ZooKeeper访问控制,可以指定的可选参数
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>
的子元素在自定义分片处理器的情况下可能有所不同,但HttpShardHandlerFactory
和ParallelShardHandlerFactory
都支持以下配置选项:
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 | <shardHandlerFactory class="HttpShardHandlerFactory"> |
副本路由也可以通过shards.preference
请求参数在每个请求中指定(覆盖默认值)。如果请求包含dividend
和hash
,dividend
优先用于路由。对于配置stable
路由,hash
参数隐式默认为主查询参数(即q
)的字符串值的哈希。dividend
参数必须明确配置;没有隐式默认值。如果只需要dividend
路由,hash
可以明确设置为空字符串,完全禁用隐式基于哈希的路由。
<replicaPlacementFactory>元素
可以在solr.xml
中定义默认的副本放置插件。为了允许这样做,必须将solr.cluster.plugin.edit.enabled
系统属性设置为false。此设置将禁用/cluster/plugins
编辑API,防止在运行时修改集群插件。
1 | <replicaPlacementFactory class="org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory"> |
class
属性应设置为扩展PlacementPluginFactory
的类的FQN。子元素特定于实现。
<clusterSingleton>元素
可以在solr.xml
中声明一个或多个clusterSingleton
元素。为了允许这样做,必须将solr.cluster.plugin.edit.enabled
系统属性设置为false。此设置将禁用/cluster/plugins
编辑API,防止在运行时修改集群插件。
每个clusterSingleton
元素指定一个应在Solr启动时加载的集群插件,以及其关联配置。
1 | <clusterSingleton name="pluginName" class="qualified.plugin.class"> |
name
属性是必需的,对每个clusterSingleton
必须唯一。
class
属性应设置为扩展ClusterSingleton
的类的FQN。子元素特定于实现,这里的value1
作为示例提供。
<metrics>元素
solr.xml
中的<metrics>
元素允许您自定义Solr报告的指标。您可以定义不应返回的系统属性,或定义自定义供应商和报告器。
如果您想为安装自定义指标,请参见指标配置部分。
<caches>元素
solr.xml
中的<caches>
元素支持定义和配置命名的节点级缓存。
这些缓存类似于solrconfig.xml
中的用户定义缓存,除了每个命名缓存作为长期存在的单例存在于节点级别。这些节点级缓存可通过CoreContainer.getCache(String cacheName)
从应用程序代码访问。
请注意,由于节点级缓存存在于单个核心的上下文之上,钩入核心/搜索器生命周期的配置参数(如autowarmCount
和regenerator
)对节点级缓存是无关/忽略的。
1 | <solr> |
在solr.xml中替换JVM系统属性
Solr支持在solr.xml
中替换JVM系统属性值的变量,这允许在运行时指定各种配置选项。语法是${propertyname[:option default value]}
。这允许定义可以在Solr启动时覆盖的默认值。如果未指定默认值,则必须在运行时指定属性,否则解析solr.xml
文件时将生成错误。
通常使用-D
标志启动JVM时指定的任何JVM系统属性都可以用作solr.xml
文件中的变量。
例如,在下面显示的solr.xml
文件中,socketTimeout
和connTimeout
值各自设置为”60000”。但是,如果您使用bin/solr start -DsocketTimeout=1000
启动Solr,HttpShardHandlerFactory
的socketTimeout
选项将使用1000ms的值覆盖,而connTimeout
选项将继续使用”60000”的默认属性值。
1 | <solr> |
配置最佳实践
性能优化配置
- 线程池配置:根据硬件资源合理配置
coreLoadThreads
和replayUpdatesThreads
- 缓存策略:利用
shareSchema
和节点级缓存优化内存使用 - 网络超时:根据网络环境调整各种超时设置
安全配置建议
- 隐藏敏感信息:配置
hiddenSysProps
和hideStackTrace
保护敏感信息 - 路径控制:谨慎配置
allowPaths
和allowUrls
限制访问范围 - ZooKeeper安全:在生产环境中配置ZooKeeper访问控制
集群配置优化
- 节点标识:使用
genericCoreNodeNames
简化节点管理 - 状态压缩:在大规模集群中启用状态压缩
- 分布式操作:根据需要启用分布式集群状态更新
故障排除
常见配置问题
- 启动失败:检查必需参数是否正确设置
- 性能问题:评估线程池和超时配置
- 连接问题:验证网络相关设置
监控和诊断
- 日志配置:合理配置日志级别和缓冲区大小
- 指标收集:启用和配置适当的指标报告
- 系统属性:使用变量替换机制进行动态配置
总结
solr.xml
是Solr的核心配置文件,定义了影响整个Solr实例的全局设置。通过理解各个配置参数的作用和最佳实践,可以优化Solr的性能、安全性和可维护性。合理的配置不仅能提高系统效率,还能增强集群的稳定性和安全性。
在实际应用中,应根据具体的硬件环境、网络条件和业务需求调整相应的配置参数。同时,利用变量替换机制可以实现更灵活的配置管理,便于在不同环境间部署和维护Solr集群。