優化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左右。