Solr公共读写调优建议
操作场景
该操作指导MRS集群管理员对Solr可进行的公共读写性能调优。
前提步骤
已安装Solr服务的客户端。
操作步骤
当Solr索引数据存放在本地磁盘或者HDFS时,可以从以下几个方面进行调优配置:
- Schema的配置优化
- uniqueKey定义为long类型
- long类型的查询性能优于string类型,如果需要定义为string类型,可以在业务层建立long到string的映射。
- 建议unqiueKey字段配置required="true"。
- 建议uniqueKey字段配置docValues="true"。
- 为了获得更好的查询性能,建议查询时显式地指定返回字段为uniqueKey字段。
- 需要排序、统计的字段配置为docValues="true",可以有效节省内存使用
配置docValues="true"后,不需要再配置stored="true"
- uniqueKey定义为long类型
- 优化索引方案
可以通过修改“solrconfig.xml”文件内容来实现以下调优效果。
调优配置项
修改结果
提高索引速度,加大索引线程数
<maxIndexingThreads>${solr.maxIndexingThreads:16}</maxIndexingThreads>
增大文档索引缓存
<ramBufferSizeMB>1024</ramBufferSizeMB>
增大索引段合并因子
<mergeFactor>20</mergeFactor>
加大索引自动硬提交时间
<maxTime>${solr.autoCommit.maxTime:30000}</maxTime>
增大索引的自动软提交时间
<maxTime>${solr.autoSoftCommit.maxTime:60000}</maxTime>
基于docValues获取uniqueKey的值
<useDocValueGetField>true</useDocValueGetField>
对docId进行排序,优先顺序读取磁盘
<sortDocIdBeforeGetDoc>true</sortDocIdBeforeGetDoc>
缓存docId,避免二次读取磁盘
<useQuickFirstMatch>true</useQuickFirstMatch>
useDocValueGetField的使用场景:- 返回字段(fl)为uniqueKey
- uniqueKey为Numberic类型(long/int/float/double)
- uniqueKey配置docValues=true
useQuickFirstMatch的使用场景:
- 索引入库后不再更改(删除/合并操作等)
- 优化查询方案
缓存在Solr中充当了一个非常重要的角色,Solr中主要包括以下3种缓存:
- Filter cache(过滤器缓存),用于保存过滤器(fq参数)和层面搜索的结果;
- Document cache(文档缓存),用于保存lucene文档存储的字段;
- Query result(查询缓存),用于保存查询的结果。
Solr中还包含lucene内部缓存,该缓存用户无法调控。
通过调整这3种缓存,可以对Solr的搜索实例进行调优。在调整参数前,需要事先得到Solr实例中的以下信息:
- 索引中的文档数量:登录Manager,选择“集群 > 待操作集群的名称 > 服务 > Solr”,在“Solr WebUI”下单击任意“SolrServerAdmin(XX)”进入Solr Admin页面。在“Core Selector”中选择索引数据集Collection下的任意一个core,单击“Query > Execute Query”,“numFound”项为该参数值;
- 过滤器的数量:用户期望值(如:200);
- 一次查询返回最大的文档数量:用户期望值(如:100);
- 不同查询和不同排序的个数:用户期望值(如:500);
- 每次查询字段数:用户期望值(如:3);
- 实例查询的并发数:用户期望值(如:10)。
可以通过修改“solrconfig.xml”文件内容(修改方法参考3)配置缓存:
缓存类型
修改方案
过滤器缓存
<filterCache class="solr.FastLRUCache" size="200" initialSize="200" autowarmCount="50"/>
- “size”和“initialSize”值为缓存document id的数量。
- “autowarmCount”为“initialSize”值的1/4。
- 根据实际场景合理设置,过大会占用大量内存。
查询结果缓存
<queryResultCache class="solr.FastLRUCache" size="3000" initialSize="3000" autowarmCount="750"/>
- “size”和“initialSize”的值 = 不同查询和不同排序的个数×每次查询字段数×2。
- “autowarmCount”值为“initialSize”值的1/4。
文档缓存
<documentCache class="solr.FastLRUCache" size="1000" initialSize="1000"/>
“size”和“initialSize”的值 = 一次查询返回最大的文档数量×实例查询的并发数。