优化solr全量建索引
主要优化从数据库取数据这一块。
先简单为读取某个单表数据:该表数据很多娄,数据库为MySQL。
旧的建索引设计:
之前的设计是分段读取数据,可以按自增主键分段或者按记录更新的时间截分段取。但由于数据模型是可增删改查,这种更新会导致按自增id的数据在有些地方比较稀疏,而按记录的更新时间截,也有可能在某个时间段里更新大量数据,所以也会有不同时间段数据过稀或者过密的情况,这种情况导致分段取数据调控不方便。。
所以一直以来solr的更新瓶颈一直是在读取数据那一块,因为是取数据跟发送数据多线程进行,实践得出花费的时间更多是在等待读取源。所以如果可以提高读取数据源的效率,那么索引时间可以缩短不少时间。
新的建索引设计 :
现在使用另一种方式读取数据源:
1)首先将远程的某个表数据写入到文件data.txt,字段以一定特殊符号间隔,方便分析,每行一条记录
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左右。
http://write.blog.csdn.net/postedit/7690984