Solr优化

1:Commit和SoftCommit

Commit,硬提交,Solr和Lucene原本存在的commit方式,负责把索引内容刷入磁盘。需要重新打开searcher,    Solr/Lucene才会对这部分内容可见可查,但是这样比较费性能。


SoftCommit,软提交,这是Solr新增的commit方式,Lucene没有。软提交负责将索引内容在内存中生成segment,
    并使得索引内容对Solr可见可查,该提交方式是Commit的改善方式,保证了Solr的实时性同时又兼顾了性能。
    在进行softcommit过程中需要进行预热(即将现在状态的searcher复制到新的searcher中,保证了旧的softcommit
    数据不丢失),虽然没有重新打开searcher那么费性能,但是预热频率过快还是会影响solr的性能。
    
    在solrconfig.xml中可以配置自动硬提交和自动软提交
    <!-硬提交->
    <autoCommit>
        <maxDocs>1000</maxDocs>
        <maxTime>15000</maxTime>
        <openSearcher>true</openSearcher>
    </autoCommit>

    <!-软提交->
    <autoSoftCommit>
        <maxTime>1000</maxTime>
    </autoSoftCommit>

    maxDocs:当内存索引数量达到指定值的时候,将内存的索引DUMP(转储)到硬盘中,并通知searcher类加载新的索引。
    
    maxTime:每隔指定的时间段,自动的COMMIT内存中的索引数据,并通知Searcher类加载新的索引。
    
    最后openSearcher配置表示进行autocommit时候是否重新打开searcher,如果autocommit频繁又将
    openSearcher设置为true,那么solr的性能压力会非常大。
    
    一般会将autocommit的maxTime和maxDocs设的相对大点,对应的softcommit的maxTime设置小点,
    这样即保证了性能又保证了实时性,当然具体的值需要根据索引的频率以及document的大小综合考虑
    
    以上两种方式,以最先达到条件执行为准。

    
    通常是1-10分钟自动触发硬提交,每秒钟自动触发软提交

java 代码实现软硬提交

软提交:内存中

solrServer.commit(true,true,true);

//用户也可以在solr  web界面查询到。只是数据内存中。

如果solr停止或者是宕机的时候数据会不会丢失?

解答:不会。

解释:在执行软提交的时候同时会有日志文件的生成,并且默认的软提交之后的15秒钟中后会执行一次flush就是硬提交。

当再次重启solr服务的时候就会实现logs日志的读取,数据就会回复。

除非你的日志文件删除了,才会有数据的丢失。

扫描二维码关注公众号,回复: 834352 查看本文章

硬提交:flush到也能硬盘中

   
    注意:
    1.Solr的softCommit是Write-ahead Logging的,所以不必担心softCommit的数据会丢失。Log数据就在$solrHome/collection/data/tlog/下。
    2.solr关闭时会进行一次hard commit,所以不必担心关闭时(或kill process)softCommit数据会丢失。
        kill -9时数据也不会丢失,因为这些数据都会记录在tlog目录下面的日志里面,当solr重启之后就会加载日志中的数据。
        除非把日志文件删掉,数据才会丢失。
    
    
    
    
    

2:索引字段(indexed)和存储字段(stored)

2.1将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false(例如:copyfield字段)---就是这些字段只建立索引不存储,例如: text
2.2将不需要被用于搜索的,而只是作为结果返回的field的indexed属性设置为false  (这些字段不需要建立搜索,只需要作为结果返回)
2.3删除所有不必要的copyField声明(不删会对服务器性能造成压力)

3:optimize

3.1在同样没有缓存的情况下,一个没有经过优化的索引的性能会比经过优化的索引的性能少10%

3.2优化的时候,会将所有的索引段合并成为一个索引段,所以,优化这个操作其实可以帮助避免“too many files”这个问题,这个错误是由文件系统抛出的。

下图:不同的索引段


3.3在索引阶段,不进行索引优化能够接受的话,就不进行索引优化optimize(),这是一个很耗时的操作,但是在查询阶段。(如何可以查询,不要进行索引优化)

优化往往能够大幅度提高查询效率,所以可以考虑周期性的优化。

    http://localhost:8983/solr/collection1/update?optimize=true&waitFlush=true&wt=json把他写入一个shell脚本定时执行。

或者:SolrServer.optimize();索引优化代码



4:OutOfMemoryErrors

    如果你的solr实例没有被指定足够多的内存的话,java virtual machine也许会抛outof memoryError。
    通过solr start -m 1g 设置jvm内存,使用solr start命令启动的时候JVM内存默认是512M

    ( java -Xms512m -Xmx512m -jar start.jar) 解释:初始化内存的数量何用最大内存的数量保持一致。

在这solr web界面中可以看见。

5:使用主从结构实现负载均衡和提高应用的健壮性

6:把solr和应用部署在同一台服务器上(省去网络通信)

7:使用尽可能高的Log输出等级,减少日志量。(默认的是比较高的等级)目的:减少日志的输出量,减少系统的压力,提高solr运行的能力,debug 模式改为error或者是其他的模式。在solr web 界面更改。






猜你喜欢

转载自blog.csdn.net/weixin_39915358/article/details/80278574