优化solr全量建索引,减小索引时间

优化solr全量建索引 sql

主要优化从数据库取数据这一块。 数据库


先简单为读取某个单表数据:该表数据不少娄,数据库为MySQL。 多线程

旧的建索引设计: 测试

以前的设计是分段读取数据,能够按自增主键分段或者按记录更新的时间截分段取。但因为数据模型是可增删改查,这种更新会致使按自增id的数据在有些地方比较稀疏,而按记录的更新时间截,也有可能在某个时间段里更新大量数据,因此也会有不一样时间段数据过稀或者过密的状况,这种状况致使分段取数据调控不方便。。 优化


因此一直以来solr的更新瓶颈一直是在读取数据那一块,由于是取数据跟发送数据多线程进行,实践得出花费的时间更可能是在等待读取源。因此若是能够提升读取数据源的效率,那么索引时间能够缩短很多时间。 线程



新的建索引设计 : 设计

如今使用另外一种方式读取数据源: 索引


1)首先将远程的某个表数据写入到文件data.txt,字段以必定特殊符号间隔,方便分析,每行一条记录 get


2)将远程文件data.txt同步到本地机器,并处理掉某些特殊符号影响解析。 同步

        a)这里要注意文件的一些特殊符号,致使分析失败。好比字段里包含有换行符或者分隔符。

         b)dump整个表数据到文件很快,记得写2g大小(300万)的数据,消耗30秒左右.

        c)使用linunx的rsync脚本拷贝远程文件到本地,同步时间100秒左右。

3)解析本地数据文件data.txt,并批量提交给solr

           a) 脚本程序要配置的dump 使用sql语句的字段,因此这里可使用对应的sql(取字段名列表),获取该sql拿到的字段列表。有严格的顺序对应。

             b)以一样的顺序解析数据存到map.

             c)业务逻辑处理记录,封装数据包批量提交solr


4) solr提交的方式的优化:(主要是索引脚本跟solr服务在同一台机)

        a) solr 服务使用多core协助,一写core_w一读core_r

       b)使用EmbeddedSolrServer嵌入式提交给本地solr服务core_w。

       c)提交完数据后,发送命令切换solr的两个core.将core_w与core_r互换

       d)同步索引,将新的core_r的索引数据同步给其它子机的core_r



测试事后发现EmbeddedSolrServer这种方式提升不了多少速度。因此仍是能够采用http方式提交。

不过采用了读取本地文件这种建索引方式,能够提升很多速度,时间只须要原先的1/3左右。

相关文章
相关标签/搜索