更新时间:2024-11-29 GMT+08:00

Solr公共读写调优建议

操作场景

该操作指导MRS集群管理员对Solr可进行的公共读写性能调优。

前提步骤

已安装Solr服务的客户端。

操作步骤

当Solr索引数据存放在本地磁盘或者HDFS时,可以从以下几个方面进行调优配置:

Solr作为全文检索服务器时,从Solr自身相关配置(JVM、Schema、Solrconfig)方面进行调优。
  1. Schema的配置优化
    • uniqueKey定义为long类型
      • long类型的查询性能优于string类型,如果需要定义为string类型,可以在业务层建立long到string的映射。
      • 建议unqiueKey字段配置required="true"。
      • 建议uniqueKey字段配置docValues="true"。
      • 为了获得更好的查询性能,建议查询时显式地指定返回字段为uniqueKey字段。
    • 需要排序、统计的字段配置为docValues="true",可以有效节省内存使用

      配置docValues="true"后,不需要再配置stored="true"

  2. 优化索引方案
    可以通过修改“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的使用场景:

    • 索引入库后不再更改(删除/合并操作等)
  3. 优化查询方案
    缓存在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”的值 = 一次查询返回最大的文档数量×实例查询的并发数