solr 數據同步,全量、增量方式
DIH全量同步(全表數據)(一般做第一次數據同步)
- 首先創建對應的數據庫表
- solr配置
- 將solr現有數據清空
cd /usr/local/solr/example/solr/collection1/data && rm -rf * && mkdir index && mkdir tlog
- 添加數據源配置(@)
vim /usr/local/solr/example/solr/collection1/conf/solrconfig.xml
添加配置信息:
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler> - 在同目錄下創建
data-config.xml
文件,并添加源信息(@)vim /usr/local/solr/example/solr/collection1/conf/data-config.xml
添加配置如下:
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mysolr" user="root" password="123456"/> <document> <entity name="user" transformer="DateFormatTransformer" query="SELECT id,name,price,url,last_modified FROM user WHERE id >= ${dataimporter.request.id}"> <field column="id" name="id"/> <field column="name" name="name"/> <field column="price" name="price"/> <field column="url" name="url"/> <filed column="last_modified" name="last_modified" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/> </entity> </document> </dataConfig>
- 添加數據同步所需依賴jar到tomcat中solr
cd /usr/local/solr/dist && cp solr-dataimporthandler-4.10.3.jar solr-dataimporthandler-extras-4.10.3.jar /usr/local/tomcat/webapps/solr/WEB-INF/lib/
同時把mysql驅動添加到
/usr/local/tomcat/webapps/solr/WEB-INF/lib/
中 - 將需要同步的數據庫表字段添加到schema.xml中,如果已存在,則無需
- 進行數據庫訪問授權操作,如果已授權則略過
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges;
- 時間同步,mysql數據源服務器時間跟solr服務器時間一致
date -s "2016-04-17 21:15:00"
設置時間 mysql數據源服務器時間一定大于等于solr服務器時間,否則solr檢測不到mysql時間變化了(認為是舊數據,增量同步來說) - 啟動tomcat即可。
- 瀏覽器訪問
http://ip:port/solr
,點擊Dataimport
,Command
選擇full-import
,Entity
選擇要同步的表,Custom Parameters
輸入data-config.xml
中需要的參數(${dataimport.request.id}
),點擊Execute
執行即可。
solr-HID全量.png
- 將solr現有數據清空
DIH增量同步(新增數據)(常用模式)
- 只需要對上面全量導入solr配置中帶有(@)標示的配置進行修改即可
- 添加數據源配置(@)
vim /usr/local/solr/example/solr/collection1/conf/solrconfig.xml
添加配置信息:
<requestHandler name="/deltaimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">delta-data-config.xml</str> </lst>
</requestHandler>
```
- 在同目錄下創建
delta-data-config.xml
文件,并添加源信息(@)vim /usr/local/solr/example/solr/collection1/conf/delta-data-config.xml
添加配置如下:
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mysolr" user="root" password="123456"/> <document> <entity name="user" pk="id" transformer="DateFormatTransformer" query="SELECT id,name,price,url,last_modified FROM user WHERE id >= ${dataimporter.request.id}" deltaImportQuery="SELECT * FROM user WHERE id = ${dih.delta.id}" deltaQuery="SELECT id FROM user where last_modified > '${dataimporter.last_index_time}' "> <field column="id" name="id"/> <field column="name" name="name"/> <field column="price" name="price"/> <field column="url" name="url"/> <filed column="last_modified" name="last_modified" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/> </entity> </document> </dataConfig> ```
id
一致solr_pk.png
last_modified
字段要在schema.xml
文件中配置,<field name="last_modified" type="date" indexed=true" stored="true"/>
query
: 首先查詢出所有滿足id > ${dataimporter.request.id}
的數據deltaQuery
: 從query
的數據中查詢所有last_modified
大于上一次同步${dataimporter.last_index_time}
時間的id
(即為需要增量同步的數據),該id = ${dih.delta.id}
deltaImportQuery
:根據deltaQuery
返回的id查找所有信息,為增量同步提供數據源${dih.delta.id}
: 記錄本次要索引的id
${dataimporter.last_index_time}
: 最后一次索引的時間,即上一次同步的時間注意:
last_modified
字段很重要,為增量同步提供數據變更依據,一定為時間類型,具體字段名可自定義,同時也要注意solr
服務器與mysql
服務器時間同步問題 - 配置完畢,啟動tomcat即可。
- 最后訪問,瀏覽器訪問
http://ip:port/solr
,點擊Dataimport
,Command
選擇full-import
,Entity
選擇要同步的表,Custom Parameters
輸入data-config.xml
中需要的參數(${dataimport.request.id}
),點擊Execute
執行即可。
solr-HID增量.png
全量、增量也可以同時配置。
備注
- 內存溢出
在使用 DIH 時,容易報內存溢出錯誤??梢酝ㄟ^設置 jvm 大小來解決。設置方法如下: 在tomcat\bin\catalina.sh 加入SET JAVA_OPTS=-Xms128m -Xmx1024m 配置 這里設置的是1024M,根據情況可以適量增大 ```
- 手動全量、增量操作
可以通過solr管控臺操作,也可以直接在瀏覽器輸入鏈接直接操作
http://192.168.58.144:8080/solr/collection1/dataimport?command=full-import&commit=ture
增量導入:
http://192.168.58.144:8080/solr/collection1/deltaimport?command=delta-import&clean=false&commit=ture
查看導入狀態
http://192.168.58.144:8080/solr/collection1/dataimport?command=status - 定時增量同步(全量不支持定時同步--沒必要)
-
Solr
官方提供了很強大的Data Import Request Handle
- 將
apache-solr-dataimportscheduler-1.0.jar
拷貝到/usr/local/tomcat/lib/
目錄下 - 修改
solr.war
中的web.xml
文件cd /usr/local/tomcat/webapps/solr/WEB-INF/web.xml
添加以下配置信息:
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener> - 在
tomcat
的solr.war
中web.xml
配置的solr.home
下創建conf
文件夾,并新建文件dataimport.properties
,配置定時任務依賴信息
solr-tomcat配置目錄.pngcd /usr/local/solr/example/solr && mkdir conf && cd conf && vim dataimport.properties
dataimport.properties
文件信息如下:# dataimport.properties example # # From this example, copy everything bellow "dataimport scheduler properties" to your # dataimport.properties file and then change params to fit your needs # # IMPORTANT: # Regardless of whether you have single or multiple-core Solr, # use dataimport.properties located in your solr.home/conf (NOT solr.home/core/conf) # For more info and context see here: # http://wiki.apache.org/solr/DataImportHandler#dataimport.properties_example #Tue Jul 21 12:10:50 CEST 2010 last_index_time=2016-04-19 15\:28\:37 user.last_index_time=2016-04-19 15\:28\:37 ################################################# # # # dataimport scheduler properties # # # ################################################# # # http://192.168.58.144:8080/solr/collection1/deltaimport?command=delta-import&clean=false&commit=ture # 以下參數對應參數 # http://server:port/webapp/syncCores/params # # to sync or not to sync # 1 - active; anything else - inactive syncEnabled=1 # # which cores to schedule # in a multi-core environment you can decide which cores you want syncronized # leave empty or comment it out if using single-core deployment syncCores=collection1 # # solr server name or IP address # [defaults to localhost if empty] server=localhost # # solr server port # [defaults to 80 if empty] port=8080 # # application name/context # [defaults to current ServletContextListener's context (app) name] webapp=solr # # URL params [mandatory] # remainder of URL #增量url params=/deltaimport?command=delta-import&clean=false&commit=ture # # schedule interval # number of minutes between two runs # [defaults to 30 if empty] # 定時更新間隔時間,單位分鐘 interval=1
-
- 配置完畢,啟動tomcat即可。
定時增量備注: 如果想支持定時重做索引,只需要將上面引入的jar更換為solr-dataimportscheduler-1.1.jar
,在dataimport.properties
中添加三行配置即可,實質就是全量同步。
# 重做索引的時間間隔,單位分鐘,默認7200,即5天;
# 為空,為0,或者注釋掉:表示永不重做索引
reBuildIndexInterval=1
#
# 重做索引的參數
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
#
# 重做索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 兩種格式:2016-04-19 05:00:00 或者 05:00:00,后一種會自動補全日期部分為服務啟動時的日期
reBuildIndexBeginTime=05:00:00
相關文件如下:
[solr-dataimportscheduler-1.1](C:\Users\ljdo\Desktop\筆記\file\solr\solr-dataimportscheduler-1.1.jar)
[solr-dataimportscheduler-1.1-source](C:\Users\ljdo\Desktop\筆記\file\solr\solr-dataimportscheduler-1.1-source.zip)
[dataimport.properties.zip](C:\Users\ljdo\Desktop\筆記\file\solr\dataimport.properties.zip)
[apache-solr-dataimportscheduler-1.0](http://solr-dataimport-scheduler.googlecode.com/files/apache-solr-dataimportscheduler-1.0.jar)
[apache-solr-dataimportscheduler-1.0-with-source](http://solr-dataimport-scheduler.googlecode.com/files/apache-solr-dataimportscheduler-1.0-with-source.jar)
作者:逐暗者 *(轉載請注明出處)*